vpx_scale.c 17.8 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
14
15
16
17
18
19
20
21
22
 */


/****************************************************************************
 *
 *   Module Title :     scale.c
 *
 *   Description  :     Image scaling functions.
 *
 ***************************************************************************/

/****************************************************************************
*  Header Files
****************************************************************************/
23
#include "./vpx_scale_rtcd.h"
John Koleszar's avatar
John Koleszar committed
24
25
26
#include "vpx_mem/vpx_mem.h"
#include "vpx_scale/yv12config.h"

John Koleszar's avatar
John Koleszar committed
27
28
29
typedef struct {
  int     expanded_frame_width;
  int     expanded_frame_height;
John Koleszar's avatar
John Koleszar committed
30

John Koleszar's avatar
John Koleszar committed
31
32
33
34
  int HScale;
  int HRatio;
  int VScale;
  int VRatio;
John Koleszar's avatar
John Koleszar committed
35

John Koleszar's avatar
John Koleszar committed
36
37
  YV12_BUFFER_CONFIG *src_yuv_config;
  YV12_BUFFER_CONFIG *dst_yuv_config;
John Koleszar's avatar
John Koleszar committed
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

} SCALE_VARS;

/****************************************************************************
 *
 *  ROUTINE       : scale1d_2t1_i
 *
 *  INPUTS        : const unsigned char *source : Pointer to data to be scaled.
 *                  int source_step              : Number of pixels to step on in source.
 *                  unsigned int source_scale    : Scale for source (UNUSED).
 *                  unsigned int source_length   : Length of source (UNUSED).
 *                  unsigned char *dest         : Pointer to output data array.
 *                  int dest_step                : Number of pixels to step on in destination.
 *                  unsigned int dest_scale      : Scale for destination (UNUSED).
 *                  unsigned int dest_length     : Length of destination.
 *
 *  OUTPUTS       : None.
 *
 *  RETURNS       : void
 *
 *  FUNCTION      : Performs 2-to-1 interpolated scaling.
 *
 *  SPECIAL NOTES : None.
 *
 ****************************************************************************/
static
void scale1d_2t1_i
(
John Koleszar's avatar
John Koleszar committed
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
  const unsigned char *source,
  int source_step,
  unsigned int source_scale,
  unsigned int source_length,
  unsigned char *dest,
  int dest_step,
  unsigned int dest_scale,
  unsigned int dest_length
) {
  unsigned int i, j;
  unsigned int temp;
  int source_pitch = source_step;
  (void) source_length;
  (void) source_scale;
  (void) dest_scale;

  source_step *= 2;
  dest[0] = source[0];

  for (i = dest_step, j = source_step; i < dest_length * dest_step; i += dest_step, j += source_step) {
    temp = 8;
    temp += 3 * source[j - source_pitch];
    temp += 10 * source[j];
    temp += 3 * source[j + source_pitch];
    temp >>= 4;
    dest[i] = (char)(temp);
  }
John Koleszar's avatar
John Koleszar committed
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
}

/****************************************************************************
 *
 *  ROUTINE       : scale1d_2t1_ps
 *
 *  INPUTS        : const unsigned char *source : Pointer to data to be scaled.
 *                  int source_step              : Number of pixels to step on in source.
 *                  unsigned int source_scale    : Scale for source (UNUSED).
 *                  unsigned int source_length   : Length of source (UNUSED).
 *                  unsigned char *dest         : Pointer to output data array.
 *                  int dest_step                : Number of pixels to step on in destination.
 *                  unsigned int dest_scale      : Scale for destination (UNUSED).
 *                  unsigned int dest_length     : Length of destination.
 *
 *  OUTPUTS       : None.
 *
 *  RETURNS       : void
 *
 *  FUNCTION      : Performs 2-to-1 point subsampled scaling.
 *
 *  SPECIAL NOTES : None.
 *
 ****************************************************************************/
