vp9_reconintra4x4.c 13.6 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_ports/config.h"
John Koleszar's avatar
John Koleszar committed
13
#include "vpx_mem/vpx_mem.h"
14
#include "vp9/common/vp9_reconintra.h"
15
#include "vp9_rtcd.h"
John Koleszar's avatar
John Koleszar committed
16

17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 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 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 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 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
#if CONFIG_NEWBINTRAMODES
static int find_grad_measure(unsigned char *x, int stride, int n, int t,
                             int dx, int dy) {
  int i, j;
  int count = 0, gsum = 0, gdiv;
  /* TODO: Make this code more efficient by breaking up into two loops */
  for (i = -t; i < n; ++i)
    for (j = -t; j < n; ++j) {
      int g;
      if (i >= 0 && j >= 0) continue;
      if (i + dy >= 0 && j + dx >= 0) continue;
      if (i + dy < -t || i + dy >= n || j + dx < -t || j + dx >= n) continue;
      g = abs(x[(i + dy) * stride + j + dx] - x[i * stride + j]);
      gsum += g * g;
      count++;
    }
  gdiv = (dx * dx + dy * dy) * count;
  return ((gsum << 8) + (gdiv >> 1)) / gdiv;
}

#if CONTEXT_PRED_REPLACEMENTS == 6
B_PREDICTION_MODE vp9_find_dominant_direction(
    unsigned char *ptr, int stride, int n) {
  int g[8], i, imin, imax;
  g[1] = find_grad_measure(ptr, stride, n, 4,  2, 1);
  g[2] = find_grad_measure(ptr, stride, n, 4,  1, 1);
  g[3] = find_grad_measure(ptr, stride, n, 4,  1, 2);
  g[5] = find_grad_measure(ptr, stride, n, 4, -1, 2);
  g[6] = find_grad_measure(ptr, stride, n, 4, -1, 1);
  g[7] = find_grad_measure(ptr, stride, n, 4, -2, 1);
  imin = 1;
  for (i = 2; i < 8; i += 1 + (i == 3))
    imin = (g[i] < g[imin] ? i : imin);
  imax = 1;
  for (i = 2; i < 8; i += 1 + (i == 3))
    imax = (g[i] > g[imax] ? i : imax);
  /*
  printf("%d %d %d %d %d %d = %d %d\n",
         g[1], g[2], g[3], g[5], g[6], g[7], imin, imax);
         */
  switch (imin) {
    case 1:
      return B_HD_PRED;
    case 2:
      return B_RD_PRED;
    case 3:
      return B_VR_PRED;
    case 5:
      return B_VL_PRED;
    case 6:
      return B_LD_PRED;
    case 7:
      return B_HU_PRED;
    default:
      assert(0);
  }
}
#elif CONTEXT_PRED_REPLACEMENTS == 4
B_PREDICTION_MODE vp9_find_dominant_direction(
    unsigned char *ptr, int stride, int n) {
  int g[8], i, imin, imax;
  g[1] = find_grad_measure(ptr, stride, n, 4,  2, 1);
  g[3] = find_grad_measure(ptr, stride, n, 4,  1, 2);
  g[5] = find_grad_measure(ptr, stride, n, 4, -1, 2);
  g[7] = find_grad_measure(ptr, stride, n, 4, -2, 1);
  imin = 1;
  for (i = 3; i < 8; i+=2)
    imin = (g[i] < g[imin] ? i : imin);
  imax = 1;
  for (i = 3; i < 8; i+=2)
    imax = (g[i] > g[imax] ? i : imax);
  /*
  printf("%d %d %d %d = %d %d\n",
         g[1], g[3], g[5], g[7], imin, imax);
         */
  switch (imin) {
    case 1:
      return B_HD_PRED;
    case 3:
      return B_VR_PRED;
    case 5:
      return B_VL_PRED;
    case 7:
      return B_HU_PRED;
    default:
      assert(0);
  }
}
#elif CONTEXT_PRED_REPLACEMENTS == 0
B_PREDICTION_MODE vp9_find_dominant_direction(
    unsigned char *ptr, int stride, int n) {
  int g[8], i, imin, imin2, imax;
  g[0] = find_grad_measure(ptr, stride, n, 4,  1, 0);
  g[1] = find_grad_measure(ptr, stride, n, 4,  2, 1);
  g[2] = find_grad_measure(ptr, stride, n, 4,  1, 1);
  g[3] = find_grad_measure(ptr, stride, n, 4,  1, 2);
  g[4] = find_grad_measure(ptr, stride, n, 4,  0, 1);
  g[5] = find_grad_measure(ptr, stride, n, 4, -1, 2);
  g[6] = find_grad_measure(ptr, stride, n, 4, -1, 1);
  g[7] = find_grad_measure(ptr, stride, n, 4, -2, 1);
  imax = 0;
  for (i = 1; i < 8; i++)
    imax = (g[i] > g[imax] ? i : imax);
  imin = 0;
  for (i = 1; i < 8; i++)
    imin = (g[i] < g[imin] ? i : imin);

  switch (imin) {
    case 0:
      return B_HE_PRED;
    case 1:
      return B_HD_PRED;
    case 2:
      return B_RD_PRED;
    case 3:
      return B_VR_PRED;
    case 4:
      return B_VE_PRED;
    case 5:
      return B_VL_PRED;
    case 6:
      return B_LD_PRED;
    case 7:
      return B_HU_PRED;
    default:
      assert(0);
  }
}
#endif

