vp9_postproc.c 29.7 KB
Newer Older
John Koleszar's avatar
John Koleszar committed
1
/*
2
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
John Koleszar's avatar
John Koleszar committed
3
 *
4
 *  Use of this source code is governed by a BSD-style license
5
6
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
7
 *  in the file PATENTS.  All contributing project authors may
8
 *  be found in the AUTHORS file in the root of the source tree.
John Koleszar's avatar
John Koleszar committed
9
10
11
 */


12
#include "./vpx_config.h"
John Koleszar's avatar
John Koleszar committed
13
#include "vpx_scale/yv12config.h"
14
#include "vp9/common/vp9_postproc.h"
15
#include "vp9/common/vp9_textblit.h"
Johann's avatar
Johann committed
16
#include "vpx_scale/vpx_scale.h"
17
#include "vp9/common/vp9_systemdependent.h"
Jim Bankoski's avatar
Jim Bankoski committed
18
#include "./vp9_rtcd.h"
19
#include "./vpx_scale_rtcd.h"
Jim Bankoski's avatar
Jim Bankoski committed
20

John Koleszar's avatar
John Koleszar committed
21
22
23
24

#include <math.h>
#include <stdlib.h>
#include <stdio.h>
25

26
27
28
29
30
31
32
#define RGB_TO_YUV(t)                                            \
  ( (0.257*(float)(t >> 16))  + (0.504*(float)(t >> 8 & 0xff)) + \
    (0.098*(float)(t & 0xff)) + 16),                             \
  (-(0.148*(float)(t >> 16))  - (0.291*(float)(t >> 8 & 0xff)) + \
    (0.439*(float)(t & 0xff)) + 128),                            \
  ( (0.439*(float)(t >> 16))  - (0.368*(float)(t >> 8 & 0xff)) - \
    (0.071*(float)(t & 0xff)) + 128)
33

34
/* global constants */
35
#if 0 && CONFIG_POSTPROC_VISUALIZER
John Koleszar's avatar
John Koleszar committed
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
static const unsigned char MB_PREDICTION_MODE_colors[MB_MODE_COUNT][3] = {
  { RGB_TO_YUV(0x98FB98) },   /* PaleGreen */
  { RGB_TO_YUV(0x00FF00) },   /* Green */
  { RGB_TO_YUV(0xADFF2F) },   /* GreenYellow */
  { RGB_TO_YUV(0x8F0000) },   /* Dark Red */
  { RGB_TO_YUV(0x008F8F) },   /* Dark Cyan */
  { RGB_TO_YUV(0x008F8F) },   /* Dark Cyan */
  { RGB_TO_YUV(0x008F8F) },   /* Dark Cyan */
  { RGB_TO_YUV(0x8F0000) },   /* Dark Red */
  { RGB_TO_YUV(0x8F0000) },   /* Dark Red */
  { RGB_TO_YUV(0x228B22) },   /* ForestGreen */
  { RGB_TO_YUV(0x006400) },   /* DarkGreen */
  { RGB_TO_YUV(0x98F5FF) },   /* Cadet Blue */
  { RGB_TO_YUV(0x6CA6CD) },   /* Sky Blue */
  { RGB_TO_YUV(0x00008B) },   /* Dark blue */
  { RGB_TO_YUV(0x551A8B) },   /* Purple */
  { RGB_TO_YUV(0xFF0000) }    /* Red */
  { RGB_TO_YUV(0xCC33FF) },   /* Magenta */
54
55
};

56
static const unsigned char B_PREDICTION_MODE_colors[INTRA_MODES][3] = {
John Koleszar's avatar
John Koleszar committed
57
58
59
60
61
62
63
64
65
66
67
68
69
70
  { RGB_TO_YUV(0x6633ff) },   /* Purple */
  { RGB_TO_YUV(0xcc33ff) },   /* Magenta */
  { RGB_TO_YUV(0xff33cc) },   /* Pink */
  { RGB_TO_YUV(0xff3366) },   /* Coral */
  { RGB_TO_YUV(0x3366ff) },   /* Blue */
  { RGB_TO_YUV(0xed00f5) },   /* Dark Blue */
  { RGB_TO_YUV(0x2e00b8) },   /* Dark Purple */
  { RGB_TO_YUV(0xff6633) },   /* Orange */
  { RGB_TO_YUV(0x33ccff) },   /* Light Blue */
  { RGB_TO_YUV(0x8ab800) },   /* Green */
  { RGB_TO_YUV(0xffcc33) },   /* Light Orange */
  { RGB_TO_YUV(0x33ffcc) },   /* Aqua */
  { RGB_TO_YUV(0x66ff33) },   /* Light Green */
  { RGB_TO_YUV(0xccff33) },   /* Yellow */
71
72
};

John Koleszar's avatar
John Koleszar committed
73
74
75
76
77
static const unsigned char MV_REFERENCE_FRAME_colors[MAX_REF_FRAMES][3] = {
  { RGB_TO_YUV(0x00ff00) },   /* Blue */
  { RGB_TO_YUV(0x0000ff) },   /* Green */
  { RGB_TO_YUV(0xffff00) },   /* Yellow */
  { RGB_TO_YUV(0xff0000) },   /* Red */
78
};
79
#endif
80

John Koleszar's avatar
John Koleszar committed
81
82
static const short kernel5[] = {
  1, 1, 4, 1, 1
John Koleszar's avatar
John Koleszar committed
83
84
};

