vp9_postproc.c 28.3 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
13
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
John Koleszar's avatar
John Koleszar committed
14

15
#include "./vpx_config.h"
Dmitry Kovalev's avatar
Dmitry Kovalev committed
16
17
18
19
#include "./vpx_scale_rtcd.h"
#include "./vp9_rtcd.h"

#include "vpx_scale/vpx_scale.h"
John Koleszar's avatar
John Koleszar committed
20
#include "vpx_scale/yv12config.h"
Dmitry Kovalev's avatar
Dmitry Kovalev committed
21
22

#include "vp9/common/vp9_onyxc_int.h"
23
24
#include "vp9/common/vp9_postproc.h"
#include "vp9/common/vp9_systemdependent.h"
Dmitry Kovalev's avatar
Dmitry Kovalev committed
25
#include "vp9/common/vp9_textblit.h"
Jim Bankoski's avatar
Jim Bankoski committed
26

27
28
29
30
31
32
33
#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)
34

35
/* global constants */
36
#if 0 && CONFIG_POSTPROC_VISUALIZER
John Koleszar's avatar
John Koleszar committed
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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 */
55
56
};

57
static const unsigned char B_PREDICTION_MODE_colors[INTRA_MODES][3] = {
John Koleszar's avatar
John Koleszar committed
58
59
60
61
62
63
64
65
66
67
68
69
70
71
  { 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 */
72
73
};

John Koleszar's avatar
John Koleszar committed
74
75
76
77
78
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 */
79
};
80
#endif
81

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

86
const short vp9_rv[] = {
John Koleszar's avatar
John Koleszar committed
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
130
  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
131
132
};

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

John Koleszar's avatar
John Koleszar committed
150
151
152
153
  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
154

John Koleszar's avatar
John Koleszar committed
155
156
157
    for (col = 0; col < cols; col++) {
      int kernel = 4;
      int v = p_src[col];
John Koleszar's avatar
John Koleszar committed
158

John Koleszar's avatar
John Koleszar committed
159
160
161
      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
162

John Koleszar's avatar
John Koleszar committed
163
164
        kernel += kernel5[2 + i] * p_src[col + i * pitch];
      }
John Koleszar's avatar
John Koleszar committed
165

John Koleszar's avatar
John Koleszar committed
166
167
168
169
      v = (kernel >> 3);
    down_skip_convolve:
      p_dst[col] = v;
    }
John Koleszar's avatar
John Koleszar committed
170

John Koleszar's avatar
John Koleszar committed
171
172
173
    /* now post_proc_across */
    p_src = dst_ptr;
    p_dst = dst_ptr;
John Koleszar's avatar
John Koleszar committed
174

John Koleszar's avatar
John Koleszar committed
175
176
    for (i = 0; i < 8; i++)
      d[i] = p_src[i];
John Koleszar's avatar
John Koleszar committed
177

John Koleszar's avatar
John Koleszar committed
178
179
180
181
182
183
184
185
186
    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
187

John Koleszar's avatar
John Koleszar committed
188
189
        kernel += kernel5[2 + i] * p_src[col + i];
      }
John Koleszar's avatar
John Koleszar committed
190

John Koleszar's avatar
John Koleszar committed
191
192
      d[col & 7] = (kernel >> 3);
    across_skip_convolve:
John Koleszar's avatar
John Koleszar committed
193

John Koleszar's avatar
John Koleszar committed
194
195
      if (col >= 2)
        p_dst[col - 2] = d[(col - 2) & 7];
John Koleszar's avatar
John Koleszar committed
196
197
    }

John Koleszar's avatar
John Koleszar committed
198
199
200
201
    /* 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
202

John Koleszar's avatar
John Koleszar committed
203
204
205
206
    /* next row */
    src_ptr += pitch;
    dst_ptr += pitch;
  }
John Koleszar's avatar
John Koleszar committed
207
208
}