static
void scale1d_2t1_ps
(
John Koleszar's avatar
John Koleszar committed
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
  const unsigned char *source,
  int source_step,
  unsigned int source_scale,
  unsigned int source_length,
  unsigned char *dest,
  int dest_step,
  unsigned int dest_scale,
  unsigned int dest_length
) {
  unsigned int i, j;

  (void) source_length;
  (void) source_scale;
  (void) dest_scale;

  source_step *= 2;
  j = 0;

  for (i = 0; i < dest_length * dest_step; i += dest_step, j += source_step)
    dest[i] = source[j];
John Koleszar's avatar
John Koleszar committed
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
}
/****************************************************************************
 *
 *  ROUTINE       : scale1d_c
 *
 *  INPUTS        : const unsigned char *source : Pointer to data to be scaled.
 *                  int source_step              : Number of pixels to step on in source.
 *                  unsigned int source_scale    : Scale for source.
 *                  unsigned int source_length   : Length of source (UNUSED).
 *                  unsigned char *dest         : Pointer to output data array.
 *                  int dest_step                : Number of pixels to step on in destination.
 *                  unsigned int dest_scale      : Scale for destination.
 *                  unsigned int dest_length     : Length of destination.
 *
 *  OUTPUTS       : None.
 *
 *  RETURNS       : void
 *
 *  FUNCTION      : Performs linear interpolation in one dimension.
 *
 *  SPECIAL NOTES : None.
 *
 ****************************************************************************/
static
void scale1d_c
(
John Koleszar's avatar
John Koleszar committed
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
  const unsigned char *source,
  int source_step,
  unsigned int source_scale,
  unsigned int source_length,
  unsigned char *dest,
  int dest_step,
  unsigned int dest_scale,
  unsigned int dest_length
) {
  unsigned int i;
  unsigned int round_value = dest_scale / 2;
  unsigned int left_modifier = dest_scale;
  unsigned int right_modifier = 0;
  unsigned char left_pixel = *source;
  unsigned char right_pixel = *(source + source_step);

  (void) source_length;

  /* These asserts are needed if there are boundary issues... */
  /*assert ( dest_scale > source_scale );*/
  /*assert ( (source_length-1) * dest_scale >= (dest_length-1) * source_scale );*/

  for (i = 0; i < dest_length * dest_step; i += dest_step) {
    dest[i] = (char)((left_modifier * left_pixel + right_modifier * right_pixel + round_value) / dest_scale);

    right_modifier += source_scale;

    while (right_modifier > dest_scale) {
      right_modifier -= dest_scale;
      source += source_step;
      left_pixel = *source;
      right_pixel = *(source + source_step);
John Koleszar's avatar
John Koleszar committed
198
    }
John Koleszar's avatar
John Koleszar committed
199
200
201

    left_modifier = dest_scale - right_modifier;
  }
John Koleszar's avatar
John Koleszar committed
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
}

/****************************************************************************
 *
 *  ROUTINE       : Scale2D
 *
 *  INPUTS        : const unsigned char *source  : Pointer to data to be scaled.
 *                  int source_pitch              : Stride of source image.
 *                  unsigned int source_width     : Width of input image.
 *                  unsigned int source_height    : Height of input image.
 *                  unsigned char *dest          : Pointer to output data array.
 *                  int dest_pitch                : Stride of destination image.
 *                  unsigned int dest_width       : Width of destination image.
 *                  unsigned int dest_height      : Height of destination image.
 *                  unsigned char *temp_area      : Pointer to temp work area.
 *                  unsigned char temp_area_height : Height of temp work area.
 *                  unsigned int hscale          : Horizontal scale factor numerator.
 *                  unsigned int hratio          : Horizontal scale factor denominator.
 *                  unsigned int vscale          : Vertical scale factor numerator.
 *                  unsigned int vratio          : Vertical scale factor denominator.
 *                  unsigned int interlaced      : Interlace flag.
 *
 *  OUTPUTS       : None.
 *
 *  RETURNS       : void
 *
 *  FUNCTION      : Performs 2-tap linear interpolation in two dimensions.
 *
 *  SPECIAL NOTES : Expansion is performed one band at a time to help with
 *                  caching.
 *
 ****************************************************************************/