B_PREDICTION_MODE vp9_find_bpred_context(BLOCKD *x) {
  unsigned char *ptr = *(x->base_dst) + x->dst;
  int stride = x->dst_stride;
  return vp9_find_dominant_direction(ptr, stride, 4);
}
#endif

void vp9_intra4x4_predict(BLOCKD *x,
                          int b_mode,
                          unsigned char *predictor) {
John Koleszar's avatar
John Koleszar committed
157 158 159 160 161 162 163 164 165 166
  int i, r, c;

  unsigned char *Above = *(x->base_dst) + x->dst - x->dst_stride;
  unsigned char Left[4];
  unsigned char top_left = Above[-1];

  Left[0] = (*(x->base_dst))[x->dst - 1];
  Left[1] = (*(x->base_dst))[x->dst - 1 + x->dst_stride];
  Left[2] = (*(x->base_dst))[x->dst - 1 + 2 * x->dst_stride];
  Left[3] = (*(x->base_dst))[x->dst - 1 + 3 * x->dst_stride];
John Koleszar's avatar
John Koleszar committed
167

168 169 170 171 172
#if CONFIG_NEWBINTRAMODES
  if (b_mode == B_CONTEXT_PRED)
    b_mode = x->bmi.as_mode.context;
#endif

John Koleszar's avatar
John Koleszar committed
173 174 175
  switch (b_mode) {
    case B_DC_PRED: {
      int expected_dc = 0;
John Koleszar's avatar
John Koleszar committed
176

John Koleszar's avatar
John Koleszar committed
177 178 179 180
      for (i = 0; i < 4; i++) {
        expected_dc += Above[i];
        expected_dc += Left[i];
      }
John Koleszar's avatar
John Koleszar committed
181

John Koleszar's avatar
John Koleszar committed
182 183 184 185 186
      expected_dc = (expected_dc + 4) >> 3;

      for (r = 0; r < 4; r++) {
        for (c = 0; c < 4; c++) {
          predictor[c] = expected_dc;
John Koleszar's avatar
John Koleszar committed
187
        }
John Koleszar's avatar
John Koleszar committed
188 189 190

        predictor += 16;
      }
John Koleszar's avatar
John Koleszar committed
191 192
    }
    break;
John Koleszar's avatar
John Koleszar committed
193 194 195 196 197
    case B_TM_PRED: {
      /* prediction similar to true_motion prediction */
      for (r = 0; r < 4; r++) {
        for (c = 0; c < 4; c++) {
          int pred = Above[c] - top_left + Left[r];
John Koleszar's avatar
John Koleszar committed
198

John Koleszar's avatar
John Koleszar committed
199 200
          if (pred < 0)
            pred = 0;
John Koleszar's avatar
John Koleszar committed
201

John Koleszar's avatar
John Koleszar committed
202 203
          if (pred > 255)
            pred = 255;
John Koleszar's avatar
John Koleszar committed
204

John Koleszar's avatar
John Koleszar committed
205
          predictor[c] = pred;
John Koleszar's avatar
John Koleszar committed
206
        }
John Koleszar's avatar
John Koleszar committed
207 208 209

        predictor += 16;
      }
John Koleszar's avatar
John Koleszar committed
210 211 212
    }
    break;

John Koleszar's avatar
John Koleszar committed
213
    case B_VE_PRED: {
John Koleszar's avatar
John Koleszar committed
214

John Koleszar's avatar
John Koleszar committed
215 216 217 218 219
      unsigned int ap[4];
      ap[0] = Above[0];
      ap[1] = Above[1];
      ap[2] = Above[2];
      ap[3] = Above[3];
John Koleszar's avatar
John Koleszar committed
220

John Koleszar's avatar
John Koleszar committed
221 222
      for (r = 0; r < 4; r++) {
        for (c = 0; c < 4; c++) {
John Koleszar's avatar
John Koleszar committed
223

John Koleszar's avatar
John Koleszar committed
224
          predictor[c] = ap[c];
John Koleszar's avatar
John Koleszar committed
225 226
        }

John Koleszar's avatar
John Koleszar committed
227 228 229
        predictor += 16;
      }

John Koleszar's avatar
John Koleszar committed
230 231 232 233
    }
    break;


John Koleszar's avatar
John Koleszar committed
234
    case B_HE_PRED: {
John Koleszar's avatar
John Koleszar committed
235

John Koleszar's avatar
John Koleszar committed
236 237 238 239 240
      unsigned int lp[4];
      lp[0] = Left[0];
      lp[1] = Left[1];
      lp[2] = Left[2];
      lp[3] = Left[3];
John Koleszar's avatar
John Koleszar committed
241

John Koleszar's avatar
John Koleszar committed
242 243 244
      for (r = 0; r < 4; r++) {
        for (c = 0; c < 4; c++) {
          predictor[c] = lp[r];
John Koleszar's avatar
John Koleszar committed
245 246
        }

John Koleszar's avatar
John Koleszar committed
247 248
        predictor += 16;
      }
John Koleszar's avatar
John Koleszar committed
249 250
    }
    break;
John Koleszar's avatar
John Koleszar committed
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268
    case B_LD_PRED: {
      unsigned char *ptr = Above;
      predictor[0 * 16 + 0] = (ptr[0] + ptr[1] * 2 + ptr[2] + 2) >> 2;
      predictor[0 * 16 + 1] =
        predictor[1 * 16 + 0] = (ptr[1] + ptr[2] * 2 + ptr[3] + 2) >> 2;
      predictor[0 * 16 + 2] =
        predictor[1 * 16 + 1] =
          predictor[2 * 16 + 0] = (ptr[2] + ptr[3] * 2 + ptr[4] + 2) >> 2;
      predictor[0 * 16 + 3] =
        predictor[1 * 16 + 2] =
          predictor[2 * 16 + 1] =
            predictor[3 * 16 + 0] = (ptr[3] + ptr[4] * 2 + ptr[5] + 2) >> 2;
      predictor[1 * 16 + 3] =
        predictor[2 * 16 + 2] =
          predictor[3 * 16 + 1] = (ptr[4] + ptr[5] * 2 + ptr[6] + 2) >> 2;
      predictor[2 * 16 + 3] =
        predictor[3 * 16 + 2] = (ptr[5] + ptr[6] * 2 + ptr[7] + 2) >> 2;
      predictor[3 * 16 + 3] = (ptr[6] + ptr[7] * 2 + ptr[7] + 2) >> 2;
John Koleszar's avatar
John Koleszar committed
269 270 271

    }
    break;
John Koleszar's avatar
John Koleszar committed
272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
    case B_RD_PRED: {

      unsigned char pp[9];

      pp[0] = Left[3];
      pp[1] = Left[2];
      pp[2] = Left[1];
      pp[3] = Left[0];
      pp[4] = top_left;
      pp[5] = Above[0];
      pp[6] = Above[1];
      pp[7] = Above[2];
      pp[8] = Above[3];

      predictor[3 * 16 + 0] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
      predictor[3 * 16 + 1] =
        predictor[2 * 16 + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
      predictor[3 * 16 + 2] =
John Koleszar's avatar
John Koleszar committed
290
        predictor[2 * 16 + 1] =
John Koleszar's avatar
John Koleszar committed
291 292
          predictor[1 * 16 + 0] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
      predictor[3 * 16 + 3] =
John Koleszar's avatar
John Koleszar committed
293
        predictor[2 * 16 + 2] =
John Koleszar's avatar
John Koleszar committed
294 295 296 297 298 299 300 301
          predictor[1 * 16 + 1] =
            predictor[0 * 16 + 0] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
      predictor[2 * 16 + 3] =
        predictor[1 * 16 + 2] =
          predictor[0 * 16 + 1] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
      predictor[1 * 16 + 3] =
        predictor[0 * 16 + 2] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
      predictor[0 * 16 + 3] = (pp[6] + pp[7] * 2 + pp[8] + 2) >> 2;
John Koleszar's avatar
John Koleszar committed
302 303 304

    }
    break;
John Koleszar's avatar
John Koleszar committed
305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335
    case B_VR_PRED: {

      unsigned char pp[9];

      pp[0] = Left[3];
      pp[1] = Left[2];
      pp[2] = Left[1];
      pp[3] = Left[0];
      pp[4] = top_left;
      pp[5] = Above[0];
      pp[6] = Above[1];
      pp[7] = Above[2];
      pp[8] = Above[3];


      predictor[3 * 16 + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
      predictor[2 * 16 + 0] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
      predictor[3 * 16 + 1] =
        predictor[1 * 16 + 0] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
      predictor[2 * 16 + 1] =
        predictor[0 * 16 + 0] = (pp[4] + pp[5] + 1) >> 1;
      predictor[3 * 16 + 2] =
        predictor[1 * 16 + 1] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
      predictor[2 * 16 + 2] =
        predictor[0 * 16 + 1] = (pp[5] + pp[6] + 1) >> 1;
      predictor[3 * 16 + 3] =
        predictor[1 * 16 + 2] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
      predictor[2 * 16 + 3] =
        predictor[0 * 16 + 2] = (pp[6] + pp[7] + 1) >> 1;
      predictor[1 * 16 + 3] = (pp[6] + pp[7] * 2 + pp[8] + 2) >> 2;
      predictor[0 * 16 + 3] = (pp[7] + pp[8] + 1) >> 1;
John Koleszar's avatar
John Koleszar committed
336

John Koleszar's avatar
John Koleszar committed
337 338 339
    }
    break;
    case B_VL_PRED: {
John Koleszar's avatar
John Koleszar committed
340

John Koleszar's avatar
John Koleszar committed
341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
      unsigned char *pp = Above;

      predictor[0 * 16 + 0] = (pp[0] + pp[1] + 1) >> 1;
      predictor[1 * 16 + 0] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
      predictor[2 * 16 + 0] =
        predictor[0 * 16 + 1] = (pp[1] + pp[2] + 1) >> 1;
      predictor[1 * 16 + 1] =
        predictor[3 * 16 + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
      predictor[2 * 16 + 1] =
        predictor[0 * 16 + 2] = (pp[2] + pp[3] + 1) >> 1;
      predictor[3 * 16 + 1] =
        predictor[1 * 16 + 2] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
      predictor[0 * 16 + 3] =
        predictor[2 * 16 + 2] = (pp[3] + pp[4] + 1) >> 1;
      predictor[1 * 16 + 3] =
        predictor[3 * 16 + 2] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
      predictor[2 * 16 + 3] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
      predictor[3 * 16 + 3] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
John Koleszar's avatar
John Koleszar committed
359 360 361
    }
    break;

John Koleszar's avatar
John Koleszar committed
362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390
    case B_HD_PRED: {
      unsigned char pp[9];
      pp[0] = Left[3];
      pp[1] = Left[2];
      pp[2] = Left[1];
      pp[3] = Left[0];
      pp[4] = top_left;
      pp[5] = Above[0];
      pp[6] = Above[1];
      pp[7] = Above[2];
      pp[8] = Above[3];


      predictor[3 * 16 + 0] = (pp[0] + pp[1] + 1) >> 1;
      predictor[3 * 16 + 1] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
      predictor[2 * 16 + 0] =
        predictor[3 * 16 + 2] = (pp[1] + pp[2] + 1) >> 1;
      predictor[2 * 16 + 1] =
        predictor[3 * 16 + 3] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
      predictor[2 * 16 + 2] =
        predictor[1 * 16 + 0] = (pp[2] + pp[3] + 1) >> 1;
      predictor[2 * 16 + 3] =
        predictor[1 * 16 + 1] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
      predictor[1 * 16 + 2] =
        predictor[0 * 16 + 0] = (pp[3] + pp[4] + 1) >> 1;
      predictor[1 * 16 + 3] =
        predictor[0 * 16 + 1] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
      predictor[0 * 16 + 2] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
      predictor[0 * 16 + 3] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
John Koleszar's avatar
John Koleszar committed
391 392 393 394
    }
    break;


John Koleszar's avatar
John Koleszar committed
395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412
    case B_HU_PRED: {
      unsigned char *pp = Left;
      predictor[0 * 16 + 0] = (pp[0] + pp[1] + 1) >> 1;
      predictor[0 * 16 + 1] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
      predictor[0 * 16 + 2] =
        predictor[1 * 16 + 0] = (pp[1] + pp[2] + 1) >> 1;
      predictor[0 * 16 + 3] =
        predictor[1 * 16 + 1] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
      predictor[1 * 16 + 2] =
        predictor[2 * 16 + 0] = (pp[2] + pp[3] + 1) >> 1;
      predictor[1 * 16 + 3] =
        predictor[2 * 16 + 1] = (pp[2] + pp[3] * 2 + pp[3] + 2) >> 2;
      predictor[2 * 16 + 2] =
        predictor[2 * 16 + 3] =
          predictor[3 * 16 + 0] =
            predictor[3 * 16 + 1] =
              predictor[3 * 16 + 2] =
                predictor[3 * 16 + 3] = pp[3];
John Koleszar's avatar
John Koleszar committed
413 414 415
    }
    break;

416 417 418 419 420 421 422 423 424
#if CONFIG_NEWBINTRAMODES
    case B_CONTEXT_PRED:
    break;
    /*
    case B_CORNER_PRED:
    corner_predictor(predictor, 16, 4, Above, Left);
    break;
    */
#endif
John Koleszar's avatar
John Koleszar committed
425
  }
John Koleszar's avatar
John Koleszar committed
426
}
427 428

#if CONFIG_COMP_INTRA_PRED
429
void vp9_comp_intra4x4_predict_c(BLOCKD *x,
430
                               int b_mode, int b_mode2,
John Koleszar's avatar
John Koleszar committed
431 432 433 434
                               unsigned char *out_predictor) {
  unsigned char predictor[2][4 * 16];
  int i, j;

435 436
  vp9_intra4x4_predict(x, b_mode, predictor[0]);
  vp9_intra4x4_predict(x, b_mode2, predictor[1]);
John Koleszar's avatar
John Koleszar committed
437 438 439 440

  for (i = 0; i < 16 * 4; i += 16) {
    for (j = i; j < i + 4; j++) {
      out_predictor[j] = (predictor[0][j] + predictor[1][j] + 1) >> 1;
441
    }
John Koleszar's avatar
John Koleszar committed
442
  }
443 444 445
}
#endif

446 447 448
/* copy 4 bytes from the above right down so that the 4x4 prediction modes using pixels above and
 * to the right prediction have filled in pixels to use.
 */
449
void vp9_intra_prediction_down_copy(MACROBLOCKD *xd) {
450
  int extend_edge = (xd->mb_to_right_edge == 0 && xd->mb_index < 2);
Paul Wilkins's avatar
Paul Wilkins committed
451 452
  unsigned char *above_right = *(xd->block[0].base_dst) + xd->block[0].dst -
                               xd->block[0].dst_stride + 16;
453 454
  unsigned int *src_ptr = (unsigned int *)
      (above_right - (xd->mb_index == 3 ? 16 * xd->block[0].dst_stride : 0));
John Koleszar's avatar
John Koleszar committed
455

456
  unsigned int *dst_ptr0 = (unsigned int *)above_right;
Paul Wilkins's avatar
Paul Wilkins committed
457
  unsigned int *dst_ptr1 =
458
    (unsigned int *)(above_right + 4 * xd->block[0].dst_stride);
Paul Wilkins's avatar
Paul Wilkins committed
459
  unsigned int *dst_ptr2 =
460 461
    (unsigned int *)(above_right + 8 * xd->block[0].dst_stride);
  unsigned int *dst_ptr3 =
Paul Wilkins's avatar
Paul Wilkins committed
462
    (unsigned int *)(above_right + 12 * xd->block[0].dst_stride);
John Koleszar's avatar
John Koleszar committed
463

464 465 466 467
  if (extend_edge) {
    *src_ptr = ((uint8_t *) src_ptr)[-1] * 0x01010101U;
  }

John Koleszar's avatar
John Koleszar committed
468 469 470
  *dst_ptr0 = *src_ptr;
  *dst_ptr1 = *src_ptr;
  *dst_ptr2 = *src_ptr;
471
  *dst_ptr3 = *src_ptr;
John Koleszar's avatar
John Koleszar committed
472
}