John Koleszar's avatar
John Koleszar committed
209
210
static int q2mbl(int x) {
  if (x < 20) x = 20;
John Koleszar's avatar
John Koleszar committed
211

John Koleszar's avatar
John Koleszar committed
212
213
214
  x = 50 + (x - 50) * 10 / 8;
  return x * x / 3;
}
215

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

220
221
  uint8_t *s = src;
  uint8_t d[16];
John Koleszar's avatar
John Koleszar committed
222
223


John Koleszar's avatar
John Koleszar committed
224
225
226
  for (r = 0; r < rows; r++) {
    int sumsq = 0;
    int sum   = 0;
John Koleszar's avatar
John Koleszar committed
227

John Koleszar's avatar
John Koleszar committed
228
229
230
231
232
    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
233

John Koleszar's avatar
John Koleszar committed
234
235
236
    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
237

John Koleszar's avatar
John Koleszar committed
238
239
      sum  += x;
      sumsq += x * y;
John Koleszar's avatar
John Koleszar committed
240

John Koleszar's avatar
John Koleszar committed
241
242
243
244
245
      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
246

John Koleszar's avatar
John Koleszar committed
247
      s[c - 8] = d[(c - 8) & 15];
John Koleszar's avatar
John Koleszar committed
248
    }
John Koleszar's avatar
John Koleszar committed
249
250
251

    s += pitch;
  }
John Koleszar's avatar
John Koleszar committed
252
253
}

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

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

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

John Koleszar's avatar
John Koleszar committed
271
272
273
274
    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
275

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

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

286
287
288
289
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
290
                                       int                   flag) {
John Koleszar's avatar
John Koleszar committed
291
292
293
294
295
  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
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
  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
312
313
}

314
315
316
317
318
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
319

320
321
322
323
324
325
326
327
328
329
330
331
332
  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
333

334
335
336
337
  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
338
339
}

340
341
342
343
344
345
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;

346
347
348
349
350
351
352
353
354
355
356
357
358
  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
359

360
361
362
363
364
  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
365

366
367
368
369
370
371
    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
372
373
}

Dmitry Kovalev's avatar
Dmitry Kovalev committed
374
static double gaussian(double sigma, double mu, double x) {
John Koleszar's avatar
John Koleszar committed
375
376
  return 1 / (sigma * sqrt(2.0 * 3.14159265)) *
         (exp(-(x - mu) * (x - mu) / (2 * sigma * sigma)));
John Koleszar's avatar
John Koleszar committed
377
378
}

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

John Koleszar's avatar
John Koleszar committed
382
383
  double sigma;
  int ai = a, qi = q, i;
John Koleszar's avatar
John Koleszar committed
384

385
  vp9_clear_system_state();
John Koleszar's avatar
John Koleszar committed
386

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

John Koleszar's avatar
John Koleszar committed
389
390
391
392
393
394
  /* 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
395

John Koleszar's avatar
John Koleszar committed
396
    next = 0;
John Koleszar's avatar
John Koleszar committed
397

John Koleszar's avatar
John Koleszar committed
398
    for (i = -32; i < 32; i++) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
399
      int a = (int)(0.5 + 256 * gaussian(sigma, 0, i));
John Koleszar's avatar
John Koleszar committed
400

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

John Koleszar's avatar
John Koleszar committed
406
407
        next = next + j;
      }
John Koleszar's avatar
John Koleszar committed
408
409
    }

410
    for (; next < 256; next++)
John Koleszar's avatar
John Koleszar committed
411
412
413
414
      char_dist[next] = 0;
  }

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

John Koleszar's avatar
John Koleszar committed
418
419
420
421
422
423
424
425
  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
426
427
}

428
void vp9_plane_add_noise_c(uint8_t *start, char *noise,
John Koleszar's avatar
John Koleszar committed
429
430
431
                           char blackclamp[16],
                           char whiteclamp[16],
                           char bothclamp[16],
432
                           unsigned int width, unsigned int height, int pitch) {
John Koleszar's avatar
John Koleszar committed
433
  unsigned int i, j;
John Koleszar's avatar
John Koleszar committed
434

435
436
437
  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
438

439
440
441
    for (j = 0; j < width; j++) {
      if (pos[j] < blackclamp[0])
        pos[j] = blackclamp[0];
John Koleszar's avatar
John Koleszar committed
442

443
444
      if (pos[j] > 255 + whiteclamp[0])
        pos[j] = 255 + whiteclamp[0];
John Koleszar's avatar
John Koleszar committed
445

446
      pos[j] += ref[j];
John Koleszar's avatar
John Koleszar committed
447
    }
John Koleszar's avatar
John Koleszar committed
448
  }
John Koleszar's avatar
John Koleszar committed
449
450
}

451
452
453
454
/* 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.
 */