static
void Scale2D
(
John Koleszar's avatar
John Koleszar committed
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
  /*const*/
  unsigned char *source,
  int source_pitch,
  unsigned int source_width,
  unsigned int source_height,
  unsigned char *dest,
  int dest_pitch,
  unsigned int dest_width,
  unsigned int dest_height,
  unsigned char *temp_area,
  unsigned char temp_area_height,
  unsigned int hscale,
  unsigned int hratio,
  unsigned int vscale,
  unsigned int vratio,
  unsigned int interlaced
) {
  /*unsigned*/
  int i, j, k;
  int bands;
  int dest_band_height;
  int source_band_height;

  typedef void (*Scale1D)(const unsigned char * source, int source_step, unsigned int source_scale, unsigned int source_length,
                          unsigned char * dest, int dest_step, unsigned int dest_scale, unsigned int dest_length);

  Scale1D Scale1Dv = scale1d_c;
  Scale1D Scale1Dh = scale1d_c;

  void (*horiz_line_scale)(const unsigned char *, unsigned int, unsigned char *, unsigned int) = NULL;
  void (*vert_band_scale)(unsigned char *, unsigned int, unsigned char *, unsigned int, unsigned int) = NULL;

  int ratio_scalable = 1;
  int interpolation = 0;

  unsigned char *source_base; /* = (unsigned char *) ((source_pitch >= 0) ? source : (source + ((source_height-1) * source_pitch))); */
  unsigned char *line_src;


  source_base = (unsigned char *)source;

  if (source_pitch < 0) {
    int offset;

    offset = (source_height - 1);
    offset *= source_pitch;

    source_base += offset;
  }

  /* find out the ratio for each direction */
  switch (hratio * 10 / hscale) {
John Koleszar's avatar
John Koleszar committed
289
    case 8:
John Koleszar's avatar
John Koleszar committed
290
291
292
      /* 4-5 Scale in Width direction */
      horiz_line_scale = vp8_horizontal_line_5_4_scale;
      break;
John Koleszar's avatar
John Koleszar committed
293
    case 6:
John Koleszar's avatar
John Koleszar committed
294
295
296
      /* 3-5 Scale in Width direction */
      horiz_line_scale = vp8_horizontal_line_5_3_scale;
      break;
John Koleszar's avatar
John Koleszar committed
297
    case 5:
John Koleszar's avatar
John Koleszar committed
298
299
300
      /* 1-2 Scale in Width direction */
      horiz_line_scale = vp8_horizontal_line_2_1_scale;
      break;
John Koleszar's avatar
John Koleszar committed
301
    default:
John Koleszar's avatar
John Koleszar committed
302
303
304
305
306
      /* The ratio is not acceptable now */
      /* throw("The ratio is not acceptable for now!"); */
      ratio_scalable = 0;
      break;
  }
John Koleszar's avatar
John Koleszar committed
307

John Koleszar's avatar
John Koleszar committed
308
  switch (vratio * 10 / vscale) {
John Koleszar's avatar
John Koleszar committed
309
    case 8:
John Koleszar's avatar
John Koleszar committed
310
311
312
313
314
      /* 4-5 Scale in vertical direction */
      vert_band_scale     = vp8_vertical_band_5_4_scale;
      source_band_height  = 5;
      dest_band_height    = 4;
      break;
John Koleszar's avatar
John Koleszar committed
315
    case 6:
John Koleszar's avatar
John Koleszar committed
316
317
318
319
320
      /* 3-5 Scale in vertical direction */
      vert_band_scale     = vp8_vertical_band_5_3_scale;
      source_band_height  = 5;
      dest_band_height    = 3;
      break;
John Koleszar's avatar
John Koleszar committed
321
    case 5:
John Koleszar's avatar
John Koleszar committed
322
      /* 1-2 Scale in vertical direction */
John Koleszar's avatar
John Koleszar committed
323

John Koleszar's avatar
John Koleszar committed
324
325
326
327
      if (interlaced) {
        /* if the content is interlaced, point sampling is used */
        vert_band_scale     = vp8_vertical_band_2_1_scale;
      } else {
John Koleszar's avatar
John Koleszar committed
328

John Koleszar's avatar
John Koleszar committed
329
330
331
        interpolation = 1;
        /* if the content is progressive, interplo */
        vert_band_scale     = vp8_vertical_band_2_1_scale_i;
John Koleszar's avatar
John Koleszar committed
332

John Koleszar's avatar
John Koleszar committed
333
      }
John Koleszar's avatar
John Koleszar committed
334

John Koleszar's avatar
John Koleszar committed
335
336
337
      source_band_height  = 2;
      dest_band_height    = 1;
      break;
John Koleszar's avatar
John Koleszar committed
338
    default:
John Koleszar's avatar
John Koleszar committed
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
      /* The ratio is not acceptable now */
      /* throw("The ratio is not acceptable for now!"); */
      ratio_scalable = 0;
      break;
  }

  if (ratio_scalable) {
    if (source_height == dest_height) {
      /* for each band of the image */
      for (k = 0; k < (int)dest_height; k++) {
        horiz_line_scale(source, source_width, dest, dest_width);
        source += source_pitch;
        dest   += dest_pitch;
      }

      return;
John Koleszar's avatar
John Koleszar committed
355
356
    }

John Koleszar's avatar
John Koleszar committed
357
358
359
360
361
    if (interpolation) {
      if (source < source_base)
        source = source_base;

      horiz_line_scale(source, source_width, temp_area, dest_width);
John Koleszar's avatar
John Koleszar committed
362
363
    }

John Koleszar's avatar
John Koleszar committed
364
365
366
367
    for (k = 0; k < (int)(dest_height + dest_band_height - 1) / dest_band_height; k++) {
      /* scale one band horizontally */
      for (i = 0; i < source_band_height; i++) {
        /* Trap case where we could read off the base of the source buffer */
John Koleszar's avatar
John Koleszar committed
368

John Koleszar's avatar
John Koleszar committed
369
        line_src = (unsigned char *)source + i * source_pitch;
John Koleszar's avatar
John Koleszar committed
370

John Koleszar's avatar
John Koleszar committed
371
372
373
374
375
376
377
378
379
        if (line_src < source_base)
          line_src = source_base;

        horiz_line_scale(line_src, source_width,
                         temp_area + (i + 1)*dest_pitch, dest_width);
      }

      /* Vertical scaling is in place */
      vert_band_scale(temp_area + dest_pitch, dest_pitch, dest, dest_pitch, dest_width);
John Koleszar's avatar
John Koleszar committed
380

John Koleszar's avatar
John Koleszar committed
381
382
383
384
385
386
      if (interpolation)
        vpx_memcpy(temp_area, temp_area + source_band_height * dest_pitch, dest_width);

      /* Next band... */
      source += (unsigned long) source_band_height  * source_pitch;
      dest   += (unsigned long) dest_band_height * dest_pitch;
John Koleszar's avatar
John Koleszar committed
387
    }
John Koleszar's avatar
John Koleszar committed
388
389
390
391
392
393
394
395
396
397

    return;
  }

  if (hscale == 2 && hratio == 1)
    Scale1Dh = scale1d_2t1_ps;

  if (vscale == 2 && vratio == 1) {
    if (interlaced)
      Scale1Dv = scale1d_2t1_ps;
John Koleszar's avatar
John Koleszar committed
398
    else
John Koleszar's avatar
John Koleszar committed
399
400
401
402
403
404
405
406
407
      Scale1Dv = scale1d_2t1_i;
  }

  if (source_height == dest_height) {
    /* for each band of the image */
    for (k = 0; k < (int)dest_height; k++) {
      Scale1Dh(source, 1, hscale, source_width + 1, dest, 1, hratio, dest_width);
      source += source_pitch;
      dest   += dest_pitch;
John Koleszar's avatar
John Koleszar committed
408
409
    }

John Koleszar's avatar
John Koleszar committed
410
411
412
413
414
415
416
417
418
419
    return;
  }

  if (dest_height > source_height) {
    dest_band_height   = temp_area_height - 1;
    source_band_height = dest_band_height * source_height / dest_height;
  } else {
    source_band_height = temp_area_height - 1;
    dest_band_height   = source_band_height * vratio / vscale;
  }
John Koleszar's avatar
John Koleszar committed
420

John Koleszar's avatar
John Koleszar committed
421
422
  /* first row needs to be done so that we can stay one row ahead for vertical zoom */
  Scale1Dh(source, 1, hscale, source_width + 1, temp_area, 1, hratio, dest_width);
John Koleszar's avatar
John Koleszar committed
423

John Koleszar's avatar
John Koleszar committed
424
425
426
427
428
429
430
431
432
433
  /* for each band of the image */
  bands = (dest_height + dest_band_height - 1) / dest_band_height;

  for (k = 0; k < bands; k++) {
    /* scale one band horizontally */
    for (i = 1; i < source_band_height + 1; i++) {
      if (k * source_band_height + i < (int) source_height) {
        Scale1Dh(source + i * source_pitch, 1, hscale, source_width + 1,
                 temp_area + i * dest_pitch, 1, hratio, dest_width);
      } else { /*  Duplicate the last row */
434
        /* copy temp_area row 0 over from last row in the past */
Johann's avatar
Johann committed
435
        vpx_memcpy(temp_area + i * dest_pitch, temp_area + (i - 1)*dest_pitch, dest_pitch);
John Koleszar's avatar
John Koleszar committed
436
437
      }
    }
John Koleszar's avatar
John Koleszar committed
438

John Koleszar's avatar
John Koleszar committed
439
440
441
442
    /* scale one band vertically */
    for (j = 0; j < (int)dest_width; j++) {
      Scale1Dv(&temp_area[j], dest_pitch, vscale, source_band_height + 1,
               &dest[j], dest_pitch, vratio, dest_band_height);
John Koleszar's avatar
John Koleszar committed
443
    }
John Koleszar's avatar
John Koleszar committed
444
445

    /* copy temp_area row 0 over from last row in the past */
Johann's avatar
Johann committed
446
    vpx_memcpy(temp_area, temp_area + source_band_height * dest_pitch, dest_pitch);
John Koleszar's avatar
John Koleszar committed
447
448
449
450
451

    /* move to the next band */
    source += source_band_height * source_pitch;
    dest   += dest_band_height * dest_pitch;
  }
John Koleszar's avatar
John Koleszar committed
452
453
454
455
}

