141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org/*
241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org *  Copyright 2011 The LibYuv Project Authors. All rights reserved.
341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org *
441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org *  Use of this source code is governed by a BSD-style license
541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org *  that can be found in the LICENSE file in the root of the source
641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org *  tree. An additional intellectual property rights grant can be found
741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org *  in the file PATENTS. All contributing project authors may
841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org *  be found in the AUTHORS file in the root of the source tree.
941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org */
1041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
1141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include <stdlib.h>
1241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
1341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include "libyuv/convert.h"
1441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
1541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include "libyuv/format_conversion.h"
1641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include "libyuv/video_common.h"
1741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
1841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#ifdef __cplusplus
1941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgnamespace libyuv {
2041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgextern "C" {
2141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#endif
2241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
2341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// Convert camera sample to I420 with cropping, rotation and vertical flip.
2441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// src_width is used for source stride computation
2541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// src_height is used to compute location of planes, and indicate inversion
2641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// sample_size is measured in bytes and is the size of the frame.
2741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org//   With MJPEG it is the compressed size of the frame.
2841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgLIBYUV_API
2941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgint ConvertToI420(const uint8* sample,
3041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                  size_t sample_size,
3141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                  uint8* y, int y_stride,
3241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                  uint8* u, int u_stride,
3341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                  uint8* v, int v_stride,
3441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                  int crop_x, int crop_y,
3541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                  int src_width, int src_height,
3641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                  int crop_width, int crop_height,
3741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                  enum RotationMode rotation,
3841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                  uint32 fourcc) {
3941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  uint32 format = CanonicalFourCC(fourcc);
4041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  int aligned_src_width = (src_width + 1) & ~1;
4141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const uint8* src;
4241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const uint8* src_uv;
4341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  int abs_src_height = (src_height < 0) ? -src_height : src_height;
4441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  int inv_crop_height = (crop_height < 0) ? -crop_height : crop_height;
4541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  int r = 0;
4641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  LIBYUV_BOOL need_buf = (rotation && format != FOURCC_I420 &&
4741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      format != FOURCC_NV12 && format != FOURCC_NV21 &&
4841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      format != FOURCC_YU12 && format != FOURCC_YV12) || y == sample;
4941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  uint8* tmp_y = y;
5041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  uint8* tmp_u = u;
5141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  uint8* tmp_v = v;
5241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  int tmp_y_stride = y_stride;
5341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  int tmp_u_stride = u_stride;
5441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  int tmp_v_stride = v_stride;
5541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  uint8* rotate_buffer = NULL;
5641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  int abs_crop_height = (crop_height < 0) ? -crop_height : crop_height;
5741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
5841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  if (!y || !u || !v || !sample ||
5941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src_width <= 0 || crop_width <= 0  ||
6041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src_height == 0 || crop_height == 0) {
6141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    return -1;
6241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
6341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  if (src_height < 0) {
6441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    inv_crop_height = -inv_crop_height;
6541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
6641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
6741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // One pass rotation is available for some formats. For the rest, convert
6841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // to I420 (with optional vertical flipping) into a temporary I420 buffer,
6941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // and then rotate the I420 to the final destination buffer.
7041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // For in-place conversion, if destination y is same as source sample,
7141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // also enable temporary buffer.
7241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  if (need_buf) {
7341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    int y_size = crop_width * abs_crop_height;
7441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    int uv_size = ((crop_width + 1) / 2) * ((abs_crop_height + 1) / 2);
7541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    rotate_buffer = (uint8*)malloc(y_size + uv_size * 2);
7641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    if (!rotate_buffer) {
7741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      return 1;  // Out of memory runtime error.
7841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    }
7941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    y = rotate_buffer;
8041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    u = y + y_size;
8141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    v = u + uv_size;
8241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    y_stride = crop_width;
8341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    u_stride = v_stride = ((crop_width + 1) / 2);
8441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
8541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
8641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  switch (format) {
8741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    // Single plane formats
8841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_YUY2:
8941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src = sample + (aligned_src_width * crop_y + crop_x) * 2;
9041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = YUY2ToI420(src, aligned_src_width * 2,
9141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     y, y_stride,
9241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     u, u_stride,
9341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     v, v_stride,
9441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     crop_width, inv_crop_height);
9541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
9641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_UYVY:
9741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src = sample + (aligned_src_width * crop_y + crop_x) * 2;
9841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = UYVYToI420(src, aligned_src_width * 2,
9941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     y, y_stride,
10041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     u, u_stride,
10141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     v, v_stride,
10241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     crop_width, inv_crop_height);
10341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
10441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_RGBP:
10541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src = sample + (src_width * crop_y + crop_x) * 2;
10641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = RGB565ToI420(src, src_width * 2,
10741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                       y, y_stride,
10841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                       u, u_stride,
10941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                       v, v_stride,
11041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                       crop_width, inv_crop_height);
11141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
11241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_RGBO:
11341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src = sample + (src_width * crop_y + crop_x) * 2;
11441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = ARGB1555ToI420(src, src_width * 2,
11541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                         y, y_stride,
11641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                         u, u_stride,
11741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                         v, v_stride,
11841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                         crop_width, inv_crop_height);
11941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
12041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_R444:
12141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src = sample + (src_width * crop_y + crop_x) * 2;
12241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = ARGB4444ToI420(src, src_width * 2,
12341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                         y, y_stride,
12441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                         u, u_stride,
12541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                         v, v_stride,
12641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                         crop_width, inv_crop_height);
12741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
12841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_24BG:
12941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src = sample + (src_width * crop_y + crop_x) * 3;
13041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = RGB24ToI420(src, src_width * 3,
13141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                      y, y_stride,
13241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                      u, u_stride,
13341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                      v, v_stride,
13441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                      crop_width, inv_crop_height);
13541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
13641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_RAW:
13741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src = sample + (src_width * crop_y + crop_x) * 3;
13841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = RAWToI420(src, src_width * 3,
13941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                    y, y_stride,
14041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                    u, u_stride,
14141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                    v, v_stride,
14241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                    crop_width, inv_crop_height);
14341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
14441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_ARGB:
14541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src = sample + (src_width * crop_y + crop_x) * 4;
14641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = ARGBToI420(src, src_width * 4,
14741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     y, y_stride,
14841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     u, u_stride,
14941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     v, v_stride,
15041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     crop_width, inv_crop_height);
15141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
15241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_BGRA:
15341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src = sample + (src_width * crop_y + crop_x) * 4;
15441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = BGRAToI420(src, src_width * 4,
15541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     y, y_stride,
15641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     u, u_stride,
15741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     v, v_stride,
15841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     crop_width, inv_crop_height);
15941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
16041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_ABGR:
16141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src = sample + (src_width * crop_y + crop_x) * 4;
16241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = ABGRToI420(src, src_width * 4,
16341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     y, y_stride,
16441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     u, u_stride,
16541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     v, v_stride,
16641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     crop_width, inv_crop_height);
16741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
16841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_RGBA:
16941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src = sample + (src_width * crop_y + crop_x) * 4;
17041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = RGBAToI420(src, src_width * 4,
17141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     y, y_stride,
17241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     u, u_stride,
17341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     v, v_stride,
17441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     crop_width, inv_crop_height);
17541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
17641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    // TODO(fbarchard): Support cropping Bayer by odd numbers
17741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    // by adjusting fourcc.
17841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_BGGR:
17941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src = sample + (src_width * crop_y + crop_x);
18041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = BayerBGGRToI420(src, src_width,
18141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                          y, y_stride,
18241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                          u, u_stride,
18341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                          v, v_stride,
18441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                          crop_width, inv_crop_height);
18541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
18641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_GBRG:
18741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src = sample + (src_width * crop_y + crop_x);
18841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = BayerGBRGToI420(src, src_width,
18941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                          y, y_stride,
19041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                          u, u_stride,
19141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                          v, v_stride,
19241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                          crop_width, inv_crop_height);
19341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
19441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_GRBG:
19541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src = sample + (src_width * crop_y + crop_x);
19641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = BayerGRBGToI420(src, src_width,
19741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                          y, y_stride,
19841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                          u, u_stride,
19941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                          v, v_stride,
20041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                          crop_width, inv_crop_height);
20141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
20241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_RGGB:
20341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src = sample + (src_width * crop_y + crop_x);
20441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = BayerRGGBToI420(src, src_width,
20541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                          y, y_stride,
20641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                          u, u_stride,
20741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                          v, v_stride,
20841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                          crop_width, inv_crop_height);
20941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
21041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_I400:
21141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src = sample + src_width * crop_y + crop_x;
21241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = I400ToI420(src, src_width,
21341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     y, y_stride,
21441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     u, u_stride,
21541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     v, v_stride,
21641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     crop_width, inv_crop_height);
21741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
21841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    // Biplanar formats
21941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_NV12:
22041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src = sample + (src_width * crop_y + crop_x);
22141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src_uv = sample + aligned_src_width * (src_height + crop_y / 2) + crop_x;
22241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = NV12ToI420Rotate(src, src_width,
22341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                           src_uv, aligned_src_width,
22441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                           y, y_stride,
22541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                           u, u_stride,
22641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                           v, v_stride,
22741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                           crop_width, inv_crop_height, rotation);
22841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
22941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_NV21:
23041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src = sample + (src_width * crop_y + crop_x);
23141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src_uv = sample + aligned_src_width * (src_height + crop_y / 2) + crop_x;
23241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      // Call NV12 but with u and v parameters swapped.
23341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = NV12ToI420Rotate(src, src_width,
23441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                           src_uv, aligned_src_width,
23541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                           y, y_stride,
23641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                           v, v_stride,
23741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                           u, u_stride,
23841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                           crop_width, inv_crop_height, rotation);
23941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
24041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_M420:
24141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src = sample + (src_width * crop_y) * 12 / 8 + crop_x;
24241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = M420ToI420(src, src_width,
24341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     y, y_stride,
24441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     u, u_stride,
24541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     v, v_stride,
24641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     crop_width, inv_crop_height);
24741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
24841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_Q420:
24941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src = sample + (src_width + aligned_src_width * 2) * crop_y + crop_x;
25041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      src_uv = sample + (src_width + aligned_src_width * 2) * crop_y +
25141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org               src_width + crop_x * 2;
25241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = Q420ToI420(src, src_width * 3,
25341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                    src_uv, src_width * 3,
25441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                    y, y_stride,
25541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                    u, u_stride,
25641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                    v, v_stride,
25741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                    crop_width, inv_crop_height);
25841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
25941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    // Triplanar formats
26041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_I420:
26141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_YU12:
26241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_YV12: {
26341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      const uint8* src_y = sample + (src_width * crop_y + crop_x);
26441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      const uint8* src_u;
26541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      const uint8* src_v;
26641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      int halfwidth = (src_width + 1) / 2;
26741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      int halfheight = (abs_src_height + 1) / 2;
26841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      if (format == FOURCC_YV12) {
26941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        src_v = sample + src_width * abs_src_height +
27041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            (halfwidth * crop_y + crop_x) / 2;
27141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        src_u = sample + src_width * abs_src_height +
27241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            halfwidth * (halfheight + crop_y / 2) + crop_x / 2;
27341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      } else {
27441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        src_u = sample + src_width * abs_src_height +
27541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            (halfwidth * crop_y + crop_x) / 2;
27641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        src_v = sample + src_width * abs_src_height +
27741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            halfwidth * (halfheight + crop_y / 2) + crop_x / 2;
27841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      }
27941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = I420Rotate(src_y, src_width,
28041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     src_u, halfwidth,
28141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     src_v, halfwidth,
28241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     y, y_stride,
28341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     u, u_stride,
28441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     v, v_stride,
28541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     crop_width, inv_crop_height, rotation);
28641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
28741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    }
28841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_I422:
28941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_YV16: {
29041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      const uint8* src_y = sample + src_width * crop_y + crop_x;
29141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      const uint8* src_u;
29241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      const uint8* src_v;
29341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      int halfwidth = (src_width + 1) / 2;
29441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      if (format == FOURCC_YV16) {
29541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        src_v = sample + src_width * abs_src_height +
29641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            halfwidth * crop_y + crop_x / 2;
29741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        src_u = sample + src_width * abs_src_height +
29841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            halfwidth * (abs_src_height + crop_y) + crop_x / 2;
29941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      } else {
30041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        src_u = sample + src_width * abs_src_height +
30141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            halfwidth * crop_y + crop_x / 2;
30241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        src_v = sample + src_width * abs_src_height +
30341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            halfwidth * (abs_src_height + crop_y) + crop_x / 2;
30441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      }
30541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = I422ToI420(src_y, src_width,
30641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     src_u, halfwidth,
30741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     src_v, halfwidth,
30841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     y, y_stride,
30941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     u, u_stride,
31041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     v, v_stride,
31141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     crop_width, inv_crop_height);
31241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
31341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    }
31441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_I444:
31541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_YV24: {
31641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      const uint8* src_y = sample + src_width * crop_y + crop_x;
31741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      const uint8* src_u;
31841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      const uint8* src_v;
31941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      if (format == FOURCC_YV24) {
32041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        src_v = sample + src_width * (abs_src_height + crop_y) + crop_x;
32141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        src_u = sample + src_width * (abs_src_height * 2 + crop_y) + crop_x;
32241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      } else {
32341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        src_u = sample + src_width * (abs_src_height + crop_y) + crop_x;
32441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        src_v = sample + src_width * (abs_src_height * 2 + crop_y) + crop_x;
32541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      }
32641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = I444ToI420(src_y, src_width,
32741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     src_u, src_width,
32841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     src_v, src_width,
32941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     y, y_stride,
33041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     u, u_stride,
33141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     v, v_stride,
33241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     crop_width, inv_crop_height);
33341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
33441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    }
33541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_I411: {
33641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      int quarterwidth = (src_width + 3) / 4;
33741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      const uint8* src_y = sample + src_width * crop_y + crop_x;
33841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      const uint8* src_u = sample + src_width * abs_src_height +
33941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org          quarterwidth * crop_y + crop_x / 4;
34041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      const uint8* src_v = sample + src_width * abs_src_height +
34141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org          quarterwidth * (abs_src_height + crop_y) + crop_x / 4;
34241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = I411ToI420(src_y, src_width,
34341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     src_u, quarterwidth,
34441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     src_v, quarterwidth,
34541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     y, y_stride,
34641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     u, u_stride,
34741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     v, v_stride,
34841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     crop_width, inv_crop_height);
34941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
35041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    }
35141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#ifdef HAVE_JPEG
35241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    case FOURCC_MJPG:
35341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = MJPGToI420(sample, sample_size,
35441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     y, y_stride,
35541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     u, u_stride,
35641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     v, v_stride,
35741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     src_width, abs_src_height, crop_width, inv_crop_height);
35841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
35941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#endif
36041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    default:
36141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = -1;  // unknown fourcc - return failure code.
36241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
36341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
36441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  if (need_buf) {
36541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    if (!r) {
36641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      r = I420Rotate(y, y_stride,
36741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     u, u_stride,
36841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     v, v_stride,
36941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     tmp_y, tmp_y_stride,
37041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     tmp_u, tmp_u_stride,
37141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     tmp_v, tmp_v_stride,
37241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                     crop_width, abs_crop_height, rotation);
37341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    }
37441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    free(rotate_buffer);
37541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
37641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
37741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  return r;
37841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
37941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
38041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#ifdef __cplusplus
38141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}  // extern "C"
38241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}  // namespace libyuv
38341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#endif
384