455
void vp9_blend_mb_inner_c(uint8_t *y, uint8_t *u, uint8_t *v,
John Koleszar's avatar
John Koleszar committed
456
457
458
459
460
461
462
463
464
465
                          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;
466
    }
John Koleszar's avatar
John Koleszar committed
467
468
    y += stride;
  }
469

John Koleszar's avatar
John Koleszar committed
470
  stride >>= 1;
471

John Koleszar's avatar
John Koleszar committed
472
473
  u += stride + 1;
  v += stride + 1;
474

John Koleszar's avatar
John Koleszar committed
475
476
477
478
  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;
479
    }
John Koleszar's avatar
John Koleszar committed
480
481
482
    u += stride;
    v += stride;
  }
483
}
John Koleszar's avatar
John Koleszar committed
484

485
486
487
/* Blend only the edge of the macro block.  Leave center
 * unblended to allow for other visualizations to be layered.
 */
488
void vp9_blend_mb_outer_c(uint8_t *y, uint8_t *u, uint8_t *v,
John Koleszar's avatar
John Koleszar committed
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
                          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;
532
533
534

    u += stride;
    v += stride;
John Koleszar's avatar
John Koleszar committed
535
  }
536

John Koleszar's avatar
John Koleszar committed
537
538
539
540
  for (j = 0; j < 8; j++) {
    u[j] = (u[j] * alpha + u1_const) >> 16;
    v[j] = (v[j] * alpha + v1_const) >> 16;
  }
541
542
}

543
void vp9_blend_b_c(uint8_t *y, uint8_t *u, uint8_t *v,
John Koleszar's avatar
John Koleszar committed
544
545
546
547
548
549
550
551
552
                   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;
553
    }
John Koleszar's avatar
John Koleszar committed
554
555
    y += stride;
  }
556

John Koleszar's avatar
John Koleszar committed
557
  stride >>= 1;
558

John Koleszar's avatar
John Koleszar committed
559
560
561
562
  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;
563
    }
John Koleszar's avatar
John Koleszar committed
564
565
566
    u += stride;
    v += stride;
  }
567
568
}

569
570
static void constrain_line(int x0, int *x1, int y0, int *y1,
                           int width, int height) {
John Koleszar's avatar
John Koleszar committed
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
  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;
  }
606
607
}

608
int vp9_post_proc_frame(struct VP9Common *cm,
609
                        YV12_BUFFER_CONFIG *dest, vp9_ppflags_t *ppflags) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
610
611
612
613
  const int q = MIN(63, cm->lf.filter_level * 10 / 6);
  const int flags = ppflags->post_proc_flag;
  YV12_BUFFER_CONFIG *const ppbuf = &cm->post_proc_buffer;
  struct postproc_state *const ppstate = &cm->postproc_state;
John Koleszar's avatar
John Koleszar committed
614

615
  if (!cm->frame_to_show)
John Koleszar's avatar
John Koleszar committed
616
    return -1;
