Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(16)

Side by Side Diff: source/convert.cc

Issue 2271053003: Allow NULL for dst_y in planar formats. BUG=libyuv:631 TEST=unittests build/pass (Closed) Base URL: https://chromium.googlesource.com/libyuv/libyuv@master
Patch Set: Allow NULL for dst_y in planar formats. BUG=libyuv:631 TEST=unittests build/pass Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | source/convert_from.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
(...skipping 26 matching lines...) Expand all
37 int src_y_width, int src_y_height, 37 int src_y_width, int src_y_height,
38 int src_uv_width, int src_uv_height) { 38 int src_uv_width, int src_uv_height) {
39 const int dst_y_width = Abs(src_y_width); 39 const int dst_y_width = Abs(src_y_width);
40 const int dst_y_height = Abs(src_y_height); 40 const int dst_y_height = Abs(src_y_height);
41 const int dst_uv_width = SUBSAMPLE(dst_y_width, 1, 1); 41 const int dst_uv_width = SUBSAMPLE(dst_y_width, 1, 1);
42 const int dst_uv_height = SUBSAMPLE(dst_y_height, 1, 1); 42 const int dst_uv_height = SUBSAMPLE(dst_y_height, 1, 1);
43 if (src_y_width == 0 || src_y_height == 0 || 43 if (src_y_width == 0 || src_y_height == 0 ||
44 src_uv_width == 0 || src_uv_height == 0) { 44 src_uv_width == 0 || src_uv_height == 0) {
45 return -1; 45 return -1;
46 } 46 }
47 // TODO(fbarchard): make Y optional. 47 // TODO(fbarchard): support NULL for dst_y
fbarchard1 2016/08/24 22:34:16 check dst_y is not null.
48 ScalePlane(src_y, src_stride_y, src_y_width, src_y_height, 48 ScalePlane(src_y, src_stride_y, src_y_width, src_y_height,
49 dst_y, dst_stride_y, dst_y_width, dst_y_height, 49 dst_y, dst_stride_y, dst_y_width, dst_y_height,
50 kFilterBilinear); 50 kFilterBilinear);
51 ScalePlane(src_u, src_stride_u, src_uv_width, src_uv_height, 51 ScalePlane(src_u, src_stride_u, src_uv_width, src_uv_height,
52 dst_u, dst_stride_u, dst_uv_width, dst_uv_height, 52 dst_u, dst_stride_u, dst_uv_width, dst_uv_height,
53 kFilterBilinear); 53 kFilterBilinear);
54 ScalePlane(src_v, src_stride_v, src_uv_width, src_uv_height, 54 ScalePlane(src_v, src_stride_v, src_uv_width, src_uv_height,
55 dst_v, dst_stride_v, dst_uv_width, dst_uv_height, 55 dst_v, dst_stride_v, dst_uv_width, dst_uv_height,
56 kFilterBilinear); 56 kFilterBilinear);
57 return 0; 57 return 0;
58 } 58 }
59 59
60 // Copy I420 with optional flipping 60 // Copy I420 with optional flipping
61 // TODO(fbarchard): Use Scale plane which supports mirroring, but ensure 61 // TODO(fbarchard): Use Scale plane which supports mirroring, but ensure
62 // is does row coalescing. 62 // is does row coalescing.
63 LIBYUV_API 63 LIBYUV_API
64 int I420Copy(const uint8* src_y, int src_stride_y, 64 int I420Copy(const uint8* src_y, int src_stride_y,
65 const uint8* src_u, int src_stride_u, 65 const uint8* src_u, int src_stride_u,
66 const uint8* src_v, int src_stride_v, 66 const uint8* src_v, int src_stride_v,
67 uint8* dst_y, int dst_stride_y, 67 uint8* dst_y, int dst_stride_y,
68 uint8* dst_u, int dst_stride_u, 68 uint8* dst_u, int dst_stride_u,
69 uint8* dst_v, int dst_stride_v, 69 uint8* dst_v, int dst_stride_v,
70 int width, int height) { 70 int width, int height) {
71 int halfwidth = (width + 1) >> 1; 71 int halfwidth = (width + 1) >> 1;
72 int halfheight = (height + 1) >> 1; 72 int halfheight = (height + 1) >> 1;
73 if (!src_y || !src_u || !src_v || 73 if (!src_u || !src_v ||
74 !dst_y || !dst_u || !dst_v || 74 !dst_u || !dst_v ||
75 width <= 0 || height == 0) { 75 width <= 0 || height == 0) {
76 return -1; 76 return -1;
77 } 77 }
78 // Negative height means invert the image. 78 // Negative height means invert the image.
79 if (height < 0) { 79 if (height < 0) {
80 height = -height; 80 height = -height;
81 halfheight = (height + 1) >> 1; 81 halfheight = (height + 1) >> 1;
82 src_y = src_y + (height - 1) * src_stride_y; 82 src_y = src_y + (height - 1) * src_stride_y;
83 src_u = src_u + (halfheight - 1) * src_stride_u; 83 src_u = src_u + (halfheight - 1) * src_stride_u;
84 src_v = src_v + (halfheight - 1) * src_stride_v; 84 src_v = src_v + (halfheight - 1) * src_stride_v;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 // 420 chroma is 1/2 width, 1/2 height 141 // 420 chroma is 1/2 width, 1/2 height
142 LIBYUV_API 142 LIBYUV_API
143 int I411ToI420(const uint8* src_y, int src_stride_y, 143 int I411ToI420(const uint8* src_y, int src_stride_y,
144 const uint8* src_u, int src_stride_u, 144 const uint8* src_u, int src_stride_u,
145 const uint8* src_v, int src_stride_v, 145 const uint8* src_v, int src_stride_v,
146 uint8* dst_y, int dst_stride_y, 146 uint8* dst_y, int dst_stride_y,
147 uint8* dst_u, int dst_stride_u, 147 uint8* dst_u, int dst_stride_u,
148 uint8* dst_v, int dst_stride_v, 148 uint8* dst_v, int dst_stride_v,
149 int width, int height) { 149 int width, int height) {
150 const int src_uv_width = SUBSAMPLE(width, 3, 2); 150 const int src_uv_width = SUBSAMPLE(width, 3, 2);
151 return I4xxToI420(src_y, src_stride_y, 151 return I4xxToI420(src_y, src_stride_y,
fbarchard1 2016/08/24 22:34:16 consider CopyPlane here
152 src_u, src_stride_u, 152 src_u, src_stride_u,
153 src_v, src_stride_v, 153 src_v, src_stride_v,
154 dst_y, dst_stride_y, 154 dst_y, dst_stride_y,
155 dst_u, dst_stride_u, 155 dst_u, dst_stride_u,
156 dst_v, dst_stride_v, 156 dst_v, dst_stride_v,
157 width, height, 157 width, height,
158 src_uv_width, height); 158 src_uv_width, height);
159 } 159 }
160 160
161 // I400 is greyscale typically used in MJPG 161 // I400 is greyscale typically used in MJPG
162 LIBYUV_API 162 LIBYUV_API
163 int I400ToI420(const uint8* src_y, int src_stride_y, 163 int I400ToI420(const uint8* src_y, int src_stride_y,
164 uint8* dst_y, int dst_stride_y, 164 uint8* dst_y, int dst_stride_y,
165 uint8* dst_u, int dst_stride_u, 165 uint8* dst_u, int dst_stride_u,
166 uint8* dst_v, int dst_stride_v, 166 uint8* dst_v, int dst_stride_v,
167 int width, int height) { 167 int width, int height) {
168 int halfwidth = (width + 1) >> 1; 168 int halfwidth = (width + 1) >> 1;
169 int halfheight = (height + 1) >> 1; 169 int halfheight = (height + 1) >> 1;
170 if (!src_y || !dst_y || !dst_u || !dst_v || 170 if (!dst_u || !dst_v ||
171 width <= 0 || height == 0) { 171 width <= 0 || height == 0) {
172 return -1; 172 return -1;
173 } 173 }
174 // Negative height means invert the image. 174 // Negative height means invert the image.
175 if (height < 0) { 175 if (height < 0) {
176 height = -height; 176 height = -height;
177 halfheight = (height + 1) >> 1; 177 halfheight = (height + 1) >> 1;
178 src_y = src_y + (height - 1) * src_stride_y; 178 src_y = src_y + (height - 1) * src_stride_y;
179 src_stride_y = -src_stride_y; 179 src_stride_y = -src_stride_y;
180 } 180 }
181 CopyPlane(src_y, src_stride_y, dst_y, dst_stride_y, width, height); 181 if (dst_y) {
182 CopyPlane(src_y, src_stride_y, dst_y, dst_stride_y, width, height);
183 }
182 SetPlane(dst_u, dst_stride_u, halfwidth, halfheight, 128); 184 SetPlane(dst_u, dst_stride_u, halfwidth, halfheight, 128);
183 SetPlane(dst_v, dst_stride_v, halfwidth, halfheight, 128); 185 SetPlane(dst_v, dst_stride_v, halfwidth, halfheight, 128);
184 return 0; 186 return 0;
185 } 187 }
186 188
187 static void CopyPlane2(const uint8* src, int src_stride_0, int src_stride_1, 189 static void CopyPlane2(const uint8* src, int src_stride_0, int src_stride_1,
188 uint8* dst, int dst_stride, 190 uint8* dst, int dst_stride,
189 int width, int height) { 191 int width, int height) {
190 int y; 192 int y;
191 void (*CopyRow)(const uint8* src, uint8* dst, int width) = CopyRow_C; 193 void (*CopyRow)(const uint8* src, uint8* dst, int width) = CopyRow_C;
(...skipping 1236 matching lines...) Expand 10 before | Expand all | Expand 10 after
1428 const uint8* src_v, int src_stride_v, 1430 const uint8* src_v, int src_stride_v,
1429 int src_pixel_stride_uv, 1431 int src_pixel_stride_uv,
1430 uint8* dst_y, int dst_stride_y, 1432 uint8* dst_y, int dst_stride_y,
1431 uint8* dst_u, int dst_stride_u, 1433 uint8* dst_u, int dst_stride_u,
1432 uint8* dst_v, int dst_stride_v, 1434 uint8* dst_v, int dst_stride_v,
1433 int width, int height) { 1435 int width, int height) {
1434 int y; 1436 int y;
1435 const int vu_off = src_v - src_u; 1437 const int vu_off = src_v - src_u;
1436 int halfwidth = (width + 1) >> 1; 1438 int halfwidth = (width + 1) >> 1;
1437 int halfheight = (height + 1) >> 1; 1439 int halfheight = (height + 1) >> 1;
1438 if (!src_y || !src_u || !src_v || 1440 if (!src_u || !src_v ||
1439 !dst_y || !dst_u || !dst_v || 1441 !dst_u || !dst_v ||
1440 width <= 0 || height == 0) { 1442 width <= 0 || height == 0) {
1441 return -1; 1443 return -1;
1442 } 1444 }
1443 // Negative height means invert the image. 1445 // Negative height means invert the image.
1444 if (height < 0) { 1446 if (height < 0) {
1445 height = -height; 1447 height = -height;
1446 halfheight = (height + 1) >> 1; 1448 halfheight = (height + 1) >> 1;
1447 src_y = src_y + (height - 1) * src_stride_y; 1449 src_y = src_y + (height - 1) * src_stride_y;
1448 src_u = src_u + (halfheight - 1) * src_stride_u; 1450 src_u = src_u + (halfheight - 1) * src_stride_u;
1449 src_v = src_v + (halfheight - 1) * src_stride_v; 1451 src_v = src_v + (halfheight - 1) * src_stride_v;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1483 dst_u += dst_stride_u; 1485 dst_u += dst_stride_u;
1484 dst_v += dst_stride_v; 1486 dst_v += dst_stride_v;
1485 } 1487 }
1486 return 0; 1488 return 0;
1487 } 1489 }
1488 1490
1489 #ifdef __cplusplus 1491 #ifdef __cplusplus
1490 } // extern "C" 1492 } // extern "C"
1491 } // namespace libyuv 1493 } // namespace libyuv
1492 #endif 1494 #endif
OLDNEW
« no previous file with comments | « no previous file | source/convert_from.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698