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