John Koleszar's avatar
John Koleszar committed
617

John Koleszar's avatar
John Koleszar committed
618
  if (!flags) {
619
    *dest = *cm->frame_to_show;
John Koleszar's avatar
John Koleszar committed
620
621
    return 0;
  }
John Koleszar's avatar
John Koleszar committed
622

Dmitry Kovalev's avatar
Dmitry Kovalev committed
623
  vp9_clear_system_state();
John Koleszar's avatar
John Koleszar committed
624

625
  if (flags & VP9D_DEMACROBLOCK) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
626
627
    deblock_and_de_macro_block(cm->frame_to_show, ppbuf,
                               q + (ppflags->deblocking_level - 5) * 10, 1, 0);
628
  } else if (flags & VP9D_DEBLOCK) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
629
    vp9_deblock(cm->frame_to_show, ppbuf, q);
John Koleszar's avatar
John Koleszar committed
630
  } else {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
631
    vp8_yv12_copy_frame(cm->frame_to_show, ppbuf);
John Koleszar's avatar
John Koleszar committed
632
633
  }

634
  if (flags & VP9D_ADDNOISE) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
635
636
637
638
    const int noise_level = ppflags->noise_level;
    if (ppstate->last_q != q ||
        ppstate->last_noise != noise_level) {
      fillrd(ppstate, 63 - q, noise_level);
John Koleszar's avatar
John Koleszar committed
639
640
    }

Dmitry Kovalev's avatar
Dmitry Kovalev committed
641
642
643
    vp9_plane_add_noise(ppbuf->y_buffer, ppstate->noise, ppstate->blackclamp,
                        ppstate->whiteclamp, ppstate->bothclamp,
                        ppbuf->y_width, ppbuf->y_height, ppbuf->y_stride);
John Koleszar's avatar
John Koleszar committed
644
  }
John Koleszar's avatar
John Koleszar committed
645

646
#if 0 && CONFIG_POSTPROC_VISUALIZER
647
  if (flags & VP9D_DEBUG_TXT_FRAME_INFO) {
John Koleszar's avatar
John Koleszar committed
648
    char message[512];
649
650
651
652
653
654
655
656
    snprintf(message, sizeof(message) -1,
             "F%1dG%1dQ%3dF%3dP%d_s%dx%d",
             (cm->frame_type == KEY_FRAME),
             cm->refresh_golden_frame,
             cm->base_qindex,
             cm->filter_level,
             flags,
             cm->mb_cols, cm->mb_rows);
Dmitry Kovalev's avatar
Dmitry Kovalev committed
657
    vp9_blit_text(message, ppbuf->y_buffer, ppbuf->y_stride);
John Koleszar's avatar
John Koleszar committed
658
659
  }

660
  if (flags & VP9D_DEBUG_TXT_MBLK_MODES) {
John Koleszar's avatar
John Koleszar committed
661
    int i, j;
662
    uint8_t *y_ptr;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
663
664
    int mb_rows = ppbuf->y_height >> 4;
    int mb_cols = ppbuf->y_width  >> 4;
John Koleszar's avatar
John Koleszar committed
665
    int mb_index = 0;
666
    MODE_INFO *mi = cm->mi;
John Koleszar's avatar
John Koleszar committed
667

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

670
    /* vp9_filter each macro block */
John Koleszar's avatar
John Koleszar committed
671
672
673
    for (i = 0; i < mb_rows; i++) {
      for (j = 0; j < mb_cols; j++) {
        char zz[4];
674

675
        snprintf(zz, sizeof(zz) - 1, "%c", mi[mb_index].mbmi.mode + 'a');
John Koleszar's avatar
John Koleszar committed
676

677
        vp9_blit_text(zz, y_ptr, post->y_stride);
John Koleszar's avatar
John Koleszar committed
678
679
680
        mb_index++;
        y_ptr += 16;
      }
John Koleszar's avatar
John Koleszar committed
681

John Koleszar's avatar
John Koleszar committed
682
683
      mb_index++; /* border */
      y_ptr += post->y_stride  * 16 - post->y_width;
John Koleszar's avatar
John Koleszar committed
684
    }
John Koleszar's avatar
John Koleszar committed
685
  }