85
const short vp9_rv[] = {
John Koleszar's avatar
John Koleszar committed
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
  8, 5, 2, 2, 8, 12, 4, 9, 8, 3,
  0, 3, 9, 0, 0, 0, 8, 3, 14, 4,
  10, 1, 11, 14, 1, 14, 9, 6, 12, 11,
  8, 6, 10, 0, 0, 8, 9, 0, 3, 14,
  8, 11, 13, 4, 2, 9, 0, 3, 9, 6,
  1, 2, 3, 14, 13, 1, 8, 2, 9, 7,
  3, 3, 1, 13, 13, 6, 6, 5, 2, 7,
  11, 9, 11, 8, 7, 3, 2, 0, 13, 13,
  14, 4, 12, 5, 12, 10, 8, 10, 13, 10,
  4, 14, 4, 10, 0, 8, 11, 1, 13, 7,
  7, 14, 6, 14, 13, 2, 13, 5, 4, 4,
  0, 10, 0, 5, 13, 2, 12, 7, 11, 13,
  8, 0, 4, 10, 7, 2, 7, 2, 2, 5,
  3, 4, 7, 3, 3, 14, 14, 5, 9, 13,
  3, 14, 3, 6, 3, 0, 11, 8, 13, 1,
  13, 1, 12, 0, 10, 9, 7, 6, 2, 8,
  5, 2, 13, 7, 1, 13, 14, 7, 6, 7,
  9, 6, 10, 11, 7, 8, 7, 5, 14, 8,
  4, 4, 0, 8, 7, 10, 0, 8, 14, 11,
  3, 12, 5, 7, 14, 3, 14, 5, 2, 6,
  11, 12, 12, 8, 0, 11, 13, 1, 2, 0,
  5, 10, 14, 7, 8, 0, 4, 11, 0, 8,
  0, 3, 10, 5, 8, 0, 11, 6, 7, 8,
  10, 7, 13, 9, 2, 5, 1, 5, 10, 2,
  4, 3, 5, 6, 10, 8, 9, 4, 11, 14,
  0, 10, 0, 5, 13, 2, 12, 7, 11, 13,
  8, 0, 4, 10, 7, 2, 7, 2, 2, 5,
  3, 4, 7, 3, 3, 14, 14, 5, 9, 13,
  3, 14, 3, 6, 3, 0, 11, 8, 13, 1,
  13, 1, 12, 0, 10, 9, 7, 6, 2, 8,
  5, 2, 13, 7, 1, 13, 14, 7, 6, 7,
  9, 6, 10, 11, 7, 8, 7, 5, 14, 8,
  4, 4, 0, 8, 7, 10, 0, 8, 14, 11,
  3, 12, 5, 7, 14, 3, 14, 5, 2, 6,
  11, 12, 12, 8, 0, 11, 13, 1, 2, 0,
  5, 10, 14, 7, 8, 0, 4, 11, 0, 8,
  0, 3, 10, 5, 8, 0, 11, 6, 7, 8,
  10, 7, 13, 9, 2, 5, 1, 5, 10, 2,
  4, 3, 5, 6, 10, 8, 9, 4, 11, 14,
  3, 8, 3, 7, 8, 5, 11, 4, 12, 3,
  11, 9, 14, 8, 14, 13, 4, 3, 1, 2,
  14, 6, 5, 4, 4, 11, 4, 6, 2, 1,
  5, 8, 8, 12, 13, 5, 14, 10, 12, 13,
  0, 9, 5, 5, 11, 10, 13, 9, 10, 13,
John Koleszar's avatar
John Koleszar committed
130
131
132
};


133
/****************************************************************************
John Koleszar's avatar
John Koleszar committed
134
 */
135
void vp9_post_proc_down_and_across_c(const uint8_t *src_ptr,
136
                                     uint8_t *dst_ptr,
137
138
139
140
141
                                     int src_pixels_per_line,
                                     int dst_pixels_per_line,
                                     int rows,
                                     int cols,
                                     int flimit) {
142
143
  uint8_t const *p_src;
  uint8_t *p_dst;
John Koleszar's avatar
John Koleszar committed
144
145
146
147
148
  int row;
  int col;
  int i;
  int v;
  int pitch = src_pixels_per_line;
149
  uint8_t d[8];
John Koleszar's avatar
John Koleszar committed
150
  (void)dst_pixels_per_line;
John Koleszar's avatar
John Koleszar committed
151

John Koleszar's avatar
John Koleszar committed
152
153
154
155
  for (row = 0; row < rows; row++) {
    /* post_proc_down for one row */
    p_src = src_ptr;
    p_dst = dst_ptr;
John Koleszar's avatar
John Koleszar committed
156

John Koleszar's avatar
John Koleszar committed
157
    for (col = 0; col < cols; col++) {
John Koleszar's avatar
John Koleszar committed
158

John Koleszar's avatar
John Koleszar committed
159
160
      int kernel = 4;
      int v = p_src[col];
John Koleszar's avatar
John Koleszar committed
161

John Koleszar's avatar
John Koleszar committed
162
163
164
      for (i = -2; i <= 2; i++) {
        if (abs(v - p_src[col + i * pitch]) > flimit)
          goto down_skip_convolve;
John Koleszar's avatar
John Koleszar committed
165

John Koleszar's avatar
John Koleszar committed
166
167
        kernel += kernel5[2 + i] * p_src[col + i * pitch];
      }
John Koleszar's avatar
John Koleszar committed
168

John Koleszar's avatar
John Koleszar committed
169
170
171
172
      v = (kernel >> 3);
    down_skip_convolve:
      p_dst[col] = v;
    }
John Koleszar's avatar
John Koleszar committed
173

John Koleszar's avatar
John Koleszar committed
174
175
176
    /* now post_proc_across */
    p_src = dst_ptr;
    p_dst = dst_ptr;
John Koleszar's avatar
John Koleszar committed
177

John Koleszar's avatar
John Koleszar committed
178
179
    for (i = 0; i < 8; i++)
      d[i] = p_src[i];
John Koleszar's avatar
John Koleszar committed
180

John Koleszar's avatar
John Koleszar committed
181
182
183
184
185
186
187
188
189
    for (col = 0; col < cols; col++) {
      int kernel = 4;
      v = p_src[col];

      d[col & 7] = v;

      for (i = -2; i <= 2; i++) {
        if (abs(v - p_src[col + i]) > flimit)
          goto across_skip_convolve;
John Koleszar's avatar
John Koleszar committed
190

John Koleszar's avatar
John Koleszar committed
191
192
        kernel += kernel5[2 + i] * p_src[col + i];
      }
John Koleszar's avatar
John Koleszar committed
193

John Koleszar's avatar
John Koleszar committed
194
195
      d[col & 7] = (kernel >> 3);
    across_skip_convolve:
John Koleszar's avatar
John Koleszar committed
196

John Koleszar's avatar
John Koleszar committed
197
198
      if (col >= 2)
        p_dst[col - 2] = d[(col - 2) & 7];
John Koleszar's avatar
John Koleszar committed
199
200
    }

John Koleszar's avatar
John Koleszar committed
201
202
203
204
    /* handle the last two pixels */
    p_dst[col - 2] = d[(col - 2) & 7];
    p_dst[col - 1] = d[(col - 1) & 7];

John Koleszar's avatar
John Koleszar committed
205

John Koleszar's avatar
John Koleszar committed
206
207
208
209
    /* next row */
    src_ptr += pitch;
    dst_ptr += pitch;
  }
John Koleszar's avatar
John Koleszar committed
210
211
}

John Koleszar's avatar
John Koleszar committed
212
213
static int q2mbl(int x) {
  if (x < 20) x = 20;
John Koleszar's avatar
John Koleszar committed
214

John Koleszar's avatar
John Koleszar committed
215
216
217
  x = 50 + (x - 50) * 10 / 8;
  return x * x / 3;
}
218

