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