686

687
  if (flags & VP9D_DEBUG_TXT_DC_DIFF) {
John Koleszar's avatar
John Koleszar committed
688
    int i, j;
689
    uint8_t *y_ptr;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
690
691
    int mb_rows = ppbuf->y_height >> 4;
    int mb_cols = ppbuf->y_width  >> 4;
John Koleszar's avatar
John Koleszar committed
692
    int mb_index = 0;
693
    MODE_INFO *mi = cm->mi;
John Koleszar's avatar
John Koleszar committed
694
695
696

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

697
    /* vp9_filter each macro block */
John Koleszar's avatar
John Koleszar committed
698
699
700
    for (i = 0; i < mb_rows; i++) {
      for (j = 0; j < mb_cols; j++) {
        char zz[4];
Yaowu Xu's avatar
Yaowu Xu committed
701
        int dc_diff = !(mi[mb_index].mbmi.mode != I4X4_PRED &&
John Koleszar's avatar
John Koleszar committed
702
                        mi[mb_index].mbmi.mode != SPLITMV &&
703
                        mi[mb_index].mbmi.skip);
John Koleszar's avatar
John Koleszar committed
704

705
        if (cm->frame_type == KEY_FRAME)
706
          snprintf(zz, sizeof(zz) - 1, "a");
John Koleszar's avatar
John Koleszar committed
707
        else
708
          snprintf(zz, sizeof(zz) - 1, "%c", dc_diff + '0');
John Koleszar's avatar
John Koleszar committed
709

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

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

720
  if (flags & VP9D_DEBUG_TXT_RATE_INFO) {
John Koleszar's avatar
John Koleszar committed
721
    char message[512];
722
    snprintf(message, sizeof(message),
James Zern's avatar
James Zern committed
723
             "Bitrate: %10.2f framerate: %10.2f ",
724
             cm->bitrate, cm->framerate);
Dmitry Kovalev's avatar
Dmitry Kovalev committed
725
    vp9_blit_text(message, ppbuf->y_buffer, ppbuf->y_stride);
John Koleszar's avatar
John Koleszar committed
726
727
728
  }

  /* Draw motion vectors */
729
  if ((flags & VP9D_DEBUG_DRAW_MV) && ppflags->display_mv_flag) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
730
731
732
733
    int width  = ppbuf->y_width;
    int height = ppbuf->y_height;
    uint8_t *y_buffer = ppbuf->y_buffer;
    int y_stride = ppbuf->y_stride;
734
    MODE_INFO *mi = cm->mi;
John Koleszar's avatar
John Koleszar committed
735
736
737
738
739
740
741
742
743
744
    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;
        }
745

John Koleszar's avatar
John Koleszar committed
746
747
        if (mi->mbmi.mode == SPLITMV) {
          switch (mi->mbmi.partitioning) {
748
            case PARTITIONING_16X8 : {  /* mv_top_bottom */
John Koleszar's avatar
John Koleszar committed
749
750
              union b_mode_info *bmi = &mi->bmi[0];
              MV *mv = &bmi->mv.as_mv;
751

John Koleszar's avatar
John Koleszar committed
752
753
              x1 = x0 + 8 + (mv->col >> 3);
              y1 = y0 + 4 + (mv->row >> 3);
754

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

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

John Koleszar's avatar
John Koleszar committed
760
761
              x1 = x0 + 8 + (mv->col >> 3);
              y1 = y0 + 12 + (mv->row >> 3);
762

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

John Koleszar's avatar
John Koleszar committed
766
767
              break;
            }
768
            case PARTITIONING_8X16 : {  /* mv_left_right */
John Koleszar's avatar
John Koleszar committed
769
770
              union b_mode_info *bmi = &mi->bmi[0];
              MV *mv = &bmi->mv.as_mv;
771

John Koleszar's avatar
John Koleszar committed
772
773
              x1 = x0 + 4 + (mv->col >> 3);
              y1 = y0 + 8 + (mv->row >> 3);
774

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

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

John Koleszar's avatar
John Koleszar committed
780
781
              x1 = x0 + 12 + (mv->col >> 3);
              y1 = y0 + 8 + (mv->row >> 3);
782

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

John Koleszar's avatar
John Koleszar committed
786
787
              break;
            }
788
            case PARTITIONING_8X8 : {  /* mv_quarters   */
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 + 4 + (mv->col >> 3);
              y1 = y0 + 4 + (mv->row >> 3);
794

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

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

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

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

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

John Koleszar's avatar
John Koleszar committed
808
809
              x1 = x0 + 4 + (mv->col >> 3);
              y1 = y0 + 12 + (mv->row >> 3);
810

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

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

John Koleszar's avatar
John Koleszar committed
816
817
              x1 = x0 + 12 + (mv->col >> 3);
              y1 = y0 + 12 + (mv->row >> 3);
818

John Koleszar's avatar
John Koleszar committed
819
              constrain_line(x0 + 12, &x1, y0 + 12, &y1, width, height);
820
              vp9_blit_line(x0 + 12,  x1, y0 + 12,  y1, y_buffer, y_stride);
John Koleszar's avatar
John Koleszar committed
821
822
              break;
            }
823
            case PARTITIONING_4X4:
John Koleszar's avatar
John Koleszar committed
824
825
826
            default : {
              union b_mode_info *bmi = mi->bmi;
              int bx0, by0;
827

John Koleszar's avatar
John Koleszar committed
828
829
830
              for (by0 = y0; by0 < (y0 + 16); by0 += 4) {
                for (bx0 = x0; bx0 < (x0 + 16); bx0 += 4) {
                  MV *mv = &bmi->mv.as_mv;
831

John Koleszar's avatar
John Koleszar committed
832
833
                  x1 = bx0 + 2 + (mv->col >> 3);
                  y1 = by0 + 2 + (mv->row >> 3);
834

John Koleszar's avatar
John Koleszar committed
835
                  constrain_line(bx0 + 2, &x1, by0 + 2, &y1, width, height);
836
                  vp9_blit_line(bx0 + 2,  x1, by0 + 2,  y1, y_buffer, y_stride);
837

John Koleszar's avatar
John Koleszar committed
838
                  bmi++;
839
                }
John Koleszar's avatar
John Koleszar committed
840
              }
841
            }
John Koleszar's avatar
John Koleszar committed
842
          }
843
        } else if (is_inter_mode(mi->mbmi.mode)) {
John Koleszar's avatar
John Koleszar committed
844
845
846
847
848
849
850
851
852
          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);
853
            vp9_blit_line(lx0,  x1, ly0 - 1,  y1, y_buffer, y_stride);
John Koleszar's avatar
John Koleszar committed
854
855

            constrain_line(lx0, &x1, ly0 + 1, &y1, width, height);
856
            vp9_blit_line(lx0,  x1, ly0 + 1,  y1, y_buffer, y_stride);
857
          } else {
858
            vp9_blit_line(lx0,  x1, ly0,  y1, y_buffer, y_stride);
859
          }
860
        }