219
void vp9_mbpost_proc_across_ip_c(uint8_t *src, int pitch,
220
                                 int rows, int cols, int flimit) {
John Koleszar's avatar
John Koleszar committed
221
  int r, c, i;
John Koleszar's avatar
John Koleszar committed
222

223
224
  uint8_t *s = src;
  uint8_t d[16];
John Koleszar's avatar
John Koleszar committed
225
226


John Koleszar's avatar
John Koleszar committed
227
228
229
  for (r = 0; r < rows; r++) {
    int sumsq = 0;
    int sum   = 0;
John Koleszar's avatar
John Koleszar committed
230

John Koleszar's avatar
John Koleszar committed
231
232
233
234
235
    for (i = -8; i <= 6; i++) {
      sumsq += s[i] * s[i];
      sum   += s[i];
      d[i + 8] = 0;
    }
John Koleszar's avatar
John Koleszar committed
236

John Koleszar's avatar
John Koleszar committed
237
238
239
    for (c = 0; c < cols + 8; c++) {
      int x = s[c + 7] - s[c - 8];
      int y = s[c + 7] + s[c - 8];
John Koleszar's avatar
John Koleszar committed
240

John Koleszar's avatar
John Koleszar committed
241
242
      sum  += x;
      sumsq += x * y;
John Koleszar's avatar
John Koleszar committed
243

John Koleszar's avatar
John Koleszar committed
244
245
246
247
248
      d[c & 15] = s[c];

      if (sumsq * 15 - sum * sum < flimit) {
        d[c & 15] = (8 + sum + s[c]) >> 4;
      }
John Koleszar's avatar
John Koleszar committed
249

John Koleszar's avatar
John Koleszar committed
250
      s[c - 8] = d[(c - 8) & 15];
John Koleszar's avatar
John Koleszar committed
251
    }
John Koleszar's avatar
John Koleszar committed
252
253
254

    s += pitch;
  }
John Koleszar's avatar
John Koleszar committed
255
256
}

257
void vp9_mbpost_proc_down_c(uint8_t *dst, int pitch,
258
                            int rows, int cols, int flimit) {
John Koleszar's avatar
John Koleszar committed
259
  int r, c, i;
260
  const short *rv3 = &vp9_rv[63 & rand()];
John Koleszar's avatar
John Koleszar committed
261

John Koleszar's avatar
John Koleszar committed
262
  for (c = 0; c < cols; c++) {
263
    uint8_t *s = &dst[c];
John Koleszar's avatar
John Koleszar committed
264
265
    int sumsq = 0;
    int sum   = 0;
266
    uint8_t d[16];
John Koleszar's avatar
John Koleszar committed
267
    const short *rv2 = rv3 + ((c * 17) & 127);
John Koleszar's avatar
John Koleszar committed
268

John Koleszar's avatar
John Koleszar committed
269
270
271
272
    for (i = -8; i <= 6; i++) {
      sumsq += s[i * pitch] * s[i * pitch];
      sum   += s[i * pitch];
    }
John Koleszar's avatar
John Koleszar committed
273

John Koleszar's avatar
John Koleszar committed
274
275
276
277
    for (r = 0; r < rows + 8; r++) {
      sumsq += s[7 * pitch] * s[ 7 * pitch] - s[-8 * pitch] * s[-8 * pitch];
      sum  += s[7 * pitch] - s[-8 * pitch];
      d[r & 15] = s[0];
John Koleszar's avatar
John Koleszar committed
278

John Koleszar's avatar
John Koleszar committed
279
280
281
      if (sumsq * 15 - sum * sum < flimit) {
        d[r & 15] = (rv2[r & 127] + sum + s[0]) >> 4;
      }
John Koleszar's avatar
John Koleszar committed
282

John Koleszar's avatar
John Koleszar committed
283
284
      s[-8 * pitch] = d[(r - 8) & 15];
      s += pitch;
John Koleszar's avatar
John Koleszar committed
285
    }
John Koleszar's avatar
John Koleszar committed
286
  }
John Koleszar's avatar
John Koleszar committed
287
288
}

289
290
291
292
static void deblock_and_de_macro_block(YV12_BUFFER_CONFIG   *source,
                                       YV12_BUFFER_CONFIG   *post,
                                       int                   q,
                                       int                   low_var_thresh,
Jim Bankoski's avatar
Jim Bankoski committed
293
                                       int                   flag) {
John Koleszar's avatar
John Koleszar committed
294
295
296
297
298
  double level = 6.0e-05 * q * q * q - .0067 * q * q + .306 * q + .0065;
  int ppl = (int)(level + .5);
  (void) low_var_thresh;
  (void) flag;

Jim Bankoski's avatar
Jim Bankoski committed
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
  vp9_post_proc_down_and_across(source->y_buffer, post->y_buffer,
                                source->y_stride, post->y_stride,
                                source->y_height, source->y_width, ppl);

  vp9_mbpost_proc_across_ip(post->y_buffer, post->y_stride, post->y_height,
                            post->y_width, q2mbl(q));

  vp9_mbpost_proc_down(post->y_buffer, post->y_stride, post->y_height,
                       post->y_width, q2mbl(q));

  vp9_post_proc_down_and_across(source->u_buffer, post->u_buffer,
                                source->uv_stride, post->uv_stride,
                                source->uv_height, source->uv_width, ppl);
  vp9_post_proc_down_and_across(source->v_buffer, post->v_buffer,
                                source->uv_stride, post->uv_stride,
                                source->uv_height, source->uv_width, ppl);
John Koleszar's avatar
John Koleszar committed
315
316
}

317
318
319
320
321
void vp9_deblock(const YV12_BUFFER_CONFIG *src, YV12_BUFFER_CONFIG *dst,
                 int q) {
  const int ppl = (int)(6.0e-05 * q * q * q - 0.0067 * q * q + 0.306 * q
                        + 0.0065 + 0.5);
  int i;
John Koleszar's avatar
John Koleszar committed
322

323
324
325
326
327
328
329
330
331
332
333
334
335
  const uint8_t *const srcs[4] = {src->y_buffer, src->u_buffer, src->v_buffer,
                                  src->alpha_buffer};
  const int src_strides[4] = {src->y_stride, src->uv_stride, src->uv_stride,
                              src->alpha_stride};
  const int src_widths[4] = {src->y_width, src->uv_width, src->uv_width,
                             src->alpha_width};
  const int src_heights[4] = {src->y_height, src->uv_height, src->uv_height,
                              src->alpha_height};

  uint8_t *const dsts[4] = {dst->y_buffer, dst->u_buffer, dst->v_buffer,
                            dst->alpha_buffer};
  const int dst_strides[4] = {dst->y_stride, dst->uv_stride, dst->uv_stride,
                              dst->alpha_stride};
Jim Bankoski's avatar
Jim Bankoski committed
336

337
338
339
340
  for (i = 0; i < MAX_MB_PLANE; ++i)
    vp9_post_proc_down_and_across(srcs[i], dsts[i],
                                  src_strides[i], dst_strides[i],
                                  src_heights[i], src_widths[i], ppl);
John Koleszar's avatar
John Koleszar committed
341
342
}

