190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
2f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
4f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Use of this source code is governed by a BSD-style license
5f71323e297a928af368937089d3ed71239786f86Andreas Huber *  that can be found in the LICENSE file in the root of the source
6f71323e297a928af368937089d3ed71239786f86Andreas Huber *  tree. An additional intellectual property rights grant can be found
7f71323e297a928af368937089d3ed71239786f86Andreas Huber *  in the file PATENTS.  All contributing project authors may
8f71323e297a928af368937089d3ed71239786f86Andreas Huber *  be found in the AUTHORS file in the root of the source tree.
990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_ports/config.h"
1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_scale/yv12config.h"
1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "postproc.h"
1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_scale/yv12extend.h"
1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_scale/vpxscale.h"
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "systemdependent.h"
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <math.h>
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <stdlib.h>
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <stdio.h>
22538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
23538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define RGB_TO_YUV(t)                                                                       \
24538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    ( (0.257*(float)(t>>16)) + (0.504*(float)(t>>8&0xff)) + (0.098*(float)(t&0xff)) + 16),  \
25538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    (-(0.148*(float)(t>>16)) - (0.291*(float)(t>>8&0xff)) + (0.439*(float)(t&0xff)) + 128), \
26538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    ( (0.439*(float)(t>>16)) - (0.368*(float)(t>>8&0xff)) - (0.071*(float)(t&0xff)) + 128)
27538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
28538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* global constants */
2979f15823c34ae1e423108295e416213200bb280fAndreas Huber#if CONFIG_POSTPROC_VISUALIZER
30538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic const unsigned char MB_PREDICTION_MODE_colors[MB_MODE_COUNT][3] =
31538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
32538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0x98FB98) },   /* PaleGreen */
33538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0x00FF00) },   /* Green */
34538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0xADFF2F) },   /* GreenYellow */
35538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0x228B22) },   /* ForestGreen */
36538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0x006400) },   /* DarkGreen */
37538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0x98F5FF) },   /* Cadet Blue */
38538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0x6CA6CD) },   /* Sky Blue */
39538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0x00008B) },   /* Dark blue */
40538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0x551A8B) },   /* Purple */
41538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0xFF0000) }    /* Red */
42538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber};
43538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
44538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic const unsigned char B_PREDICTION_MODE_colors[B_MODE_COUNT][3] =
45538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
46538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0x6633ff) },   /* Purple */
47538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0xcc33ff) },   /* Magenta */
48538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0xff33cc) },   /* Pink */
49538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0xff3366) },   /* Coral */
50538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0x3366ff) },   /* Blue */
51538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0xed00f5) },   /* Dark Blue */
52538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0x2e00b8) },   /* Dark Purple */
53538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0xff6633) },   /* Orange */
54538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0x33ccff) },   /* Light Blue */
55538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0x8ab800) },   /* Green */
56538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0xffcc33) },   /* Light Orange */
57538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0x33ffcc) },   /* Aqua */
58538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0x66ff33) },   /* Light Green */
59538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0xccff33) },   /* Yellow */
60538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber};
61538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
6279f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic const unsigned char MV_REFERENCE_FRAME_colors[MAX_REF_FRAMES][3] =
63538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
64538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0x00ff00) },   /* Blue */
65538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0x0000ff) },   /* Green */
66538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0xffff00) },   /* Yellow */
67538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { RGB_TO_YUV(0xff0000) },   /* Red */
68538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber};
6979f15823c34ae1e423108295e416213200bb280fAndreas Huber#endif
7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic const short kernel5[] =
7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    1, 1, 4, 1, 1
7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberconst short vp8_rv[] =
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    8, 5, 2, 2, 8, 12, 4, 9, 8, 3,
7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    0, 3, 9, 0, 0, 0, 8, 3, 14, 4,
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    10, 1, 11, 14, 1, 14, 9, 6, 12, 11,
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    8, 6, 10, 0, 0, 8, 9, 0, 3, 14,
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    8, 11, 13, 4, 2, 9, 0, 3, 9, 6,
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    1, 2, 3, 14, 13, 1, 8, 2, 9, 7,
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    3, 3, 1, 13, 13, 6, 6, 5, 2, 7,
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    11, 9, 11, 8, 7, 3, 2, 0, 13, 13,
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    14, 4, 12, 5, 12, 10, 8, 10, 13, 10,
8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    4, 14, 4, 10, 0, 8, 11, 1, 13, 7,
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    7, 14, 6, 14, 13, 2, 13, 5, 4, 4,
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    0, 10, 0, 5, 13, 2, 12, 7, 11, 13,
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    8, 0, 4, 10, 7, 2, 7, 2, 2, 5,
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    3, 4, 7, 3, 3, 14, 14, 5, 9, 13,
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    3, 14, 3, 6, 3, 0, 11, 8, 13, 1,
9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    13, 1, 12, 0, 10, 9, 7, 6, 2, 8,
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    5, 2, 13, 7, 1, 13, 14, 7, 6, 7,
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    9, 6, 10, 11, 7, 8, 7, 5, 14, 8,
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    4, 4, 0, 8, 7, 10, 0, 8, 14, 11,
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    3, 12, 5, 7, 14, 3, 14, 5, 2, 6,
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    11, 12, 12, 8, 0, 11, 13, 1, 2, 0,
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    5, 10, 14, 7, 8, 0, 4, 11, 0, 8,
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    0, 3, 10, 5, 8, 0, 11, 6, 7, 8,
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    10, 7, 13, 9, 2, 5, 1, 5, 10, 2,
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    4, 3, 5, 6, 10, 8, 9, 4, 11, 14,
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    0, 10, 0, 5, 13, 2, 12, 7, 11, 13,
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    8, 0, 4, 10, 7, 2, 7, 2, 2, 5,
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    3, 4, 7, 3, 3, 14, 14, 5, 9, 13,
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    3, 14, 3, 6, 3, 0, 11, 8, 13, 1,
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    13, 1, 12, 0, 10, 9, 7, 6, 2, 8,
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    5, 2, 13, 7, 1, 13, 14, 7, 6, 7,
10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    9, 6, 10, 11, 7, 8, 7, 5, 14, 8,
11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    4, 4, 0, 8, 7, 10, 0, 8, 14, 11,
11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    3, 12, 5, 7, 14, 3, 14, 5, 2, 6,
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    11, 12, 12, 8, 0, 11, 13, 1, 2, 0,
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    5, 10, 14, 7, 8, 0, 4, 11, 0, 8,
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    0, 3, 10, 5, 8, 0, 11, 6, 7, 8,
11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    10, 7, 13, 9, 2, 5, 1, 5, 10, 2,
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    4, 3, 5, 6, 10, 8, 9, 4, 11, 14,
11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    3, 8, 3, 7, 8, 5, 11, 4, 12, 3,
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    11, 9, 14, 8, 14, 13, 4, 3, 1, 2,
11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    14, 6, 5, 4, 4, 11, 4, 6, 2, 1,
12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    5, 8, 8, 12, 13, 5, 14, 10, 12, 13,
12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    0, 9, 5, 5, 11, 10, 13, 9, 10, 13,
12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern void vp8_blit_text(const char *msg, unsigned char *address, const int pitch);
126538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberextern void vp8_blit_line(int x0, int x1, int y0, int y1, unsigned char *image, const int pitch);
12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/***********************************************************************************************************
12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_post_proc_down_and_across_c
13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *src_ptr,
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *dst_ptr,
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int src_pixels_per_line,
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int dst_pixels_per_line,
13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int rows,
13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int cols,
13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int flimit
13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber)
13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *p_src, *p_dst;
14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int row;
14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int col;
14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i;
14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int v;
14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int pitch = src_pixels_per_line;
14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char d[8];
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void)dst_pixels_per_line;
14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (row = 0; row < rows; row++)
15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
151538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        /* post_proc_down for one row */
15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        p_src = src_ptr;
15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        p_dst = dst_ptr;
15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (col = 0; col < cols; col++)
15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int kernel = 4;
15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int v = p_src[col];
16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            for (i = -2; i <= 2; i++)
16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (abs(v - p_src[col+i*pitch]) > flimit)
16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    goto down_skip_convolve;
16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                kernel += kernel5[2+i] * p_src[col+i*pitch];
16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            v = (kernel >> 3);
17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        down_skip_convolve:
17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            p_dst[col] = v;
17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
174538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        /* now post_proc_across */
17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        p_src = dst_ptr;
17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        p_dst = dst_ptr;
17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (i = 0; i < 8; i++)
17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            d[i] = p_src[i];
18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (col = 0; col < cols; col++)
18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int kernel = 4;
18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            v = p_src[col];
18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            d[col&7] = v;
18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            for (i = -2; i <= 2; i++)
18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (abs(v - p_src[col+i]) > flimit)
19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    goto across_skip_convolve;
19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                kernel += kernel5[2+i] * p_src[col+i];
19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            d[col&7] = (kernel >> 3);
19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        across_skip_convolve:
19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (col >= 2)
20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                p_dst[col-2] = d[(col-2)&7];
20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
203538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        /* handle the last two pixels */
20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        p_dst[col-2] = d[(col-2)&7];
20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        p_dst[col-1] = d[(col-1)&7];
20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
208538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        /* next row */
20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        src_ptr += pitch;
21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst_ptr += pitch;
21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21479f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic int q2mbl(int x)
21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (x < 20) x = 20;
21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    x = 50 + (x - 50) * 10 / 8;
21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return x * x / 3;
22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_mbpost_proc_across_ip_c(unsigned char *src, int pitch, int rows, int cols, int flimit)
22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int r, c, i;
22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *s = src;
22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char d[16];
22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (r = 0; r < rows; r++)
23090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int sumsq = 0;
23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int sum   = 0;
23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (i = -8; i <= 6; i++)
23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            sumsq += s[i] * s[i];
23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            sum   += s[i];
23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            d[i+8] = 0;
23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
24090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (c = 0; c < cols + 8; c++)
24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int x = s[c+7] - s[c-8];
24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int y = s[c+7] + s[c-8];
24590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            sum  += x;
24790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            sumsq += x * y;
24890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            d[c&15] = s[c];
25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (sumsq * 15 - sum * sum < flimit)
25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                d[c&15] = (8 + sum + s[c]) >> 4;
25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
25590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            s[c-8] = d[(c-8)&15];
25790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        s += pitch;
26090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
26290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_mbpost_proc_down_c(unsigned char *dst, int pitch, int rows, int cols, int flimit)
26890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
26990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int r, c, i;
27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const short *rv3 = &vp8_rv[63&rand()];
27190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (c = 0; c < cols; c++)
27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char *s = &dst[c];
27590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int sumsq = 0;
27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int sum   = 0;
27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char d[16];
27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        const short *rv2 = rv3 + ((c * 17) & 127);
27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (i = -8; i <= 6; i++)
28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            sumsq += s[i*pitch] * s[i*pitch];
28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            sum   += s[i*pitch];
28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (r = 0; r < rows + 8; r++)
28790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            sumsq += s[7*pitch] * s[ 7*pitch] - s[-8*pitch] * s[-8*pitch];
28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            sum  += s[7*pitch] - s[-8*pitch];
29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            d[r&15] = s[0];
29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (sumsq * 15 - sum * sum < flimit)
29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
29490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                d[r&15] = (rv2[r&127] + sum + s[0]) >> 4;
29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            s[-8*pitch] = d[(r-8)&15];
29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            s += pitch;
29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
30290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void vp8_deblock_and_de_macro_block(YV12_BUFFER_CONFIG         *source,
30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        YV12_BUFFER_CONFIG         *post,
30690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int                         q,
30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int                         low_var_thresh,
30890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int                         flag,
30990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_postproc_rtcd_vtable_t *rtcd)
31090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    double level = 6.0e-05 * q * q * q - .0067 * q * q + .306 * q + .0065;
31290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int ppl = (int)(level + .5);
31390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) low_var_thresh;
31490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) flag;
31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
31690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    POSTPROC_INVOKE(rtcd, downacross)(source->y_buffer, post->y_buffer, source->y_stride,  post->y_stride, source->y_height, source->y_width,  ppl);
31779f15823c34ae1e423108295e416213200bb280fAndreas Huber    POSTPROC_INVOKE(rtcd, across)(post->y_buffer, post->y_stride, post->y_height, post->y_width, q2mbl(q));
31879f15823c34ae1e423108295e416213200bb280fAndreas Huber    POSTPROC_INVOKE(rtcd, down)(post->y_buffer, post->y_stride, post->y_height, post->y_width, q2mbl(q));
31990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
32090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    POSTPROC_INVOKE(rtcd, downacross)(source->u_buffer, post->u_buffer, source->uv_stride, post->uv_stride, source->uv_height, source->uv_width, ppl);
32190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    POSTPROC_INVOKE(rtcd, downacross)(source->v_buffer, post->v_buffer, source->uv_stride, post->uv_stride, source->uv_height, source->uv_width, ppl);
32290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
32390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
32490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
325f71323e297a928af368937089d3ed71239786f86Andreas Hubervoid vp8_deblock(YV12_BUFFER_CONFIG         *source,
32690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        YV12_BUFFER_CONFIG         *post,
32790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        int                         q,
32890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        int                         low_var_thresh,
32990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        int                         flag,
33090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        vp8_postproc_rtcd_vtable_t *rtcd)
33190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
33290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    double level = 6.0e-05 * q * q * q - .0067 * q * q + .306 * q + .0065;
33390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int ppl = (int)(level + .5);
33490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) low_var_thresh;
33590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) flag;
33690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    POSTPROC_INVOKE(rtcd, downacross)(source->y_buffer, post->y_buffer, source->y_stride,  post->y_stride, source->y_height, source->y_width,   ppl);
33890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    POSTPROC_INVOKE(rtcd, downacross)(source->u_buffer, post->u_buffer, source->uv_stride, post->uv_stride,  source->uv_height, source->uv_width, ppl);
33990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    POSTPROC_INVOKE(rtcd, downacross)(source->v_buffer, post->v_buffer, source->uv_stride, post->uv_stride, source->uv_height, source->uv_width, ppl);
34090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
34190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_de_noise(YV12_BUFFER_CONFIG         *source,
34390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                  YV12_BUFFER_CONFIG         *post,
34490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                  int                         q,
34590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                  int                         low_var_thresh,
34690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                  int                         flag,
34790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                  vp8_postproc_rtcd_vtable_t *rtcd)
34890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
34990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    double level = 6.0e-05 * q * q * q - .0067 * q * q + .306 * q + .0065;
35090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int ppl = (int)(level + .5);
35190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) post;
35290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) low_var_thresh;
35390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) flag;
35490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    POSTPROC_INVOKE(rtcd, downacross)(
35690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        source->y_buffer + 2 * source->y_stride + 2,
35790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        source->y_buffer + 2 * source->y_stride + 2,
35890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        source->y_stride,
35990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        source->y_stride,
36090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        source->y_height - 4,
36190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        source->y_width - 4,
36290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ppl);
36390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    POSTPROC_INVOKE(rtcd, downacross)(
36490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        source->u_buffer + 2 * source->uv_stride + 2,
36590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        source->u_buffer + 2 * source->uv_stride + 2,
36690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        source->uv_stride,
36790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        source->uv_stride,
36890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        source->uv_height - 4,
36990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        source->uv_width - 4, ppl);
37090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    POSTPROC_INVOKE(rtcd, downacross)(
37190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        source->v_buffer + 2 * source->uv_stride + 2,
37290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        source->v_buffer + 2 * source->uv_stride + 2,
37390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        source->uv_stride,
37490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        source->uv_stride,
37590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        source->uv_height - 4,
37690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        source->uv_width - 4, ppl);
37790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
37990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberdouble vp8_gaussian(double sigma, double mu, double x)
38190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
38290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return 1 / (sigma * sqrt(2.0 * 3.14159265)) *
38390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber           (exp(-(x - mu) * (x - mu) / (2 * sigma * sigma)));
38490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
38590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern void (*vp8_clear_system_state)(void);
38790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void fillrd(struct postproc_state *state, int q, int a)
39090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
39190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    char char_dist[300];
39290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    double sigma;
39490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int ai = a, qi = q, i;
39590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_clear_system_state();
39790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    sigma = ai + .5 + .6 * (63 - qi) / 63.0;
40090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
401538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* set up a lookup table of 256 entries that matches
402538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber     * a gaussian distribution with sigma determined by q.
403538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber     */
40490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
40590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        double i;
40690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int next, j;
40790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        next = 0;
40990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (i = -32; i < 32; i++)
41190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
41290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int a = (int)(.5 + 256 * vp8_gaussian(sigma, 0, i));
41390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (a)
41590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
41690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                for (j = 0; j < a; j++)
41790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
41890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    char_dist[next+j] = (char) i;
41990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
42090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                next = next + j;
42290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
42390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
42590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (next = next; next < 256; next++)
42790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            char_dist[next] = 0;
42890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
43090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = 0; i < 3072; i++)
43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        state->noise[i] = char_dist[rand() & 0xff];
43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = 0; i < 16; i++)
43790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        state->blackclamp[i] = -char_dist[0];
43990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        state->whiteclamp[i] = -char_dist[0];
44090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        state->bothclamp[i] = -2 * char_dist[0];
44190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
44290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    state->last_q = q;
44490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    state->last_noise = a;
44590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
44690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/****************************************************************************
44890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
44990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  ROUTINE       : plane_add_noise_c
45090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
45190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  INPUTS        : unsigned char *Start    starting address of buffer to add gaussian
45290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *                                  noise to
45390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *                  unsigned int Width    width of plane
45490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *                  unsigned int Height   height of plane
45590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *                  int  Pitch    distance between subsequent lines of frame
45690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *                  int  q        quantizer used to determine amount of noise
45790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *                                  to add
45890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
45990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  OUTPUTS       : None.
46090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
46190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  RETURNS       : void.
46290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
46390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  FUNCTION      : adds gaussian noise to a plane of pixels
46490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
46590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  SPECIAL NOTES : None.
46690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
46790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ****************************************************************************/
46890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_plane_add_noise_c(unsigned char *Start, char *noise,
46990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                           char blackclamp[16],
47090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                           char whiteclamp[16],
47190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                           char bothclamp[16],
47290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                           unsigned int Width, unsigned int Height, int Pitch)
47390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
47490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int i, j;
47590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = 0; i < Height; i++)
47790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
47890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char *Pos = Start + i * Pitch;
47990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        char  *Ref = (char *)(noise + (rand() & 0xff));
48090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (j = 0; j < Width; j++)
48290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
48390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (Pos[j] < blackclamp[0])
48490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Pos[j] = blackclamp[0];
48590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (Pos[j] > 255 + whiteclamp[0])
48790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Pos[j] = 255 + whiteclamp[0];
48890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Pos[j] += Ref[j];
49090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
49190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
49290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
49390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
494538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* Blend the macro block with a solid colored square.  Leave the
495538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * edges unblended to give distinction to macro blocks in areas
496538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * filled with the same color block.
497538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */
498538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubervoid vp8_blend_mb_inner_c (unsigned char *y, unsigned char *u, unsigned char *v,
499538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        int y1, int u1, int v1, int alpha, int stride)
500538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
501538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int i, j;
502538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int y1_const = y1*((1<<16)-alpha);
503538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int u1_const = u1*((1<<16)-alpha);
504538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int v1_const = v1*((1<<16)-alpha);
505538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
506538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    y += 2*stride + 2;
507538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    for (i = 0; i < 12; i++)
508538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
509538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        for (j = 0; j < 12; j++)
510538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        {
511538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            y[j] = (y[j]*alpha + y1_const)>>16;
512538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        }
513538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        y += stride;
514538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
515538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
516538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    stride >>= 1;
517538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
518538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    u += stride + 1;
519538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    v += stride + 1;
520538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
521538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    for (i = 0; i < 6; i++)
522538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
523538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        for (j = 0; j < 6; j++)
524538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        {
525538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            u[j] = (u[j]*alpha + u1_const)>>16;
526538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            v[j] = (v[j]*alpha + v1_const)>>16;
527538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        }
528538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        u += stride;
529538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        v += stride;
530538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
531538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
532538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
533538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* Blend only the edge of the macro block.  Leave center
534538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * unblended to allow for other visualizations to be layered.
535538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */
536538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubervoid vp8_blend_mb_outer_c (unsigned char *y, unsigned char *u, unsigned char *v,
537538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        int y1, int u1, int v1, int alpha, int stride)
538538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
539538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int i, j;
540538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int y1_const = y1*((1<<16)-alpha);
541538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int u1_const = u1*((1<<16)-alpha);
542538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int v1_const = v1*((1<<16)-alpha);
543538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
544538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    for (i = 0; i < 2; i++)
545538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
546538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        for (j = 0; j < 16; j++)
547538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        {
548538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            y[j] = (y[j]*alpha + y1_const)>>16;
549538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        }
550538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        y += stride;
551538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
552538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
553538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    for (i = 0; i < 12; i++)
554538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
555538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        y[0]  = (y[0]*alpha  + y1_const)>>16;
556538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        y[1]  = (y[1]*alpha  + y1_const)>>16;
557538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        y[14] = (y[14]*alpha + y1_const)>>16;
558538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        y[15] = (y[15]*alpha + y1_const)>>16;
559538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        y += stride;
560538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
561538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
562538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    for (i = 0; i < 2; i++)
563538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
564538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        for (j = 0; j < 16; j++)
565538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        {
566538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            y[j] = (y[j]*alpha + y1_const)>>16;
567538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        }
568538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        y += stride;
569538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
570538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
571538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    stride >>= 1;
572538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
573538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    for (j = 0; j < 8; j++)
574538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
575538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        u[j] = (u[j]*alpha + u1_const)>>16;
576538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        v[j] = (v[j]*alpha + v1_const)>>16;
577538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
578538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    u += stride;
579538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    v += stride;
580538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
581538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    for (i = 0; i < 6; i++)
582538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
583538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        u[0] = (u[0]*alpha + u1_const)>>16;
584538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        v[0] = (v[0]*alpha + v1_const)>>16;
585538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
586538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        u[7] = (u[7]*alpha + u1_const)>>16;
587538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        v[7] = (v[7]*alpha + v1_const)>>16;
588538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
589538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        u += stride;
590538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        v += stride;
591538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
592538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
593538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    for (j = 0; j < 8; j++)
594538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
595538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        u[j] = (u[j]*alpha + u1_const)>>16;
596538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        v[j] = (v[j]*alpha + v1_const)>>16;
597538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
598538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
599538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
600538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubervoid vp8_blend_b_c (unsigned char *y, unsigned char *u, unsigned char *v,
601538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        int y1, int u1, int v1, int alpha, int stride)
602538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
603538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int i, j;
604538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int y1_const = y1*((1<<16)-alpha);
605538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int u1_const = u1*((1<<16)-alpha);
606538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int v1_const = v1*((1<<16)-alpha);
607538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
608538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    for (i = 0; i < 4; i++)
609538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
610538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        for (j = 0; j < 4; j++)
611538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        {
612538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            y[j] = (y[j]*alpha + y1_const)>>16;
613538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        }
614538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        y += stride;
615538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
616538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
617538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    stride >>= 1;
618538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
619538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    for (i = 0; i < 2; i++)
620538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
621538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        for (j = 0; j < 2; j++)
622538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        {
623538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            u[j] = (u[j]*alpha + u1_const)>>16;
624538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            v[j] = (v[j]*alpha + v1_const)>>16;
625538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        }
626538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        u += stride;
627538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        v += stride;
628538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
629538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
630538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
631538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic void constrain_line (int x0, int *x1, int y0, int *y1, int width, int height)
632538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
633538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int dx;
634538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int dy;
635538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
636538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    if (*x1 > width)
637538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
638538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        dx = *x1 - x0;
639538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        dy = *y1 - y0;
640538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
641538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        *x1 = width;
642538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        if (dx)
643538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            *y1 = ((width-x0)*dy)/dx + y0;
644538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
645538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    if (*x1 < 0)
646538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
647538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        dx = *x1 - x0;
648538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        dy = *y1 - y0;
649538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
650538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        *x1 = 0;
651538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        if (dx)
652538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            *y1 = ((0-x0)*dy)/dx + y0;
653538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
654538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    if (*y1 > height)
655538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
656538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        dx = *x1 - x0;
657538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        dy = *y1 - y0;
658538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
659538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        *y1 = height;
660538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        if (dy)
661538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            *x1 = ((height-y0)*dx)/dy + x0;
662538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
663538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    if (*y1 < 0)
664538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
665538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        dx = *x1 - x0;
666538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        dy = *y1 - y0;
667538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
668538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        *y1 = 0;
669538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        if (dy)
670538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            *x1 = ((0-y0)*dx)/dy + x0;
671538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
672538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
673538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
674538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
67590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_RUNTIME_CPU_DETECT
67690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define RTCD_VTABLE(oci) (&(oci)->rtcd.postproc)
67790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
67890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define RTCD_VTABLE(oci) NULL
67990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
68090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
68179f15823c34ae1e423108295e416213200bb280fAndreas Huberint vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t *ppflags)
68290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
68390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int q = oci->filter_level * 10 / 6;
68479f15823c34ae1e423108295e416213200bb280fAndreas Huber    int flags = ppflags->post_proc_flag;
68579f15823c34ae1e423108295e416213200bb280fAndreas Huber    int deblock_level = ppflags->deblocking_level;
68679f15823c34ae1e423108295e416213200bb280fAndreas Huber    int noise_level = ppflags->noise_level;
68790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
68890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (!oci->frame_to_show)
68990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        return -1;
69090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
69190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (q > 63)
69290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        q = 63;
69390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
69490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (!flags)
69590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
69690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        *dest = *oci->frame_to_show;
69790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
698538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        /* handle problem with extending borders */
69990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dest->y_width = oci->Width;
70090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dest->y_height = oci->Height;
70190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dest->uv_height = dest->y_height / 2;
70290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        return 0;
70390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
70490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
70590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
70690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if ARCH_X86||ARCH_X86_64
70790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_reset_mmx_state();
70890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
70990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
71090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (flags & VP8D_DEMACROBLOCK)
71190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
71290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_deblock_and_de_macro_block(oci->frame_to_show, &oci->post_proc_buffer,
71390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                       q + (deblock_level - 5) * 10, 1, 0, RTCD_VTABLE(oci));
71490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
71590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else if (flags & VP8D_DEBLOCK)
71690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
71790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_deblock(oci->frame_to_show, &oci->post_proc_buffer,
71890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    q, 1, 0, RTCD_VTABLE(oci));
71990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
72090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
72190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
72290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_yv12_copy_frame_ptr(oci->frame_to_show, &oci->post_proc_buffer);
72390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
72490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
72590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (flags & VP8D_ADDNOISE)
72690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
72790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (oci->postproc_state.last_q != q
72890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            || oci->postproc_state.last_noise != noise_level)
72990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
73090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            fillrd(&oci->postproc_state, 63 - q, noise_level);
73190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
73290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
73390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        POSTPROC_INVOKE(RTCD_VTABLE(oci), addnoise)
73490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        (oci->post_proc_buffer.y_buffer,
73590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         oci->postproc_state.noise,
73690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         oci->postproc_state.blackclamp,
73790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         oci->postproc_state.whiteclamp,
73890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         oci->postproc_state.bothclamp,
73990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         oci->post_proc_buffer.y_width, oci->post_proc_buffer.y_height,
74090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         oci->post_proc_buffer.y_stride);
74190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
74290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
74379f15823c34ae1e423108295e416213200bb280fAndreas Huber#if CONFIG_POSTPROC_VISUALIZER
74479f15823c34ae1e423108295e416213200bb280fAndreas Huber    if (flags & VP8D_DEBUG_TXT_FRAME_INFO)
74590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
74679f15823c34ae1e423108295e416213200bb280fAndreas Huber        char message[512];
74790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        sprintf(message, "F%1dG%1dQ%3dF%3dP%d_s%dx%d",
74890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                (oci->frame_type == KEY_FRAME),
74990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                oci->refresh_golden_frame,
75090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                oci->base_qindex,
75190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                oci->filter_level,
75290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                flags,
75390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                oci->mb_cols, oci->mb_rows);
75490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_blit_text(message, oci->post_proc_buffer.y_buffer, oci->post_proc_buffer.y_stride);
75590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
756538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
75779f15823c34ae1e423108295e416213200bb280fAndreas Huber    if (flags & VP8D_DEBUG_TXT_MBLK_MODES)
75890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
75990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int i, j;
76090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char *y_ptr;
76190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        YV12_BUFFER_CONFIG *post = &oci->post_proc_buffer;
76290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int mb_rows = post->y_height >> 4;
76390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int mb_cols = post->y_width  >> 4;
76490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int mb_index = 0;
76590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        MODE_INFO *mi = oci->mi;
76690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
76790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        y_ptr = post->y_buffer + 4 * post->y_stride + 4;
76890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
769538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        /* vp8_filter each macro block */
77090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (i = 0; i < mb_rows; i++)
77190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
77290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            for (j = 0; j < mb_cols; j++)
77390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
77490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                char zz[4];
77590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
77690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                sprintf(zz, "%c", mi[mb_index].mbmi.mode + 'a');
77790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
77890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                vp8_blit_text(zz, y_ptr, post->y_stride);
77990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                mb_index ++;
78090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                y_ptr += 16;
78190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
78290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
783538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            mb_index ++; /* border */
78490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            y_ptr += post->y_stride  * 16 - post->y_width;
78590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
78690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
78790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
788538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
78979f15823c34ae1e423108295e416213200bb280fAndreas Huber    if (flags & VP8D_DEBUG_TXT_DC_DIFF)
79090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
79190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int i, j;
79290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char *y_ptr;
79390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        YV12_BUFFER_CONFIG *post = &oci->post_proc_buffer;
79490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int mb_rows = post->y_height >> 4;
79590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int mb_cols = post->y_width  >> 4;
79690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int mb_index = 0;
79790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        MODE_INFO *mi = oci->mi;
79890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
79990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        y_ptr = post->y_buffer + 4 * post->y_stride + 4;
80090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
801538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        /* vp8_filter each macro block */
80290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (i = 0; i < mb_rows; i++)
80390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
80490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            for (j = 0; j < mb_cols; j++)
80590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
80690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                char zz[4];
80790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
80890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (oci->frame_type == KEY_FRAME)
80990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    sprintf(zz, "a");
81090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
81190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    sprintf(zz, "%c", mi[mb_index].mbmi.dc_diff + '0');
81290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
81390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                vp8_blit_text(zz, y_ptr, post->y_stride);
81490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                mb_index ++;
81590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                y_ptr += 16;
81690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
81790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
818538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            mb_index ++; /* border */
81990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            y_ptr += post->y_stride  * 16 - post->y_width;
82090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
82190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
82290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
823538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
82479f15823c34ae1e423108295e416213200bb280fAndreas Huber    if (flags & VP8D_DEBUG_TXT_RATE_INFO)
82590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
82679f15823c34ae1e423108295e416213200bb280fAndreas Huber        char message[512];
82790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        sprintf(message, "Bitrate: %10.2f frame_rate: %10.2f ", oci->bitrate, oci->framerate);
82890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_blit_text(message, oci->post_proc_buffer.y_buffer, oci->post_proc_buffer.y_stride);
82990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
83090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
831538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* Draw motion vectors */
83279f15823c34ae1e423108295e416213200bb280fAndreas Huber    if ((flags & VP8D_DEBUG_DRAW_MV) && ppflags->display_mv_flag)
833538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
834538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        YV12_BUFFER_CONFIG *post = &oci->post_proc_buffer;
835538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        int width  = post->y_width;
836538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        int height = post->y_height;
837538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        int mb_cols = width  >> 4;
838538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        unsigned char *y_buffer = oci->post_proc_buffer.y_buffer;
839538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        int y_stride = oci->post_proc_buffer.y_stride;
840538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        MODE_INFO *mi = oci->mi;
841538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        int x0, y0;
842538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
843538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        for (y0 = 0; y0 < height; y0 += 16)
844538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        {
845538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            for (x0 = 0; x0 < width; x0 += 16)
846538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            {
847538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                int x1, y1;
848538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
84979f15823c34ae1e423108295e416213200bb280fAndreas Huber                if (!(ppflags->display_mv_flag & (1<<mi->mbmi.mode)))
85079f15823c34ae1e423108295e416213200bb280fAndreas Huber                {
85179f15823c34ae1e423108295e416213200bb280fAndreas Huber                    mi++;
85279f15823c34ae1e423108295e416213200bb280fAndreas Huber                    continue;
85379f15823c34ae1e423108295e416213200bb280fAndreas Huber                }
85479f15823c34ae1e423108295e416213200bb280fAndreas Huber
855538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                if (mi->mbmi.mode == SPLITMV)
856538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                {
857538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    switch (mi->mbmi.partitioning)
858538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    {
859538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        case 0 :    /* mv_top_bottom */
860538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        {
861538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            B_MODE_INFO *bmi = &mi->bmi[0];
862538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            MV *mv = &bmi->mv.as_mv;
863538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
864538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            x1 = x0 + 8 + (mv->col >> 3);
865538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            y1 = y0 + 4 + (mv->row >> 3);
866538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
867538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            constrain_line (x0+8, &x1, y0+4, &y1, width, height);
868538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            vp8_blit_line  (x0+8,  x1, y0+4,  y1, y_buffer, y_stride);
869538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
870538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            bmi = &mi->bmi[8];
871538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
872538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            x1 = x0 + 8 + (mv->col >> 3);
873538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            y1 = y0 +12 + (mv->row >> 3);
874538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
875538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            constrain_line (x0+8, &x1, y0+12, &y1, width, height);
876538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            vp8_blit_line  (x0+8,  x1, y0+12,  y1, y_buffer, y_stride);
877538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
878538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            break;
879538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        }
880538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        case 1 :    /* mv_left_right */
881538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        {
882538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            B_MODE_INFO *bmi = &mi->bmi[0];
883538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            MV *mv = &bmi->mv.as_mv;
884538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
885538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            x1 = x0 + 4 + (mv->col >> 3);
886538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            y1 = y0 + 8 + (mv->row >> 3);
887538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
888538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            constrain_line (x0+4, &x1, y0+8, &y1, width, height);
889538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            vp8_blit_line  (x0+4,  x1, y0+8,  y1, y_buffer, y_stride);
890538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
891538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            bmi = &mi->bmi[2];
892538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
893538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            x1 = x0 +12 + (mv->col >> 3);
894538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            y1 = y0 + 8 + (mv->row >> 3);
895538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
896538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            constrain_line (x0+12, &x1, y0+8, &y1, width, height);
897538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            vp8_blit_line  (x0+12,  x1, y0+8,  y1, y_buffer, y_stride);
898538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
899538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            break;
900538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        }
901538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        case 2 :    /* mv_quarters   */
902538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        {
903538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            B_MODE_INFO *bmi = &mi->bmi[0];
904538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            MV *mv = &bmi->mv.as_mv;
905538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
906538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            x1 = x0 + 4 + (mv->col >> 3);
907538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            y1 = y0 + 4 + (mv->row >> 3);
908538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
909538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            constrain_line (x0+4, &x1, y0+4, &y1, width, height);
910538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            vp8_blit_line  (x0+4,  x1, y0+4,  y1, y_buffer, y_stride);
911538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
912538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            bmi = &mi->bmi[2];
913538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
914538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            x1 = x0 +12 + (mv->col >> 3);
915538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            y1 = y0 + 4 + (mv->row >> 3);
916538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
917538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            constrain_line (x0+12, &x1, y0+4, &y1, width, height);
918538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            vp8_blit_line  (x0+12,  x1, y0+4,  y1, y_buffer, y_stride);
919538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
920538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            bmi = &mi->bmi[8];
921538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
922538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            x1 = x0 + 4 + (mv->col >> 3);
923538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            y1 = y0 +12 + (mv->row >> 3);
924538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
925538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            constrain_line (x0+4, &x1, y0+12, &y1, width, height);
926538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            vp8_blit_line  (x0+4,  x1, y0+12,  y1, y_buffer, y_stride);
927538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
928538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            bmi = &mi->bmi[10];
929538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
930538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            x1 = x0 +12 + (mv->col >> 3);
931538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            y1 = y0 +12 + (mv->row >> 3);
932538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
933538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            constrain_line (x0+12, &x1, y0+12, &y1, width, height);
934538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            vp8_blit_line  (x0+12,  x1, y0+12,  y1, y_buffer, y_stride);
935538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            break;
936538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        }
937538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        default :
938538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        {
939538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            B_MODE_INFO *bmi = mi->bmi;
940538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            int bx0, by0;
941538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
942538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            for (by0 = y0; by0 < (y0+16); by0 += 4)
943538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            {
944538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                                for (bx0 = x0; bx0 < (x0+16); bx0 += 4)
945538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                                {
946538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                                    MV *mv = &bmi->mv.as_mv;
94790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
948538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                                    x1 = bx0 + 2 + (mv->col >> 3);
949538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                                    y1 = by0 + 2 + (mv->row >> 3);
950538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
951538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                                    constrain_line (bx0+2, &x1, by0+2, &y1, width, height);
952538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                                    vp8_blit_line  (bx0+2,  x1, by0+2,  y1, y_buffer, y_stride);
953538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
954538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                                    bmi++;
955538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                                }
956538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            }
957538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        }
958538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    }
959538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                }
960538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                else if (mi->mbmi.mode >= NEARESTMV)
961538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                {
962538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    MV *mv = &mi->mbmi.mv.as_mv;
963538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    const int lx0 = x0 + 8;
964538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    const int ly0 = y0 + 8;
965538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
966538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    x1 = lx0 + (mv->col >> 3);
967538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    y1 = ly0 + (mv->row >> 3);
968538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
969538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    if (x1 != lx0 && y1 != ly0)
970538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    {
971538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        constrain_line (lx0, &x1, ly0-1, &y1, width, height);
972538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        vp8_blit_line  (lx0,  x1, ly0-1,  y1, y_buffer, y_stride);
973538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
974538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        constrain_line (lx0, &x1, ly0+1, &y1, width, height);
975538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        vp8_blit_line  (lx0,  x1, ly0+1,  y1, y_buffer, y_stride);
976538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    }
977538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    else
978538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        vp8_blit_line  (lx0,  x1, ly0,  y1, y_buffer, y_stride);
979538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                }
98079f15823c34ae1e423108295e416213200bb280fAndreas Huber
981538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                mi++;
982538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            }
983538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            mi++;
984538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        }
985538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
986538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
987538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* Color in block modes */
98879f15823c34ae1e423108295e416213200bb280fAndreas Huber    if ((flags & VP8D_DEBUG_CLR_BLK_MODES)
98979f15823c34ae1e423108295e416213200bb280fAndreas Huber        && (ppflags->display_mb_modes_flag || ppflags->display_b_modes_flag))
990538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
991538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        int y, x;
992538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        YV12_BUFFER_CONFIG *post = &oci->post_proc_buffer;
993538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        int width  = post->y_width;
994538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        int height = post->y_height;
995538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        unsigned char *y_ptr = oci->post_proc_buffer.y_buffer;
996538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        unsigned char *u_ptr = oci->post_proc_buffer.u_buffer;
997538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        unsigned char *v_ptr = oci->post_proc_buffer.v_buffer;
998538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        int y_stride = oci->post_proc_buffer.y_stride;
999538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        MODE_INFO *mi = oci->mi;
1000538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
1001538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        for (y = 0; y < height; y += 16)
1002538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        {
1003538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            for (x = 0; x < width; x += 16)
1004538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            {
1005538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                int Y = 0, U = 0, V = 0;
1006538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
100779f15823c34ae1e423108295e416213200bb280fAndreas Huber                if (mi->mbmi.mode == B_PRED &&
100879f15823c34ae1e423108295e416213200bb280fAndreas Huber                    ((ppflags->display_mb_modes_flag & B_PRED) || ppflags->display_b_modes_flag))
1009538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                {
1010538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    int by, bx;
1011538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    unsigned char *yl, *ul, *vl;
1012538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    B_MODE_INFO *bmi = mi->bmi;
1013538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
1014538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    yl = y_ptr + x;
1015538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    ul = u_ptr + (x>>1);
1016538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    vl = v_ptr + (x>>1);
1017538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
1018538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    for (by = 0; by < 16; by += 4)
1019538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    {
1020538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        for (bx = 0; bx < 16; bx += 4)
1021538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        {
102279f15823c34ae1e423108295e416213200bb280fAndreas Huber                            if ((ppflags->display_b_modes_flag & (1<<mi->mbmi.mode))
102379f15823c34ae1e423108295e416213200bb280fAndreas Huber                                || (ppflags->display_mb_modes_flag & B_PRED))
102479f15823c34ae1e423108295e416213200bb280fAndreas Huber                            {
102579f15823c34ae1e423108295e416213200bb280fAndreas Huber                                Y = B_PREDICTION_MODE_colors[bmi->mode][0];
102679f15823c34ae1e423108295e416213200bb280fAndreas Huber                                U = B_PREDICTION_MODE_colors[bmi->mode][1];
102779f15823c34ae1e423108295e416213200bb280fAndreas Huber                                V = B_PREDICTION_MODE_colors[bmi->mode][2];
1028538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
102979f15823c34ae1e423108295e416213200bb280fAndreas Huber                                POSTPROC_INVOKE(RTCD_VTABLE(oci), blend_b)
103079f15823c34ae1e423108295e416213200bb280fAndreas Huber                                    (yl+bx, ul+(bx>>1), vl+(bx>>1), Y, U, V, 0xc000, y_stride);
103179f15823c34ae1e423108295e416213200bb280fAndreas Huber                            }
1032538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                            bmi++;
1033538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        }
1034538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
1035538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        yl += y_stride*4;
1036538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        ul += y_stride*1;
1037538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        vl += y_stride*1;
1038538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    }
1039538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                }
104079f15823c34ae1e423108295e416213200bb280fAndreas Huber                else if (ppflags->display_mb_modes_flag & (1<<mi->mbmi.mode))
1041538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                {
1042538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    Y = MB_PREDICTION_MODE_colors[mi->mbmi.mode][0];
1043538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    U = MB_PREDICTION_MODE_colors[mi->mbmi.mode][1];
1044538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    V = MB_PREDICTION_MODE_colors[mi->mbmi.mode][2];
1045538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
1046538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    POSTPROC_INVOKE(RTCD_VTABLE(oci), blend_mb_inner)
1047538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        (y_ptr+x, u_ptr+(x>>1), v_ptr+(x>>1), Y, U, V, 0xc000, y_stride);
1048538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                }
104979f15823c34ae1e423108295e416213200bb280fAndreas Huber
1050538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                mi++;
1051538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            }
1052538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            y_ptr += y_stride*16;
1053538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            u_ptr += y_stride*4;
1054538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            v_ptr += y_stride*4;
1055538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
1056538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            mi++;
1057538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        }
1058538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
1059538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
1060538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* Color in frame reference blocks */
106179f15823c34ae1e423108295e416213200bb280fAndreas Huber    if ((flags & VP8D_DEBUG_CLR_FRM_REF_BLKS) && ppflags->display_ref_frame_flag)
1062538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
1063538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        int y, x;
1064538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        YV12_BUFFER_CONFIG *post = &oci->post_proc_buffer;
1065538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        int width  = post->y_width;
1066538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        int height = post->y_height;
1067538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        unsigned char *y_ptr = oci->post_proc_buffer.y_buffer;
1068538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        unsigned char *u_ptr = oci->post_proc_buffer.u_buffer;
1069538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        unsigned char *v_ptr = oci->post_proc_buffer.v_buffer;
1070538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        int y_stride = oci->post_proc_buffer.y_stride;
1071538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        MODE_INFO *mi = oci->mi;
1072538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
1073538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        for (y = 0; y < height; y += 16)
1074538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        {
1075538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            for (x = 0; x < width; x +=16)
1076538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            {
1077538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                int Y = 0, U = 0, V = 0;
1078538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
107979f15823c34ae1e423108295e416213200bb280fAndreas Huber                if (ppflags->display_ref_frame_flag & (1<<mi->mbmi.ref_frame))
108079f15823c34ae1e423108295e416213200bb280fAndreas Huber                {
108179f15823c34ae1e423108295e416213200bb280fAndreas Huber                    Y = MV_REFERENCE_FRAME_colors[mi->mbmi.ref_frame][0];
108279f15823c34ae1e423108295e416213200bb280fAndreas Huber                    U = MV_REFERENCE_FRAME_colors[mi->mbmi.ref_frame][1];
108379f15823c34ae1e423108295e416213200bb280fAndreas Huber                    V = MV_REFERENCE_FRAME_colors[mi->mbmi.ref_frame][2];
1084538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
108579f15823c34ae1e423108295e416213200bb280fAndreas Huber                    POSTPROC_INVOKE(RTCD_VTABLE(oci), blend_mb_outer)
108679f15823c34ae1e423108295e416213200bb280fAndreas Huber                        (y_ptr+x, u_ptr+(x>>1), v_ptr+(x>>1), Y, U, V, 0xc000, y_stride);
108779f15823c34ae1e423108295e416213200bb280fAndreas Huber                }
1088538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
1089538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                mi++;
1090538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            }
1091538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            y_ptr += y_stride*16;
1092538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            u_ptr += y_stride*4;
1093538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            v_ptr += y_stride*4;
1094538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
1095538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            mi++;
1096538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        }
1097538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
109879f15823c34ae1e423108295e416213200bb280fAndreas Huber#endif
109990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
110090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    *dest = oci->post_proc_buffer;
110190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1102538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* handle problem with extending borders */
110390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    dest->y_width = oci->Width;
110490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    dest->y_height = oci->Height;
110590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    dest->uv_height = dest->y_height / 2;
110690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return 0;
110790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
1108