John Koleszar's avatar
John Koleszar committed
861

John Koleszar's avatar
John Koleszar committed
862
863
864
865
866
867
868
        mi++;
      }
      mi++;
    }
  }

  /* Color in block modes */
869
  if ((flags & VP9D_DEBUG_CLR_BLK_MODES)
John Koleszar's avatar
John Koleszar committed
870
871
      && (ppflags->display_mb_modes_flag || ppflags->display_b_modes_flag)) {
    int y, x;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
872
873
874
875
876
877
    int width  = ppbuf->y_width;
    int height = ppbuf->y_height;
    uint8_t *y_ptr = ppbuf->y_buffer;
    uint8_t *u_ptr = ppbuf->u_buffer;
    uint8_t *v_ptr = ppbuf->v_buffer;
    int y_stride = ppbuf->y_stride;
878
    MODE_INFO *mi = cm->mi;
John Koleszar's avatar
John Koleszar committed
879
880
881
882
883

    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
884
885
        if (mi->mbmi.mode == I4X4_PRED &&
            ((ppflags->display_mb_modes_flag & I4X4_PRED) ||
886
             ppflags->display_b_modes_flag)) {
John Koleszar's avatar
John Koleszar committed
887
          int by, bx;
888
          uint8_t *yl, *ul, *vl;
John Koleszar's avatar
John Koleszar committed
889
890
891
892
893
894
895
896
897
          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
898
                  || (ppflags->display_mb_modes_flag & I4X4_PRED)) {
899
900
901
                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
902

Jim Bankoski's avatar
Jim Bankoski committed
903
904
                vp9_blend_b(yl + bx, ul + (bx >> 1), vl + (bx >> 1), Y, U, V,
                    0xc000, y_stride);
John Koleszar's avatar
John Koleszar committed
905
906
              }
              bmi++;
907
908
            }