343
344
345
346
347
348
void vp9_denoise(const YV12_BUFFER_CONFIG *src, YV12_BUFFER_CONFIG *dst,
                 int q) {
  const int ppl = (int)(6.0e-05 * q * q * q - 0.0067 * q * q + 0.306 * q
                        + 0.0065 + 0.5);
  int i;

349
350
351
352
353
354
355
356
357
358
359
360
361
  const uint8_t *const srcs[4] = {src->y_buffer, src->u_buffer, src->v_buffer,
                                  src->alpha_buffer};
  const int src_strides[4] = {src->y_stride, src->uv_stride, src->uv_stride,
                              src->alpha_stride};
  const int src_widths[4] = {src->y_width, src->uv_width, src->uv_width,
                             src->alpha_width};
  const int src_heights[4] = {src->y_height, src->uv_height, src->uv_height,
                              src->alpha_height};

  uint8_t *const dsts[4] = {dst->y_buffer, dst->u_buffer, dst->v_buffer,
                            dst->alpha_buffer};
  const int dst_strides[4] = {dst->y_stride, dst->uv_stride, dst->uv_stride,
                              dst->alpha_stride};
Jim Bankoski's avatar
Jim Bankoski committed
362

363
364
365
366
367
  for (i = 0; i < MAX_MB_PLANE; ++i) {
    const int src_stride = src_strides[i];
    const uint8_t *const src = srcs[i] + 2 * src_stride + 2;
    const int src_width = src_widths[i] - 4;
    const int src_height = src_heights[i] - 4;
Jim Bankoski's avatar
Jim Bankoski committed
368

369
370
371
372
373
374
    const int dst_stride = dst_strides[i];
    uint8_t *const dst = dsts[i] + 2 * dst_stride + 2;

    vp9_post_proc_down_and_across(src, dst, src_stride, dst_stride,
                                  src_height, src_width, ppl);
  }
John Koleszar's avatar
John Koleszar committed
375
376
}

377
double vp9_gaussian(double sigma, double mu, double x) {
John Koleszar's avatar
John Koleszar committed
378
379
  return 1 / (sigma * sqrt(2.0 * 3.14159265)) *
         (exp(-(x - mu) * (x - mu) / (2 * sigma * sigma)));
John Koleszar's avatar
John Koleszar committed
380
381
}

John Koleszar's avatar
John Koleszar committed
382
383
static void fillrd(struct postproc_state *state, int q, int a) {
  char char_dist[300];
John Koleszar's avatar
John Koleszar committed
384

John Koleszar's avatar
John Koleszar committed
385
386
  double sigma;
  int ai = a, qi = q, i;
John Koleszar's avatar
John Koleszar committed
387

388
  vp9_clear_system_state();
John Koleszar's avatar
John Koleszar committed
389

John Koleszar's avatar
John Koleszar committed
390
  sigma = ai + .5 + .6 * (63 - qi) / 63.0;
John Koleszar's avatar
John Koleszar committed
391

John Koleszar's avatar
John Koleszar committed
392
393
394
395
396
397
  /* set up a lookup table of 256 entries that matches
   * a gaussian distribution with sigma determined by q.
   */
  {
    double i;
    int next, j;
John Koleszar's avatar
John Koleszar committed
398

John Koleszar's avatar
John Koleszar committed
399
    next = 0;
John Koleszar's avatar
John Koleszar committed
400

John Koleszar's avatar
John Koleszar committed
401
    for (i = -32; i < 32; i++) {
402
      int a = (int)(.5 + 256 * vp9_gaussian(sigma, 0, i));
John Koleszar's avatar
John Koleszar committed
403

John Koleszar's avatar
John Koleszar committed
404
405
406
      if (a) {
        for (j = 0; j < a; j++) {
          char_dist[next + j] = (char) i;
John Koleszar's avatar
John Koleszar committed
407
408
        }

John Koleszar's avatar
John Koleszar committed
409
410
        next = next + j;
      }
John Koleszar's avatar
John Koleszar committed
411
412
413

    }

414
    for (; next < 256; next++)
John Koleszar's avatar
John Koleszar committed
415
416
417
418
419
420
      char_dist[next] = 0;
  }

  for (i = 0; i < 3072; i++) {
    state->noise[i] = char_dist[rand() & 0xff];
  }
John Koleszar's avatar
John Koleszar committed
421

John Koleszar's avatar
John Koleszar committed
422
423
424
425
426
427
428
429
  for (i = 0; i < 16; i++) {
    state->blackclamp[i] = -char_dist[0];
    state->whiteclamp[i] = -char_dist[0];
    state->bothclamp[i] = -2 * char_dist[0];
  }

  state->last_q = q;
  state->last_noise = a;
John Koleszar's avatar
John Koleszar committed
430
431
432
433
434
435
}

/****************************************************************************
 *
 *  ROUTINE       : plane_add_noise_c
 *
436
437
 *  INPUTS        : unsigned char *Start  starting address of buffer to
 *                                        add gaussian noise to
438
439
440
 *                  unsigned int width    width of plane
 *                  unsigned int height   height of plane
 *                  int  pitch    distance between subsequent lines of frame
John Koleszar's avatar
John Koleszar committed
441
442
443
444
445
446
447
448
449
450
451
452
 *                  int  q        quantizer used to determine amount of noise
 *                                  to add
 *
 *  OUTPUTS       : None.
 *
 *  RETURNS       : void.
 *
 *  FUNCTION      : adds gaussian noise to a plane of pixels
 *
 *  SPECIAL NOTES : None.
 *
 ****************************************************************************/
453
void vp9_plane_add_noise_c(uint8_t *start, char *noise,
John Koleszar's avatar
John Koleszar committed
454
455
456
                           char blackclamp[16],
                           char whiteclamp[16],
                           char bothclamp[16],
457
                           unsigned int width, unsigned int height, int pitch) {
John Koleszar's avatar
John Koleszar committed
458
  unsigned int i, j;
John Koleszar's avatar
John Koleszar committed
459

460
461
462
  for (i = 0; i < height; i++) {
    uint8_t *pos = start + i * pitch;
    char  *ref = (char *)(noise + (rand() & 0xff));  // NOLINT
John Koleszar's avatar
John Koleszar committed
463

464
465
466
    for (j = 0; j < width; j++) {
      if (pos[j] < blackclamp[0])
        pos[j] = blackclamp[0];
John Koleszar's avatar
John Koleszar committed
467

468
469
      if (pos[j] > 255 + whiteclamp[0])
        pos[j] = 255 + whiteclamp[0];
John Koleszar's avatar
John Koleszar committed
470

471
      pos[j] += ref[j];
John Koleszar's avatar
John Koleszar committed
472
    }
John Koleszar's avatar
John Koleszar committed
473
  }
John Koleszar's avatar
John Koleszar committed
474
475
}

476
477
478
479
/* Blend the macro block with a solid colored square.  Leave the
 * edges unblended to give distinction to macro blocks in areas
 * filled with the same color block.
 */
