OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 The LibYuv Project Authors. All rights reserved. | 2 * Copyright 2011 The LibYuv Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "libyuv/convert_argb.h" | 11 #include "libyuv/convert_argb.h" |
12 | 12 |
13 #include "libyuv/cpu_id.h" | 13 #include "libyuv/cpu_id.h" |
14 #ifdef HAVE_JPEG | 14 #ifdef HAVE_JPEG |
15 #include "libyuv/mjpeg_decoder.h" | 15 #include "libyuv/mjpeg_decoder.h" |
16 #endif | 16 #endif |
17 #include "libyuv/rotate_argb.h" | 17 #include "libyuv/rotate_argb.h" |
18 #include "libyuv/row.h" | 18 #include "libyuv/row.h" |
19 #include "libyuv/video_common.h" | 19 #include "libyuv/video_common.h" |
20 | 20 |
21 #ifdef __cplusplus | 21 #ifdef __cplusplus |
22 namespace libyuv { | 22 namespace libyuv { |
23 extern "C" { | 23 extern "C" { |
24 #endif | 24 #endif |
25 | 25 |
26 // Convert camera sample to I420 with cropping, rotation and vertical flip. | 26 // Convert camera sample to ARGB with cropping, rotation and vertical flip. |
27 // src_width is used for source stride computation | 27 // src_width is used for source stride computation |
28 // src_height is used to compute location of planes, and indicate inversion | 28 // src_height is used to compute location of planes, and indicate inversion |
29 // sample_size is measured in bytes and is the size of the frame. | 29 // sample_size is measured in bytes and is the size of the frame. |
30 // With MJPEG it is the compressed size of the frame. | 30 // With MJPEG it is the compressed size of the frame. |
31 LIBYUV_API | 31 LIBYUV_API |
32 int ConvertToARGB(const uint8* sample, size_t sample_size, | 32 int ConvertToARGB(const uint8* sample, size_t sample_size, |
33 uint8* crop_argb, int argb_stride, | 33 uint8* crop_argb, int argb_stride, |
34 int crop_x, int crop_y, | 34 int crop_x, int crop_y, |
35 int src_width, int src_height, | 35 int src_width, int src_height, |
36 int crop_width, int crop_height, | 36 int crop_width, int crop_height, |
37 enum RotationMode rotation, | 37 enum RotationMode rotation, |
38 uint32 fourcc) { | 38 uint32 fourcc) { |
39 uint32 format = CanonicalFourCC(fourcc); | 39 uint32 format = CanonicalFourCC(fourcc); |
40 int aligned_src_width = (src_width + 1) & ~1; | 40 int aligned_src_width = (src_width + 1) & ~1; |
41 const uint8* src; | 41 const uint8* src; |
42 const uint8* src_uv; | 42 const uint8* src_uv; |
43 int abs_src_height = (src_height < 0) ? -src_height : src_height; | 43 int abs_src_height = (src_height < 0) ? -src_height : src_height; |
44 int inv_crop_height = (crop_height < 0) ? -crop_height : crop_height; | 44 int inv_crop_height = (crop_height < 0) ? -crop_height : crop_height; |
45 int r = 0; | 45 int r = 0; |
46 | 46 |
47 // One pass rotation is available for some formats. For the rest, convert | 47 // One pass rotation is available for some formats. For the rest, convert |
48 // to I420 (with optional vertical flipping) into a temporary I420 buffer, | 48 // to I420 (with optional vertical flipping) into a temporary I420 buffer, |
49 // and then rotate the I420 to the final destination buffer. | 49 // and then rotate the I420 to the final destination buffer. |
50 // For in-place conversion, if destination crop_argb is same as source sample, | 50 // For in-place conversion, if destination crop_argb is same as source sample, |
51 // also enable temporary buffer. | 51 // also enable temporary buffer. |
52 LIBYUV_BOOL need_buf = (rotation && format != FOURCC_ARGB) || | 52 LIBYUV_BOOL need_buf = (rotation && format != FOURCC_ARGB) || |
53 crop_argb == sample; | 53 crop_argb == sample; |
54 uint8* tmp_argb = crop_argb; | 54 uint8* dest_argb = crop_argb; |
55 int tmp_argb_stride = argb_stride; | 55 int dest_argb_stride = argb_stride; |
56 uint8* rotate_buffer = NULL; | 56 uint8* rotate_buffer = NULL; |
57 int abs_crop_height = (crop_height < 0) ? -crop_height : crop_height; | 57 int abs_crop_height = (crop_height < 0) ? -crop_height : crop_height; |
58 | 58 |
59 if (crop_argb == NULL || sample == NULL || | 59 if (crop_argb == NULL || sample == NULL || |
60 src_width <= 0 || crop_width <= 0 || | 60 src_width <= 0 || crop_width <= 0 || |
61 src_height == 0 || crop_height == 0) { | 61 src_height == 0 || crop_height == 0) { |
62 return -1; | 62 return -1; |
63 } | 63 } |
64 if (src_height < 0) { | 64 if (src_height < 0) { |
65 inv_crop_height = -inv_crop_height; | 65 inv_crop_height = -inv_crop_height; |
66 } | 66 } |
67 | 67 |
68 if (need_buf) { | 68 if (need_buf) { |
69 int argb_size = crop_width * abs_crop_height * 4; | 69 int argb_size = crop_width * 4 * abs_crop_height; |
70 rotate_buffer = (uint8*)malloc(argb_size); | 70 rotate_buffer = (uint8*)malloc(argb_size); |
71 if (!rotate_buffer) { | 71 if (!rotate_buffer) { |
72 return 1; // Out of memory runtime error. | 72 return 1; // Out of memory runtime error. |
73 } | 73 } |
74 crop_argb = rotate_buffer; | 74 crop_argb = rotate_buffer; |
75 argb_stride = crop_width; | 75 argb_stride = crop_width * 4; |
76 } | 76 } |
77 | 77 |
78 switch (format) { | 78 switch (format) { |
79 // Single plane formats | 79 // Single plane formats |
80 case FOURCC_YUY2: | 80 case FOURCC_YUY2: |
81 src = sample + (aligned_src_width * crop_y + crop_x) * 2; | 81 src = sample + (aligned_src_width * crop_y + crop_x) * 2; |
82 r = YUY2ToARGB(src, aligned_src_width * 2, | 82 r = YUY2ToARGB(src, aligned_src_width * 2, |
83 crop_argb, argb_stride, | 83 crop_argb, argb_stride, |
84 crop_width, inv_crop_height); | 84 crop_width, inv_crop_height); |
85 break; | 85 break; |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 src_width, abs_src_height, crop_width, inv_crop_height); | 284 src_width, abs_src_height, crop_width, inv_crop_height); |
285 break; | 285 break; |
286 #endif | 286 #endif |
287 default: | 287 default: |
288 r = -1; // unknown fourcc - return failure code. | 288 r = -1; // unknown fourcc - return failure code. |
289 } | 289 } |
290 | 290 |
291 if (need_buf) { | 291 if (need_buf) { |
292 if (!r) { | 292 if (!r) { |
293 r = ARGBRotate(crop_argb, argb_stride, | 293 r = ARGBRotate(crop_argb, argb_stride, |
294 tmp_argb, tmp_argb_stride, | 294 dest_argb, dest_argb_stride, |
295 crop_width, abs_crop_height, rotation); | 295 crop_width, abs_crop_height, rotation); |
296 } | 296 } |
297 free(rotate_buffer); | 297 free(rotate_buffer); |
298 } | 298 } |
299 | 299 |
300 return r; | 300 return r; |
301 } | 301 } |
302 | 302 |
303 #ifdef __cplusplus | 303 #ifdef __cplusplus |
304 } // extern "C" | 304 } // extern "C" |
305 } // namespace libyuv | 305 } // namespace libyuv |
306 #endif | 306 #endif |
OLD | NEW |