/****************************************************************************
 *
Johann's avatar
Johann committed
456
 *  ROUTINE       : vpx_scale_frame
John Koleszar's avatar
John Koleszar committed
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
 *
 *  INPUTS        : YV12_BUFFER_CONFIG *src       : Pointer to frame to be scaled.
 *                  YV12_BUFFER_CONFIG *dst       : Pointer to buffer to hold scaled frame.
 *                  unsigned char *temp_area      : Pointer to temp work area.
 *                  unsigned char temp_area_height : Height of temp work area.
 *                  unsigned int hscale          : Horizontal scale factor numerator.
 *                  unsigned int hratio          : Horizontal scale factor denominator.
 *                  unsigned int vscale          : Vertical scale factor numerator.
 *                  unsigned int vratio          : Vertical scale factor denominator.
 *                  unsigned int interlaced      : Interlace flag.
 *
 *  OUTPUTS       : None.
 *
 *  RETURNS       : void
 *
 *  FUNCTION      : Performs 2-tap linear interpolation in two dimensions.
 *
 *  SPECIAL NOTES : Expansion is performed one band at a time to help with
 *                  caching.
 *
 ****************************************************************************/
Johann's avatar
Johann committed
478
void vpx_scale_frame
John Koleszar's avatar
John Koleszar committed
479
(
John Koleszar's avatar
John Koleszar committed
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
  YV12_BUFFER_CONFIG *src,
  YV12_BUFFER_CONFIG *dst,
  unsigned char *temp_area,
  unsigned char temp_height,
  unsigned int hscale,
  unsigned int hratio,
  unsigned int vscale,
  unsigned int vratio,
  unsigned int interlaced
) {
  int i;
  int dw = (hscale - 1 + src->y_width * hratio) / hscale;
  int dh = (vscale - 1 + src->y_height * vratio) / vscale;

  /* call our internal scaling routines!! */
  Scale2D((unsigned char *) src->y_buffer, src->y_stride, src->y_width, src->y_height,
          (unsigned char *) dst->y_buffer, dst->y_stride, dw, dh,
          temp_area, temp_height, hscale, hratio, vscale, vratio, interlaced);

  if (dw < (int)dst->y_width)
    for (i = 0; i < dh; i++)
Johann's avatar
Johann committed
501
      vpx_memset(dst->y_buffer + i * dst->y_stride + dw - 1, dst->y_buffer[i * dst->y_stride + dw - 2], dst->y_width - dw + 1);
John Koleszar's avatar
John Koleszar committed
502
503
504

  if (dh < (int)dst->y_height)
    for (i = dh - 1; i < (int)dst->y_height; i++)
Johann's avatar
Johann committed
505
      vpx_memcpy(dst->y_buffer + i * dst->y_stride, dst->y_buffer + (dh - 2) * dst->y_stride, dst->y_width + 1);
John Koleszar's avatar
John Koleszar committed
506
507
508
509
510
511
512

  Scale2D((unsigned char *) src->u_buffer, src->uv_stride, src->uv_width, src->uv_height,
          (unsigned char *) dst->u_buffer, dst->uv_stride, dw / 2, dh / 2,
          temp_area, temp_height, hscale, hratio, vscale, vratio, interlaced);

  if (dw / 2 < (int)dst->uv_width)
    for (i = 0; i < dst->uv_height; i++)
Johann's avatar
Johann committed
513
      vpx_memset(dst->u_buffer + i * dst->uv_stride + dw / 2 - 1, dst->u_buffer[i * dst->uv_stride + dw / 2 - 2], dst->uv_width - dw / 2 + 1);
John Koleszar's avatar
John Koleszar committed
514
515
516

  if (dh / 2 < (int)dst->uv_height)
    for (i = dh / 2 - 1; i < (int)dst->y_height / 2; i++)
Johann's avatar
Johann committed
517
      vpx_memcpy(dst->u_buffer + i * dst->uv_stride, dst->u_buffer + (dh / 2 - 2)*dst->uv_stride, dst->uv_width);
John Koleszar's avatar
John Koleszar committed
518
519
520
521
522
523
524

  Scale2D((unsigned char *) src->v_buffer, src->uv_stride, src->uv_width, src->uv_height,
          (unsigned char *) dst->v_buffer, dst->uv_stride, dw / 2, dh / 2,
          temp_area, temp_height, hscale, hratio, vscale, vratio, interlaced);

  if (dw / 2 < (int)dst->uv_width)
    for (i = 0; i < dst->uv_height; i++)
Johann's avatar
Johann committed
525
      vpx_memset(dst->v_buffer + i * dst->uv_stride + dw / 2 - 1, dst->v_buffer[i * dst->uv_stride + dw / 2 - 2], dst->uv_width - dw / 2 + 1);
John Koleszar's avatar
John Koleszar committed
526
527
528

  if (dh / 2 < (int) dst->uv_height)
    for (i = dh / 2 - 1; i < (int)dst->y_height / 2; i++)
Johann's avatar
Johann committed
529
      vpx_memcpy(dst->v_buffer + i * dst->uv_stride, dst->v_buffer + (dh / 2 - 2)*dst->uv_stride, dst->uv_width);
John Koleszar's avatar
John Koleszar committed
530
}