480
void vp9_blend_mb_inner_c(uint8_t *y, uint8_t *u, uint8_t *v,
John Koleszar's avatar
John Koleszar committed
481
482
483
484
485
486
487
488
489
490
                          int y1, int u1, int v1, int alpha, int stride) {
  int i, j;
  int y1_const = y1 * ((1 << 16) - alpha);
  int u1_const = u1 * ((1 << 16) - alpha);
  int v1_const = v1 * ((1 << 16) - alpha);

  y += 2 * stride + 2;
  for (i = 0; i < 12; i++) {
    for (j = 0; j < 12; j++) {
      y[j] = (y[j] * alpha + y1_const) >> 16;
491
    }
John Koleszar's avatar
John Koleszar committed
492
493
    y += stride;
  }
494

John Koleszar's avatar
John Koleszar committed
495
  stride >>= 1;
496

John Koleszar's avatar
John Koleszar committed
497
498
  u += stride + 1;
  v += stride + 1;
499

John Koleszar's avatar
John Koleszar committed
500
501
502
503
  for (i = 0; i < 6; i++) {
    for (j = 0; j < 6; j++) {
      u[j] = (u[j] * alpha + u1_const) >> 16;
      v[j] = (v[j] * alpha + v1_const) >> 16;
504
    }
John Koleszar's avatar
John Koleszar committed
505
506
507
    u += stride;
    v += stride;
  }
508
}
John Koleszar's avatar
John Koleszar committed
509

510
511
512
/* Blend only the edge of the macro block.  Leave center
 * unblended to allow for other visualizations to be layered.
 */
513
void vp9_blend_mb_outer_c(uint8_t *y, uint8_t *u, uint8_t *v,
John Koleszar's avatar
John Koleszar committed
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
                          int y1, int u1, int v1, int alpha, int stride) {
  int i, j;
  int y1_const = y1 * ((1 << 16) - alpha);
  int u1_const = u1 * ((1 << 16) - alpha);
  int v1_const = v1 * ((1 << 16) - alpha);

  for (i = 0; i < 2; i++) {
    for (j = 0; j < 16; j++) {
      y[j] = (y[j] * alpha + y1_const) >> 16;
    }
    y += stride;
  }

  for (i = 0; i < 12; i++) {
    y[0]  = (y[0] * alpha  + y1_const) >> 16;
    y[1]  = (y[1] * alpha  + y1_const) >> 16;
    y[14] = (y[14] * alpha + y1_const) >> 16;
    y[15] = (y[15] * alpha + y1_const) >> 16;
    y += stride;
  }

  for (i = 0; i < 2; i++) {
    for (j = 0; j < 16; j++) {
      y[j] = (y[j] * alpha + y1_const) >> 16;
    }
    y += stride;
  }

  stride >>= 1;

  for (j = 0; j < 8; j++) {
    u[j] = (u[j] * alpha + u1_const) >> 16;
    v[j] = (v[j] * alpha + v1_const) >> 16;
  }
  u += stride;
  v += stride;

  for (i = 0; i < 6; i++) {
    u[0] = (u[0] * alpha + u1_const) >> 16;
    v[0] = (v[0] * alpha + v1_const) >> 16;

    u[7] = (u[7] * alpha + u1_const) >> 16;
    v[7] = (v[7] * alpha + v1_const) >> 16;
557
558
559

    u += stride;
    v += stride;
John Koleszar's avatar
John Koleszar committed
560
  }
561

John Koleszar's avatar
John Koleszar committed
562
563
564
565
  for (j = 0; j < 8; j++) {
    u[j] = (u[j] * alpha + u1_const) >> 16;
    v[j] = (v[j] * alpha + v1_const) >> 16;
  }
566
567
}

568
void vp9_blend_b_c(uint8_t *y, uint8_t *u, uint8_t *v,
John Koleszar's avatar
John Koleszar committed
569
570
571
572
573
574
575
576
577
                   int y1, int u1, int v1, int alpha, int stride) {
  int i, j;
  int y1_const = y1 * ((1 << 16) - alpha);
  int u1_const = u1 * ((1 << 16) - alpha);
  int v1_const = v1 * ((1 << 16) - alpha);

  for (i = 0; i < 4; i++) {
    for (j = 0; j < 4; j++) {
      y[j] = (y[j] * alpha + y1_const) >> 16;
578
    }
John Koleszar's avatar
John Koleszar committed
579
580
    y += stride;
  }
581

John Koleszar's avatar
John Koleszar committed
582
  stride >>= 1;
583

John Koleszar's avatar
John Koleszar committed
584
585
586
587
  for (i = 0; i < 2; i++) {
    for (j = 0; j < 2; j++) {
      u[j] = (u[j] * alpha + u1_const) >> 16;
      v[j] = (v[j] * alpha + v1_const) >> 16;
588
    }
John Koleszar's avatar
John Koleszar committed
589
590
591
    u += stride;
    v += stride;
  }
592
593
}

594
595
static void constrain_line(int x0, int *x1, int y0, int *y1,
                           int width, int height) {
John Koleszar's avatar
John Koleszar committed
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
  int dx;
  int dy;

  if (*x1 > width) {
    dx = *x1 - x0;
    dy = *y1 - y0;

    *x1 = width;
    if (dx)
      *y1 = ((width - x0) * dy) / dx + y0;
  }
  if (*x1 < 0) {
    dx = *x1 - x0;
    dy = *y1 - y0;

    *x1 = 0;
    if (dx)
      *y1 = ((0 - x0) * dy) / dx + y0;
  }
  if (*y1 > height) {
    dx = *x1 - x0;
    dy = *y1 - y0;

    *y1 = height;
    if (dy)
      *x1 = ((height - y0) * dx) / dy + x0;
  }
  if (*y1 < 0) {
    dx = *x1 - x0;
    dy = *y1 - y0;

    *y1 = 0;
    if (dy)
      *x1 = ((0 - y0) * dx) / dy + x0;
  }
631
632
}