John Koleszar's avatar
John Koleszar committed
909
910
911
912
913
914
915
916
917
            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
918
919
          vp9_blend_mb_inner(y_ptr + x, u_ptr + (x >> 1), v_ptr + (x >> 1),
                             Y, U, V, 0xc000, y_stride);
920
921
        }

John Koleszar's avatar
John Koleszar committed
922
923
924
925
926
927
928
929
930
931
932
        mi++;
      }
      y_ptr += y_stride * 16;
      u_ptr += y_stride * 4;
      v_ptr += y_stride * 4;

      mi++;
    }
  }

  /* Color in frame reference blocks */
933
934
  if ((flags & VP9D_DEBUG_CLR_FRM_REF_BLKS) &&
      ppflags->display_ref_frame_flag) {
John Koleszar's avatar
John Koleszar committed
935
    int y, x;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
936
937
938
939
940
941
    int width  = ppbuf->y_width;
    int height = ppbuf->y_height;
    uint8_t *y_ptr = ppbuf->y_buffer;
    uint8_t *u_ptr = ppbuf->u_buffer;
    uint8_t *v_ptr = ppbuf->v_buffer;
    int y_stride = ppbuf->y_stride;
942
    MODE_INFO *mi = cm->mi;
John Koleszar's avatar
John Koleszar committed
943
944
945
946
947
948
949
950
951
952

    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
953
954
          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
955
        }
956

John Koleszar's avatar
John Koleszar committed
957
958
959
960
961
        mi++;
      }
      y_ptr += y_stride * 16;
      u_ptr += y_stride * 4;
      v_ptr += y_stride * 4;
962

John Koleszar's avatar
John Koleszar committed
963
      mi++;
964
    }
John Koleszar's avatar
John Koleszar committed
965
  }
966
#endif
967

Dmitry Kovalev's avatar
Dmitry Kovalev committed
968
  *dest = *ppbuf;
John Koleszar's avatar
John Koleszar committed
969

John Koleszar's avatar
John Koleszar committed
970
  /* handle problem with extending borders */
971
972
  dest->y_width = cm->width;
  dest->y_height = cm->height;
973
974
  dest->uv_width = dest->y_width >> cm->subsampling_x;
  dest->uv_height = dest->y_height >> cm->subsampling_y;
975

John Koleszar's avatar
John Koleszar committed
976
  return 0;
John Koleszar's avatar
John Koleszar committed
977
}