633
int vp9_post_proc_frame(struct VP9Common *oci,
634
635
                        YV12_BUFFER_CONFIG *dest, vp9_ppflags_t *ppflags) {
  int q = oci->lf.filter_level * 10 / 6;
John Koleszar's avatar
John Koleszar committed
636
637
638
  int flags = ppflags->post_proc_flag;
  int deblock_level = ppflags->deblocking_level;
  int noise_level = ppflags->noise_level;
John Koleszar's avatar
John Koleszar committed
639

John Koleszar's avatar
John Koleszar committed
640
641
  if (!oci->frame_to_show)
    return -1;
John Koleszar's avatar
John Koleszar committed
642

John Koleszar's avatar
John Koleszar committed
643
644
  if (q > 63)
    q = 63;
John Koleszar's avatar
John Koleszar committed
645

John Koleszar's avatar
John Koleszar committed
646
647
648
649
  if (!flags) {
    *dest = *oci->frame_to_show;
    return 0;
  }
John Koleszar's avatar
John Koleszar committed
650
651

#if ARCH_X86||ARCH_X86_64
John Koleszar's avatar
John Koleszar committed
652
  vpx_reset_mmx_state();
John Koleszar's avatar
John Koleszar committed
653
654
#endif

655
656
  if (flags & VP9D_DEMACROBLOCK) {
    deblock_and_de_macro_block(oci->frame_to_show, &oci->post_proc_buffer,
Jim Bankoski's avatar
Jim Bankoski committed
657
                               q + (deblock_level - 5) * 10, 1, 0);
658
  } else if (flags & VP9D_DEBLOCK) {
659
    vp9_deblock(oci->frame_to_show, &oci->post_proc_buffer, q);
John Koleszar's avatar
John Koleszar committed
660
  } else {
John Koleszar's avatar
John Koleszar committed
661
    vp8_yv12_copy_frame(oci->frame_to_show, &oci->post_proc_buffer);
John Koleszar's avatar
John Koleszar committed
662
663
  }

664
  if (flags & VP9D_ADDNOISE) {
John Koleszar's avatar
John Koleszar committed
665
666
667
668
669
    if (oci->postproc_state.last_q != q
        || oci->postproc_state.last_noise != noise_level) {
      fillrd(&oci->postproc_state, 63 - q, noise_level);
    }

Jim Bankoski's avatar
Jim Bankoski committed
670
671
672
673
674
675
676
677
    vp9_plane_add_noise(oci->post_proc_buffer.y_buffer,
                        oci->postproc_state.noise,
                        oci->postproc_state.blackclamp,
                        oci->postproc_state.whiteclamp,
                        oci->postproc_state.bothclamp,
                        oci->post_proc_buffer.y_width,
                        oci->post_proc_buffer.y_height,
                        oci->post_proc_buffer.y_stride);
John Koleszar's avatar
John Koleszar committed
678
  }
John Koleszar's avatar
John Koleszar committed
679

680
#if 0 && CONFIG_POSTPROC_VISUALIZER
681
  if (flags & VP9D_DEBUG_TXT_FRAME_INFO) {
John Koleszar's avatar
John Koleszar committed
682
683
684
685
686
687
688
689
    char message[512];
    sprintf(message, "F%1dG%1dQ%3dF%3dP%d_s%dx%d",
            (oci->frame_type == KEY_FRAME),
            oci->refresh_golden_frame,
            oci->base_qindex,
            oci->filter_level,
            flags,
            oci->mb_cols, oci->mb_rows);
690
691
    vp9_blit_text(message, oci->post_proc_buffer.y_buffer,
                  oci->post_proc_buffer.y_stride);
John Koleszar's avatar
John Koleszar committed
692
693
  }

694
  if (flags & VP9D_DEBUG_TXT_MBLK_MODES) {
John Koleszar's avatar
John Koleszar committed
695
    int i, j;
696
    uint8_t *y_ptr;
John Koleszar's avatar
John Koleszar committed
697
698
699
700
701
    YV12_BUFFER_CONFIG *post = &oci->post_proc_buffer;
    int mb_rows = post->y_height >> 4;
    int mb_cols = post->y_width  >> 4;
    int mb_index = 0;
    MODE_INFO *mi = oci->mi;
John Koleszar's avatar
John Koleszar committed
702

John Koleszar's avatar
John Koleszar committed
703
    y_ptr = post->y_buffer + 4 * post->y_stride + 4;
John Koleszar's avatar
John Koleszar committed
704

705
    /* vp9_filter each macro block */
John Koleszar's avatar
John Koleszar committed
706
707
708
    for (i = 0; i < mb_rows; i++) {
      for (j = 0; j < mb_cols; j++) {
        char zz[4];
709

John Koleszar's avatar
John Koleszar committed
710
        sprintf(zz, "%c", mi[mb_index].mbmi.mode + 'a');
John Koleszar's avatar
John Koleszar committed
711

712
        vp9_blit_text(zz, y_ptr, post->y_stride);
John Koleszar's avatar
John Koleszar committed
713
714
715
        mb_index++;
        y_ptr += 16;
      }
John Koleszar's avatar
John Koleszar committed
716

John Koleszar's avatar
John Koleszar committed
717
718
      mb_index++; /* border */
      y_ptr += post->y_stride  * 16 - post->y_width;
719

John Koleszar's avatar
John Koleszar committed
720
    }
John Koleszar's avatar
John Koleszar committed
721
  }
722

723
  if (flags & VP9D_DEBUG_TXT_DC_DIFF) {
John Koleszar's avatar
John Koleszar committed
724
    int i, j;
725
    uint8_t *y_ptr;
John Koleszar's avatar
John Koleszar committed
726
727
728
729
730
731
732
733
    YV12_BUFFER_CONFIG *post = &oci->post_proc_buffer;
    int mb_rows = post->y_height >> 4;
    int mb_cols = post->y_width  >> 4;
    int mb_index = 0;
    MODE_INFO *mi = oci->mi;

    y_ptr = post->y_buffer + 4 * post->y_stride + 4;

734
    /* vp9_filter each macro block */
John Koleszar's avatar
John Koleszar committed
735
736
737
    for (i = 0; i < mb_rows; i++) {
      for (j = 0; j < mb_cols; j++) {
        char zz[4];
Yaowu Xu's avatar
Yaowu Xu committed
738
        int dc_diff = !(mi[mb_index].mbmi.mode != I4X4_PRED &&
John Koleszar's avatar
John Koleszar committed
739
                        mi[mb_index].mbmi.mode != SPLITMV &&
Paul Wilkins's avatar
Paul Wilkins committed
740
                        mi[mb_index].mbmi.skip_coeff);
John Koleszar's avatar
John Koleszar committed
741
742
743
744
745
746

        if (oci->frame_type == KEY_FRAME)
          sprintf(zz, "a");
        else
          sprintf(zz, "%c", dc_diff + '0');

747
        vp9_blit_text(zz, y_ptr, post->y_stride);
John Koleszar's avatar
John Koleszar committed
748
749
750
751
752
753
754
755
756
757
        mb_index++;
        y_ptr += 16;
      }

      mb_index++; /* border */
      y_ptr += post->y_stride  * 16 - post->y_width;

    }
  }

758
  if (flags & VP9D_DEBUG_TXT_RATE_INFO) {
John Koleszar's avatar
John Koleszar committed
759
    char message[512];
760
    snprintf(message, sizeof(message),
James Zern's avatar
James Zern committed
761
             "Bitrate: %10.2f framerate: %10.2f ",
762
763
764
             oci->bitrate, oci->framerate);
    vp9_blit_text(message, oci->post_proc_buffer.y_buffer,
                  oci->post_proc_buffer.y_stride);
John Koleszar's avatar
John Koleszar committed
765
766
767
  }

  /* Draw motion vectors */
768
  if ((flags & VP9D_DEBUG_DRAW_MV) && ppflags->display_mv_flag) {
John Koleszar's avatar
John Koleszar committed
769
770
771
    YV12_BUFFER_CONFIG *post = &oci->post_proc_buffer;
    int width  = post->y_width;
    int height = post->y_height;
772
    uint8_t *y_buffer = oci->post_proc_buffer.y_buffer;
John Koleszar's avatar
John Koleszar committed
773
774
775
776
777
778
779
780
781
782
783
784
    int y_stride = oci->post_proc_buffer.y_stride;
    MODE_INFO *mi = oci->mi;
    int x0, y0;

    for (y0 = 0; y0 < height; y0 += 16) {
      for (x0 = 0; x0 < width; x0 += 16) {
        int x1, y1;

        if (!(ppflags->display_mv_flag & (1 << mi->mbmi.mode))) {
          mi++;
          continue;
        }
785

John Koleszar's avatar
John Koleszar committed
786
787
        if (mi->mbmi.mode == SPLITMV) {
          switch (mi->mbmi.partitioning) {
788
            case PARTITIONING_16X8 : {  /* mv_top_bottom */
John Koleszar's avatar
John Koleszar committed
789
790
              union b_mode_info *bmi = &mi->bmi[0];
              MV *mv = &bmi->mv.as_mv;
791

John Koleszar's avatar
John Koleszar committed
792
793
              x1 = x0 + 8 + (mv->col >> 3);
              y1 = y0 + 4 + (mv->row >> 3);
794

John Koleszar's avatar
John Koleszar committed
795
              constrain_line(x0 + 8, &x1, y0 + 4, &y1, width, height);
796
              vp9_blit_line(x0 + 8,  x1, y0 + 4,  y1, y_buffer, y_stride);
797

John Koleszar's avatar
John Koleszar committed
798
              bmi = &mi->bmi[8];
799

John Koleszar's avatar
John Koleszar committed
800
801
              x1 = x0 + 8 + (mv->col >> 3);
              y1 = y0 + 12 + (mv->row >> 3);
802

John Koleszar's avatar
John Koleszar committed
803
              constrain_line(x0 + 8, &x1, y0 + 12, &y1, width, height);
804
              vp9_blit_line(x0 + 8,  x1, y0 + 12,  y1, y_buffer, y_stride);
805

John Koleszar's avatar
John Koleszar committed
806
807
              break;
            }
808
            case PARTITIONING_8X16 : {  /* mv_left_right */
John Koleszar's avatar
John Koleszar committed
809
810
              union b_mode_info *bmi = &mi->bmi[0];
              MV *mv = &bmi->mv.as_mv;
811

John Koleszar's avatar
John Koleszar committed
812
813
              x1 = x0 + 4 + (mv->col >> 3);
              y1 = y0 + 8 + (mv->row >> 3);
814

John Koleszar's avatar
John Koleszar committed
815
              constrain_line(x0 + 4, &x1, y0 + 8, &y1, width, height);
816
              vp9_blit_line(x0 + 4,  x1, y0 + 8,  y1, y_buffer, y_stride);
817

John Koleszar's avatar
John Koleszar committed
818
              bmi = &mi->bmi[2];
819

John Koleszar's avatar
John Koleszar committed
820
821
              x1 = x0 + 12 + (mv->col >> 3);
              y1 = y0 + 8 + (mv->row >> 3);
822

John Koleszar's avatar
John Koleszar committed
823
              constrain_line(x0 + 12, &x1, y0 + 8, &y1, width, height);
824
              vp9_blit_line(x0 + 12,  x1, y0 + 8,  y1, y_buffer, y_stride);
825

John Koleszar's avatar
John Koleszar committed
826
827
              break;
            }
828
            case PARTITIONING_8X8 : {  /* mv_quarters   */
John Koleszar's avatar
John Koleszar committed
829
830
              union b_mode_info *bmi = &mi->bmi[0];
              MV *mv = &bmi->mv.as_mv;
831

John Koleszar's avatar
John Koleszar committed
832
833
              x1 = x0 + 4 + (mv->col >> 3);
              y1 = y0 + 4 + (mv->row >> 3);
834

John Koleszar's avatar
John Koleszar committed
835
              constrain_line(x0 + 4, &x1, y0 + 4, &y1, width, height);
836
              vp9_blit_line(x0 + 4,  x1, y0 + 4,  y1, y_buffer, y_stride);
837

John Koleszar's avatar
John Koleszar committed
838
              bmi = &mi->bmi[2];
839

John Koleszar's avatar
John Koleszar committed
840
841
              x1 = x0 + 12 + (mv->col >> 3);
              y1 = y0 + 4 + (mv->row >> 3);
842

John Koleszar's avatar
John Koleszar committed
843
              constrain_line(x0 + 12, &x1, y0 + 4, &y1, width, height);
844
              vp9_blit_line(x0 + 12,  x1, y0 + 4,  y1, y_buffer, y_stride);
845

John Koleszar's avatar
John Koleszar committed
846
              bmi = &mi->bmi[8];
847

John Koleszar's avatar
John Koleszar committed
848
849
              x1 = x0 + 4 + (mv->col >> 3);
              y1 = y0 + 12 + (mv->row >> 3);
850

John Koleszar's avatar
John Koleszar committed
851
              constrain_line(x0 + 4, &x1, y0 + 12, &y1, width, height);
852
              vp9_blit_line(x0 + 4,  x1, y0 + 12,  y1, y_buffer, y_stride);
853

John Koleszar's avatar
John Koleszar committed
854
              bmi = &mi->bmi[10];
855

John Koleszar's avatar
John Koleszar committed
856
857
              x1 = x0 + 12 + (mv->col >> 3);
              y1 = y0 + 12 + (mv->row >> 3);
858

John Koleszar's avatar
John Koleszar committed
859
              constrain_line(x0 + 12, &x1, y0 + 12, &y1, width, height);
860
              vp9_blit_line(x0 + 12,  x1, y0 + 12,  y1, y_buffer, y_stride);
John Koleszar's avatar
John Koleszar committed
861
862
              break;
            }
863
            case PARTITIONING_4X4:
John Koleszar's avatar
John Koleszar committed
864
865
866
            default : {
              union b_mode_info *bmi = mi->bmi;
              int bx0, by0;
867

John Koleszar's avatar
John Koleszar committed
868
869
870
              for (by0 = y0; by0 < (y0 + 16); by0 += 4) {
                for (bx0 = x0; bx0 < (x0 + 16); bx0 += 4) {
                  MV *mv = &bmi->mv.as_mv;
871

John Koleszar's avatar
John Koleszar committed
872
873
                  x1 = bx0 + 2 + (mv->col >> 3);
                  y1 = by0 + 2 + (mv->row >> 3);
874

John Koleszar's avatar
John Koleszar committed
875
                  constrain_line(bx0 + 2, &x1, by0 + 2, &y1, width, height);
876
                  vp9_blit_line(bx0 + 2,  x1, by0 + 2,  y1, y_buffer, y_stride);
877

John Koleszar's avatar
John Koleszar committed
878
                  bmi++;
879
                }
John Koleszar's avatar
John Koleszar committed
880
              }
881
            }
John Koleszar's avatar
John Koleszar committed
882
883
884
885
886
887
888
889
890
891
892
          }
        } else if (mi->mbmi.mode >= NEARESTMV) {
          MV *mv = &mi->mbmi.mv.as_mv;
          const int lx0 = x0 + 8;
          const int ly0 = y0 + 8;

          x1 = lx0 + (mv->col >> 3);
          y1 = ly0 + (mv->row >> 3);

          if (x1 != lx0 && y1 != ly0) {
            constrain_line(lx0, &x1, ly0 - 1, &y1, width, height);
893
            vp9_blit_line(lx0,  x1, ly0 - 1,  y1, y_buffer, y_stride);
John Koleszar's avatar
John Koleszar committed
894
895

            constrain_line(lx0, &x1, ly0 + 1, &y1, width, height);
896
            vp9_blit_line(lx0,  x1, ly0 + 1,  y1, y_buffer, y_stride);
John Koleszar's avatar
John Koleszar committed
897
          } else
898
            vp9_blit_line(lx0,  x1, ly0,  y1, y_buffer, y_stride);
899
        }
John Koleszar's avatar
John Koleszar committed
900

John Koleszar's avatar
John Koleszar committed
901
902
903
904
905
906
907
        mi++;
      }
      mi++;
    }
  }

  /* Color in block modes */
908
  if ((flags & VP9D_DEBUG_CLR_BLK_MODES)
John Koleszar's avatar
John Koleszar committed
909
910
911
912
913
      && (ppflags->display_mb_modes_flag || ppflags->display_b_modes_flag)) {
    int y, x;
    YV12_BUFFER_CONFIG *post = &oci->post_proc_buffer;
    int width  = post->y_width;
    int height = post->y_height;
914
915
916
    uint8_t *y_ptr = oci->post_proc_buffer.y_buffer;
    uint8_t *u_ptr = oci->post_proc_buffer.u_buffer;
    uint8_t *v_ptr = oci->post_proc_buffer.v_buffer;
John Koleszar's avatar
John Koleszar committed
917
918
919
920
921
922
923
    int y_stride = oci->post_proc_buffer.y_stride;
    MODE_INFO *mi = oci->mi;

    for (y = 0; y < height; y += 16) {
      for (x = 0; x < width; x += 16) {
        int Y = 0, U = 0, V = 0;

Yaowu Xu's avatar
Yaowu Xu committed
924
925
        if (mi->mbmi.mode == I4X4_PRED &&
            ((ppflags->display_mb_modes_flag & I4X4_PRED) ||
926
             ppflags->display_b_modes_flag)) {
John Koleszar's avatar
John Koleszar committed
927
          int by, bx;
928
          uint8_t *yl, *ul, *vl;
John Koleszar's avatar
John Koleszar committed
929
930
931
932
933
934
935
936
937
          union b_mode_info *bmi = mi->bmi;

          yl = y_ptr + x;
          ul = u_ptr + (x >> 1);
          vl = v_ptr + (x >> 1);

          for (by = 0; by < 16; by += 4) {
            for (bx = 0; bx < 16; bx += 4) {
              if ((ppflags->display_b_modes_flag & (1 << mi->mbmi.mode))
Yaowu Xu's avatar
Yaowu Xu committed
938
                  || (ppflags->display_mb_modes_flag & I4X4_PRED)) {
939
940
941
                Y = B_PREDICTION_MODE_colors[bmi->as_mode][0];
                U = B_PREDICTION_MODE_colors[bmi->as_mode][1];
                V = B_PREDICTION_MODE_colors[bmi->as_mode][2];
John Koleszar's avatar
John Koleszar committed
942

Jim Bankoski's avatar
Jim Bankoski committed
943
944
                vp9_blend_b(yl + bx, ul + (bx >> 1), vl + (bx >> 1), Y, U, V,
                    0xc000, y_stride);
John Koleszar's avatar
John Koleszar committed
945
946
              }
              bmi++;
947
948
            }

John Koleszar's avatar
John Koleszar committed
949
950
951
952
953
954
955
956
957
            yl += y_stride * 4;
            ul += y_stride * 1;
            vl += y_stride * 1;
          }
        } else if (ppflags->display_mb_modes_flag & (1 << mi->mbmi.mode)) {
          Y = MB_PREDICTION_MODE_colors[mi->mbmi.mode][0];
          U = MB_PREDICTION_MODE_colors[mi->mbmi.mode][1];
          V = MB_PREDICTION_MODE_colors[mi->mbmi.mode][2];

Jim Bankoski's avatar
Jim Bankoski committed
958
959
          vp9_blend_mb_inner(y_ptr + x, u_ptr + (x >> 1), v_ptr + (x >> 1),
                             Y, U, V, 0xc000, y_stride);
960
961
        }

John Koleszar's avatar
John Koleszar committed
962
963
964
965
966
967
968
969
970
971
972
        mi++;
      }
      y_ptr += y_stride * 16;
      u_ptr += y_stride * 4;
      v_ptr += y_stride * 4;

      mi++;
    }
  }

  /* Color in frame reference blocks */
973
974
  if ((flags & VP9D_DEBUG_CLR_FRM_REF_BLKS) &&
      ppflags->display_ref_frame_flag) {
John Koleszar's avatar
John Koleszar committed
975
976
977
978
    int y, x;
    YV12_BUFFER_CONFIG *post = &oci->post_proc_buffer;
    int width  = post->y_width;
    int height = post->y_height;
979
980
981
    uint8_t *y_ptr = oci->post_proc_buffer.y_buffer;
    uint8_t *u_ptr = oci->post_proc_buffer.u_buffer;
    uint8_t *v_ptr = oci->post_proc_buffer.v_buffer;
John Koleszar's avatar
John Koleszar committed
982
983
984
985
986
987
988
989
990
991
992
993
    int y_stride = oci->post_proc_buffer.y_stride;
    MODE_INFO *mi = oci->mi;

    for (y = 0; y < height; y += 16) {
      for (x = 0; x < width; x += 16) {
        int Y = 0, U = 0, V = 0;

        if (ppflags->display_ref_frame_flag & (1 << mi->mbmi.ref_frame)) {
          Y = MV_REFERENCE_FRAME_colors[mi->mbmi.ref_frame][0];
          U = MV_REFERENCE_FRAME_colors[mi->mbmi.ref_frame][1];
          V = MV_REFERENCE_FRAME_colors[mi->mbmi.ref_frame][2];

Jim Bankoski's avatar
Jim Bankoski committed
994
995
          vp9_blend_mb_outer(y_ptr + x, u_ptr + (x >> 1), v_ptr + (x >> 1),
                             Y, U, V, 0xc000, y_stride);
John Koleszar's avatar
John Koleszar committed
996
        }
997

John Koleszar's avatar
John Koleszar committed
998
999
1000
1001
1002
        mi++;
      }
      y_ptr += y_stride * 16;
      u_ptr += y_stride * 4;
      v_ptr += y_stride * 4;
1003

John Koleszar's avatar
John Koleszar committed
1004
      mi++;
1005
    }
John Koleszar's avatar
John Koleszar committed
1006
  }
1007
#endif
1008

John Koleszar's avatar
John Koleszar committed
1009
  *dest = oci->post_proc_buffer;
John Koleszar's avatar
John Koleszar committed
1010

John Koleszar's avatar
John Koleszar committed
1011
  /* handle problem with extending borders */
1012
1013
  dest->y_width = oci->width;
  dest->y_height = oci->height;
John Koleszar's avatar
John Koleszar committed
1014
  dest->uv_height = dest->y_height / 2;
1015

John Koleszar's avatar
John Koleszar committed
1016
  return 0;
John Koleszar's avatar
John Koleszar committed
1017
}