| 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 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 int I444ToARGB(const uint8* src_y, int src_stride_y, | 49 int I444ToARGB(const uint8* src_y, int src_stride_y, |
| 50 const uint8* src_u, int src_stride_u, | 50 const uint8* src_u, int src_stride_u, |
| 51 const uint8* src_v, int src_stride_v, | 51 const uint8* src_v, int src_stride_v, |
| 52 uint8* dst_argb, int dst_stride_argb, | 52 uint8* dst_argb, int dst_stride_argb, |
| 53 int width, int height) { | 53 int width, int height) { |
| 54 int y; | 54 int y; |
| 55 void (*I444ToARGBRow)(const uint8* y_buf, | 55 void (*I444ToARGBRow)(const uint8* y_buf, |
| 56 const uint8* u_buf, | 56 const uint8* u_buf, |
| 57 const uint8* v_buf, | 57 const uint8* v_buf, |
| 58 uint8* rgb_buf, | 58 uint8* rgb_buf, |
| 59 struct YuvConstants* yuvconstants, |
| 59 int width) = I444ToARGBRow_C; | 60 int width) = I444ToARGBRow_C; |
| 60 if (!src_y || !src_u || !src_v || | 61 if (!src_y || !src_u || !src_v || |
| 61 !dst_argb || | 62 !dst_argb || |
| 62 width <= 0 || height == 0) { | 63 width <= 0 || height == 0) { |
| 63 return -1; | 64 return -1; |
| 64 } | 65 } |
| 65 // Negative height means invert the image. | 66 // Negative height means invert the image. |
| 66 if (height < 0) { | 67 if (height < 0) { |
| 67 height = -height; | 68 height = -height; |
| 68 dst_argb = dst_argb + (height - 1) * dst_stride_argb; | 69 dst_argb = dst_argb + (height - 1) * dst_stride_argb; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 96 #if defined(HAS_I444TOARGBROW_NEON) | 97 #if defined(HAS_I444TOARGBROW_NEON) |
| 97 if (TestCpuFlag(kCpuHasNEON)) { | 98 if (TestCpuFlag(kCpuHasNEON)) { |
| 98 I444ToARGBRow = I444ToARGBRow_Any_NEON; | 99 I444ToARGBRow = I444ToARGBRow_Any_NEON; |
| 99 if (IS_ALIGNED(width, 8)) { | 100 if (IS_ALIGNED(width, 8)) { |
| 100 I444ToARGBRow = I444ToARGBRow_NEON; | 101 I444ToARGBRow = I444ToARGBRow_NEON; |
| 101 } | 102 } |
| 102 } | 103 } |
| 103 #endif | 104 #endif |
| 104 | 105 |
| 105 for (y = 0; y < height; ++y) { | 106 for (y = 0; y < height; ++y) { |
| 106 I444ToARGBRow(src_y, src_u, src_v, dst_argb, width); | 107 I444ToARGBRow(src_y, src_u, src_v, dst_argb, &kYuvConstants, width); |
| 107 dst_argb += dst_stride_argb; | 108 dst_argb += dst_stride_argb; |
| 108 src_y += src_stride_y; | 109 src_y += src_stride_y; |
| 109 src_u += src_stride_u; | 110 src_u += src_stride_u; |
| 110 src_v += src_stride_v; | 111 src_v += src_stride_v; |
| 111 } | 112 } |
| 112 return 0; | 113 return 0; |
| 113 } | 114 } |
| 114 | 115 |
| 115 // Convert I444 to ABGR. | 116 // Convert I444 to ABGR. |
| 116 LIBYUV_API | 117 LIBYUV_API |
| 117 int I444ToABGR(const uint8* src_y, int src_stride_y, | 118 int I444ToABGR(const uint8* src_y, int src_stride_y, |
| 118 const uint8* src_u, int src_stride_u, | 119 const uint8* src_u, int src_stride_u, |
| 119 const uint8* src_v, int src_stride_v, | 120 const uint8* src_v, int src_stride_v, |
| 120 uint8* dst_abgr, int dst_stride_abgr, | 121 uint8* dst_abgr, int dst_stride_abgr, |
| 121 int width, int height) { | 122 int width, int height) { |
| 122 int y; | 123 int y; |
| 123 void (*I444ToABGRRow)(const uint8* y_buf, | 124 void (*I444ToABGRRow)(const uint8* y_buf, |
| 124 const uint8* u_buf, | 125 const uint8* u_buf, |
| 125 const uint8* v_buf, | 126 const uint8* v_buf, |
| 126 uint8* rgb_buf, | 127 uint8* rgb_buf, |
| 128 struct YuvConstants* yuvconstants, |
| 127 int width) = I444ToABGRRow_C; | 129 int width) = I444ToABGRRow_C; |
| 128 if (!src_y || !src_u || !src_v || | 130 if (!src_y || !src_u || !src_v || |
| 129 !dst_abgr || | 131 !dst_abgr || |
| 130 width <= 0 || height == 0) { | 132 width <= 0 || height == 0) { |
| 131 return -1; | 133 return -1; |
| 132 } | 134 } |
| 133 // Negative height means invert the image. | 135 // Negative height means invert the image. |
| 134 if (height < 0) { | 136 if (height < 0) { |
| 135 height = -height; | 137 height = -height; |
| 136 dst_abgr = dst_abgr + (height - 1) * dst_stride_abgr; | 138 dst_abgr = dst_abgr + (height - 1) * dst_stride_abgr; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 164 #if defined(HAS_I444TOABGRROW_NEON) | 166 #if defined(HAS_I444TOABGRROW_NEON) |
| 165 if (TestCpuFlag(kCpuHasNEON)) { | 167 if (TestCpuFlag(kCpuHasNEON)) { |
| 166 I444ToABGRRow = I444ToABGRRow_Any_NEON; | 168 I444ToABGRRow = I444ToABGRRow_Any_NEON; |
| 167 if (IS_ALIGNED(width, 8)) { | 169 if (IS_ALIGNED(width, 8)) { |
| 168 I444ToABGRRow = I444ToABGRRow_NEON; | 170 I444ToABGRRow = I444ToABGRRow_NEON; |
| 169 } | 171 } |
| 170 } | 172 } |
| 171 #endif | 173 #endif |
| 172 | 174 |
| 173 for (y = 0; y < height; ++y) { | 175 for (y = 0; y < height; ++y) { |
| 174 I444ToABGRRow(src_y, src_u, src_v, dst_abgr, width); | 176 I444ToABGRRow(src_y, src_u, src_v, dst_abgr, &kYuvConstants, width); |
| 175 dst_abgr += dst_stride_abgr; | 177 dst_abgr += dst_stride_abgr; |
| 176 src_y += src_stride_y; | 178 src_y += src_stride_y; |
| 177 src_u += src_stride_u; | 179 src_u += src_stride_u; |
| 178 src_v += src_stride_v; | 180 src_v += src_stride_v; |
| 179 } | 181 } |
| 180 return 0; | 182 return 0; |
| 181 } | 183 } |
| 182 | 184 |
| 183 // Convert I422 to ARGB. | 185 // Convert I422 to ARGB. |
| 184 LIBYUV_API | 186 LIBYUV_API |
| 185 int I422ToARGB(const uint8* src_y, int src_stride_y, | 187 int I422ToARGB(const uint8* src_y, int src_stride_y, |
| 186 const uint8* src_u, int src_stride_u, | 188 const uint8* src_u, int src_stride_u, |
| 187 const uint8* src_v, int src_stride_v, | 189 const uint8* src_v, int src_stride_v, |
| 188 uint8* dst_argb, int dst_stride_argb, | 190 uint8* dst_argb, int dst_stride_argb, |
| 189 int width, int height) { | 191 int width, int height) { |
| 190 int y; | 192 int y; |
| 191 void (*I422ToARGBRow)(const uint8* y_buf, | 193 void (*I422ToARGBRow)(const uint8* y_buf, |
| 192 const uint8* u_buf, | 194 const uint8* u_buf, |
| 193 const uint8* v_buf, | 195 const uint8* v_buf, |
| 194 uint8* rgb_buf, | 196 uint8* rgb_buf, |
| 197 struct YuvConstants* yuvconstants, |
| 195 int width) = I422ToARGBRow_C; | 198 int width) = I422ToARGBRow_C; |
| 196 if (!src_y || !src_u || !src_v || | 199 if (!src_y || !src_u || !src_v || |
| 197 !dst_argb || | 200 !dst_argb || |
| 198 width <= 0 || height == 0) { | 201 width <= 0 || height == 0) { |
| 199 return -1; | 202 return -1; |
| 200 } | 203 } |
| 201 // Negative height means invert the image. | 204 // Negative height means invert the image. |
| 202 if (height < 0) { | 205 if (height < 0) { |
| 203 height = -height; | 206 height = -height; |
| 204 dst_argb = dst_argb + (height - 1) * dst_stride_argb; | 207 dst_argb = dst_argb + (height - 1) * dst_stride_argb; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 241 if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) && | 244 if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) && |
| 242 IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) && | 245 IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) && |
| 243 IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) && | 246 IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) && |
| 244 IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) && | 247 IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) && |
| 245 IS_ALIGNED(dst_argb, 4) && IS_ALIGNED(dst_stride_argb, 4)) { | 248 IS_ALIGNED(dst_argb, 4) && IS_ALIGNED(dst_stride_argb, 4)) { |
| 246 I422ToARGBRow = I422ToARGBRow_MIPS_DSPR2; | 249 I422ToARGBRow = I422ToARGBRow_MIPS_DSPR2; |
| 247 } | 250 } |
| 248 #endif | 251 #endif |
| 249 | 252 |
| 250 for (y = 0; y < height; ++y) { | 253 for (y = 0; y < height; ++y) { |
| 251 I422ToARGBRow(src_y, src_u, src_v, dst_argb, width); | 254 I422ToARGBRow(src_y, src_u, src_v, dst_argb, &kYuvConstants, width); |
| 252 dst_argb += dst_stride_argb; | 255 dst_argb += dst_stride_argb; |
| 253 src_y += src_stride_y; | 256 src_y += src_stride_y; |
| 254 src_u += src_stride_u; | 257 src_u += src_stride_u; |
| 255 src_v += src_stride_v; | 258 src_v += src_stride_v; |
| 256 } | 259 } |
| 257 return 0; | 260 return 0; |
| 258 } | 261 } |
| 259 | 262 |
| 260 // Convert I411 to ARGB. | 263 // Convert I411 to ARGB. |
| 261 LIBYUV_API | 264 LIBYUV_API |
| 262 int I411ToARGB(const uint8* src_y, int src_stride_y, | 265 int I411ToARGB(const uint8* src_y, int src_stride_y, |
| 263 const uint8* src_u, int src_stride_u, | 266 const uint8* src_u, int src_stride_u, |
| 264 const uint8* src_v, int src_stride_v, | 267 const uint8* src_v, int src_stride_v, |
| 265 uint8* dst_argb, int dst_stride_argb, | 268 uint8* dst_argb, int dst_stride_argb, |
| 266 int width, int height) { | 269 int width, int height) { |
| 267 int y; | 270 int y; |
| 268 void (*I411ToARGBRow)(const uint8* y_buf, | 271 void (*I411ToARGBRow)(const uint8* y_buf, |
| 269 const uint8* u_buf, | 272 const uint8* u_buf, |
| 270 const uint8* v_buf, | 273 const uint8* v_buf, |
| 271 uint8* rgb_buf, | 274 uint8* rgb_buf, |
| 275 struct YuvConstants* yuvconstants, |
| 272 int width) = I411ToARGBRow_C; | 276 int width) = I411ToARGBRow_C; |
| 273 if (!src_y || !src_u || !src_v || | 277 if (!src_y || !src_u || !src_v || |
| 274 !dst_argb || | 278 !dst_argb || |
| 275 width <= 0 || height == 0) { | 279 width <= 0 || height == 0) { |
| 276 return -1; | 280 return -1; |
| 277 } | 281 } |
| 278 // Negative height means invert the image. | 282 // Negative height means invert the image. |
| 279 if (height < 0) { | 283 if (height < 0) { |
| 280 height = -height; | 284 height = -height; |
| 281 dst_argb = dst_argb + (height - 1) * dst_stride_argb; | 285 dst_argb = dst_argb + (height - 1) * dst_stride_argb; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 309 #if defined(HAS_I411TOARGBROW_NEON) | 313 #if defined(HAS_I411TOARGBROW_NEON) |
| 310 if (TestCpuFlag(kCpuHasNEON)) { | 314 if (TestCpuFlag(kCpuHasNEON)) { |
| 311 I411ToARGBRow = I411ToARGBRow_Any_NEON; | 315 I411ToARGBRow = I411ToARGBRow_Any_NEON; |
| 312 if (IS_ALIGNED(width, 8)) { | 316 if (IS_ALIGNED(width, 8)) { |
| 313 I411ToARGBRow = I411ToARGBRow_NEON; | 317 I411ToARGBRow = I411ToARGBRow_NEON; |
| 314 } | 318 } |
| 315 } | 319 } |
| 316 #endif | 320 #endif |
| 317 | 321 |
| 318 for (y = 0; y < height; ++y) { | 322 for (y = 0; y < height; ++y) { |
| 319 I411ToARGBRow(src_y, src_u, src_v, dst_argb, width); | 323 I411ToARGBRow(src_y, src_u, src_v, dst_argb, &kYuvConstants, width); |
| 320 dst_argb += dst_stride_argb; | 324 dst_argb += dst_stride_argb; |
| 321 src_y += src_stride_y; | 325 src_y += src_stride_y; |
| 322 src_u += src_stride_u; | 326 src_u += src_stride_u; |
| 323 src_v += src_stride_v; | 327 src_v += src_stride_v; |
| 324 } | 328 } |
| 325 return 0; | 329 return 0; |
| 326 } | 330 } |
| 327 | 331 |
| 328 // Convert I420 with Alpha to preattenuated ARGB. | 332 // Convert I420 with Alpha to preattenuated ARGB. |
| 329 LIBYUV_API | 333 LIBYUV_API |
| 330 int I420AlphaToARGB(const uint8* src_y, int src_stride_y, | 334 int I420AlphaToARGB(const uint8* src_y, int src_stride_y, |
| 331 const uint8* src_u, int src_stride_u, | 335 const uint8* src_u, int src_stride_u, |
| 332 const uint8* src_v, int src_stride_v, | 336 const uint8* src_v, int src_stride_v, |
| 333 const uint8* src_a, int src_stride_a, | 337 const uint8* src_a, int src_stride_a, |
| 334 uint8* dst_argb, int dst_stride_argb, | 338 uint8* dst_argb, int dst_stride_argb, |
| 335 int width, int height) { | 339 int width, int height) { |
| 336 int y; | 340 int y; |
| 337 void (*I422ToARGBRow)(const uint8* y_buf, | 341 void (*I422ToARGBRow)(const uint8* y_buf, |
| 338 const uint8* u_buf, | 342 const uint8* u_buf, |
| 339 const uint8* v_buf, | 343 const uint8* v_buf, |
| 340 uint8* rgb_buf, | 344 uint8* rgb_buf, |
| 345 struct YuvConstants* yuvconstants, |
| 341 int width) = I422ToARGBRow_C; | 346 int width) = I422ToARGBRow_C; |
| 342 void (*ARGBCopyYToAlphaRow)(const uint8* src_y, uint8* dst_argb, int width) = | 347 void (*ARGBCopyYToAlphaRow)(const uint8* src_y, uint8* dst_argb, int width) = |
| 343 ARGBCopyYToAlphaRow_C; | 348 ARGBCopyYToAlphaRow_C; |
| 344 void (*ARGBAttenuateRow)(const uint8* src_argb, uint8* dst_argb, | 349 void (*ARGBAttenuateRow)(const uint8* src_argb, uint8* dst_argb, |
| 345 int width) = ARGBAttenuateRow_C; | 350 int width) = ARGBAttenuateRow_C; |
| 346 if (!src_y || !src_u || !src_v || !dst_argb || | 351 if (!src_y || !src_u || !src_v || !dst_argb || |
| 347 width <= 0 || height == 0) { | 352 width <= 0 || height == 0) { |
| 348 return -1; | 353 return -1; |
| 349 } | 354 } |
| 350 // Negative height means invert the image. | 355 // Negative height means invert the image. |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 429 #if defined(HAS_ARGBATTENUATEROW_NEON) | 434 #if defined(HAS_ARGBATTENUATEROW_NEON) |
| 430 if (TestCpuFlag(kCpuHasNEON)) { | 435 if (TestCpuFlag(kCpuHasNEON)) { |
| 431 ARGBAttenuateRow = ARGBAttenuateRow_Any_NEON; | 436 ARGBAttenuateRow = ARGBAttenuateRow_Any_NEON; |
| 432 if (IS_ALIGNED(width, 8)) { | 437 if (IS_ALIGNED(width, 8)) { |
| 433 ARGBAttenuateRow = ARGBAttenuateRow_NEON; | 438 ARGBAttenuateRow = ARGBAttenuateRow_NEON; |
| 434 } | 439 } |
| 435 } | 440 } |
| 436 #endif | 441 #endif |
| 437 | 442 |
| 438 for (y = 0; y < height; ++y) { | 443 for (y = 0; y < height; ++y) { |
| 439 I422ToARGBRow(src_y, src_u, src_v, dst_argb, width); | 444 I422ToARGBRow(src_y, src_u, src_v, dst_argb, &kYuvConstants, width); |
| 440 ARGBCopyYToAlphaRow(src_a, dst_argb, width); | 445 ARGBCopyYToAlphaRow(src_a, dst_argb, width); |
| 441 ARGBAttenuateRow(dst_argb, dst_argb, width); | 446 ARGBAttenuateRow(dst_argb, dst_argb, width); |
| 442 dst_argb += dst_stride_argb; | 447 dst_argb += dst_stride_argb; |
| 443 src_a += src_stride_a; | 448 src_a += src_stride_a; |
| 444 src_y += src_stride_y; | 449 src_y += src_stride_y; |
| 445 if (y & 1) { | 450 if (y & 1) { |
| 446 src_u += src_stride_u; | 451 src_u += src_stride_u; |
| 447 src_v += src_stride_v; | 452 src_v += src_stride_v; |
| 448 } | 453 } |
| 449 } | 454 } |
| 450 return 0; | 455 return 0; |
| 451 } | 456 } |
| 452 // Convert I420 with Alpha to preattenuated ABGR. | 457 // Convert I420 with Alpha to preattenuated ABGR. |
| 453 LIBYUV_API | 458 LIBYUV_API |
| 454 int I420AlphaToABGR(const uint8* src_y, int src_stride_y, | 459 int I420AlphaToABGR(const uint8* src_y, int src_stride_y, |
| 455 const uint8* src_u, int src_stride_u, | 460 const uint8* src_u, int src_stride_u, |
| 456 const uint8* src_v, int src_stride_v, | 461 const uint8* src_v, int src_stride_v, |
| 457 const uint8* src_a, int src_stride_a, | 462 const uint8* src_a, int src_stride_a, |
| 458 uint8* dst_abgr, int dst_stride_abgr, | 463 uint8* dst_abgr, int dst_stride_abgr, |
| 459 int width, int height) { | 464 int width, int height) { |
| 460 int y; | 465 int y; |
| 461 void (*I422ToABGRRow)(const uint8* y_buf, | 466 void (*I422ToABGRRow)(const uint8* y_buf, |
| 462 const uint8* u_buf, | 467 const uint8* u_buf, |
| 463 const uint8* v_buf, | 468 const uint8* v_buf, |
| 464 uint8* rgb_buf, | 469 uint8* rgb_buf, |
| 470 struct YuvConstants* yuvconstants, |
| 465 int width) = I422ToABGRRow_C; | 471 int width) = I422ToABGRRow_C; |
| 466 void (*ARGBCopyYToAlphaRow)(const uint8* src_y, uint8* dst_argb, int width) = | 472 void (*ARGBCopyYToAlphaRow)(const uint8* src_y, uint8* dst_argb, int width) = |
| 467 ARGBCopyYToAlphaRow_C; | 473 ARGBCopyYToAlphaRow_C; |
| 468 void (*ARGBAttenuateRow)(const uint8* src_argb, uint8* dst_argb, | 474 void (*ARGBAttenuateRow)(const uint8* src_argb, uint8* dst_argb, |
| 469 int width) = ARGBAttenuateRow_C; | 475 int width) = ARGBAttenuateRow_C; |
| 470 if (!src_y || !src_u || !src_v || !dst_abgr || | 476 if (!src_y || !src_u || !src_v || !dst_abgr || |
| 471 width <= 0 || height == 0) { | 477 width <= 0 || height == 0) { |
| 472 return -1; | 478 return -1; |
| 473 } | 479 } |
| 474 // Negative height means invert the image. | 480 // Negative height means invert the image. |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 553 #if defined(HAS_ARGBATTENUATEROW_NEON) | 559 #if defined(HAS_ARGBATTENUATEROW_NEON) |
| 554 if (TestCpuFlag(kCpuHasNEON)) { | 560 if (TestCpuFlag(kCpuHasNEON)) { |
| 555 ARGBAttenuateRow = ARGBAttenuateRow_Any_NEON; | 561 ARGBAttenuateRow = ARGBAttenuateRow_Any_NEON; |
| 556 if (IS_ALIGNED(width, 8)) { | 562 if (IS_ALIGNED(width, 8)) { |
| 557 ARGBAttenuateRow = ARGBAttenuateRow_NEON; | 563 ARGBAttenuateRow = ARGBAttenuateRow_NEON; |
| 558 } | 564 } |
| 559 } | 565 } |
| 560 #endif | 566 #endif |
| 561 | 567 |
| 562 for (y = 0; y < height; ++y) { | 568 for (y = 0; y < height; ++y) { |
| 563 I422ToABGRRow(src_y, src_u, src_v, dst_abgr, width); | 569 I422ToABGRRow(src_y, src_u, src_v, dst_abgr, &kYuvConstants, width); |
| 564 ARGBCopyYToAlphaRow(src_a, dst_abgr, width); | 570 ARGBCopyYToAlphaRow(src_a, dst_abgr, width); |
| 565 ARGBAttenuateRow(dst_abgr, dst_abgr, width); | 571 ARGBAttenuateRow(dst_abgr, dst_abgr, width); |
| 566 dst_abgr += dst_stride_abgr; | 572 dst_abgr += dst_stride_abgr; |
| 567 src_a += src_stride_a; | 573 src_a += src_stride_a; |
| 568 src_y += src_stride_y; | 574 src_y += src_stride_y; |
| 569 if (y & 1) { | 575 if (y & 1) { |
| 570 src_u += src_stride_u; | 576 src_u += src_stride_u; |
| 571 src_v += src_stride_v; | 577 src_v += src_stride_v; |
| 572 } | 578 } |
| 573 } | 579 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 632 } | 638 } |
| 633 return 0; | 639 return 0; |
| 634 } | 640 } |
| 635 | 641 |
| 636 // Convert J400 to ARGB. | 642 // Convert J400 to ARGB. |
| 637 LIBYUV_API | 643 LIBYUV_API |
| 638 int J400ToARGB(const uint8* src_y, int src_stride_y, | 644 int J400ToARGB(const uint8* src_y, int src_stride_y, |
| 639 uint8* dst_argb, int dst_stride_argb, | 645 uint8* dst_argb, int dst_stride_argb, |
| 640 int width, int height) { | 646 int width, int height) { |
| 641 int y; | 647 int y; |
| 642 void (*J400ToARGBRow)(const uint8* src_y, uint8* dst_argb, int pix) = | 648 void (*J400ToARGBRow)(const uint8* src_y, uint8* dst_argb, int width) = |
| 643 J400ToARGBRow_C; | 649 J400ToARGBRow_C; |
| 644 if (!src_y || !dst_argb || | 650 if (!src_y || !dst_argb || |
| 645 width <= 0 || height == 0) { | 651 width <= 0 || height == 0) { |
| 646 return -1; | 652 return -1; |
| 647 } | 653 } |
| 648 // Negative height means invert the image. | 654 // Negative height means invert the image. |
| 649 if (height < 0) { | 655 if (height < 0) { |
| 650 height = -height; | 656 height = -height; |
| 651 src_y = src_y + (height - 1) * src_stride_y; | 657 src_y = src_y + (height - 1) * src_stride_y; |
| 652 src_stride_y = -src_stride_y; | 658 src_stride_y = -src_stride_y; |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 759 (const uint8*)(&kShuffleMaskRGBAToARGB), | 765 (const uint8*)(&kShuffleMaskRGBAToARGB), |
| 760 width, height); | 766 width, height); |
| 761 } | 767 } |
| 762 | 768 |
| 763 // Convert RGB24 to ARGB. | 769 // Convert RGB24 to ARGB. |
| 764 LIBYUV_API | 770 LIBYUV_API |
| 765 int RGB24ToARGB(const uint8* src_rgb24, int src_stride_rgb24, | 771 int RGB24ToARGB(const uint8* src_rgb24, int src_stride_rgb24, |
| 766 uint8* dst_argb, int dst_stride_argb, | 772 uint8* dst_argb, int dst_stride_argb, |
| 767 int width, int height) { | 773 int width, int height) { |
| 768 int y; | 774 int y; |
| 769 void (*RGB24ToARGBRow)(const uint8* src_rgb, uint8* dst_argb, int pix) = | 775 void (*RGB24ToARGBRow)(const uint8* src_rgb, uint8* dst_argb, int width) = |
| 770 RGB24ToARGBRow_C; | 776 RGB24ToARGBRow_C; |
| 771 if (!src_rgb24 || !dst_argb || | 777 if (!src_rgb24 || !dst_argb || |
| 772 width <= 0 || height == 0) { | 778 width <= 0 || height == 0) { |
| 773 return -1; | 779 return -1; |
| 774 } | 780 } |
| 775 // Negative height means invert the image. | 781 // Negative height means invert the image. |
| 776 if (height < 0) { | 782 if (height < 0) { |
| 777 height = -height; | 783 height = -height; |
| 778 src_rgb24 = src_rgb24 + (height - 1) * src_stride_rgb24; | 784 src_rgb24 = src_rgb24 + (height - 1) * src_stride_rgb24; |
| 779 src_stride_rgb24 = -src_stride_rgb24; | 785 src_stride_rgb24 = -src_stride_rgb24; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 809 } | 815 } |
| 810 return 0; | 816 return 0; |
| 811 } | 817 } |
| 812 | 818 |
| 813 // Convert RAW to ARGB. | 819 // Convert RAW to ARGB. |
| 814 LIBYUV_API | 820 LIBYUV_API |
| 815 int RAWToARGB(const uint8* src_raw, int src_stride_raw, | 821 int RAWToARGB(const uint8* src_raw, int src_stride_raw, |
| 816 uint8* dst_argb, int dst_stride_argb, | 822 uint8* dst_argb, int dst_stride_argb, |
| 817 int width, int height) { | 823 int width, int height) { |
| 818 int y; | 824 int y; |
| 819 void (*RAWToARGBRow)(const uint8* src_rgb, uint8* dst_argb, int pix) = | 825 void (*RAWToARGBRow)(const uint8* src_rgb, uint8* dst_argb, int width) = |
| 820 RAWToARGBRow_C; | 826 RAWToARGBRow_C; |
| 821 if (!src_raw || !dst_argb || | 827 if (!src_raw || !dst_argb || |
| 822 width <= 0 || height == 0) { | 828 width <= 0 || height == 0) { |
| 823 return -1; | 829 return -1; |
| 824 } | 830 } |
| 825 // Negative height means invert the image. | 831 // Negative height means invert the image. |
| 826 if (height < 0) { | 832 if (height < 0) { |
| 827 height = -height; | 833 height = -height; |
| 828 src_raw = src_raw + (height - 1) * src_stride_raw; | 834 src_raw = src_raw + (height - 1) * src_stride_raw; |
| 829 src_stride_raw = -src_stride_raw; | 835 src_stride_raw = -src_stride_raw; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 859 } | 865 } |
| 860 return 0; | 866 return 0; |
| 861 } | 867 } |
| 862 | 868 |
| 863 // Convert RGB565 to ARGB. | 869 // Convert RGB565 to ARGB. |
| 864 LIBYUV_API | 870 LIBYUV_API |
| 865 int RGB565ToARGB(const uint8* src_rgb565, int src_stride_rgb565, | 871 int RGB565ToARGB(const uint8* src_rgb565, int src_stride_rgb565, |
| 866 uint8* dst_argb, int dst_stride_argb, | 872 uint8* dst_argb, int dst_stride_argb, |
| 867 int width, int height) { | 873 int width, int height) { |
| 868 int y; | 874 int y; |
| 869 void (*RGB565ToARGBRow)(const uint8* src_rgb565, uint8* dst_argb, int pix) = | 875 void (*RGB565ToARGBRow)(const uint8* src_rgb565, uint8* dst_argb, int width) = |
| 870 RGB565ToARGBRow_C; | 876 RGB565ToARGBRow_C; |
| 871 if (!src_rgb565 || !dst_argb || | 877 if (!src_rgb565 || !dst_argb || |
| 872 width <= 0 || height == 0) { | 878 width <= 0 || height == 0) { |
| 873 return -1; | 879 return -1; |
| 874 } | 880 } |
| 875 // Negative height means invert the image. | 881 // Negative height means invert the image. |
| 876 if (height < 0) { | 882 if (height < 0) { |
| 877 height = -height; | 883 height = -height; |
| 878 src_rgb565 = src_rgb565 + (height - 1) * src_stride_rgb565; | 884 src_rgb565 = src_rgb565 + (height - 1) * src_stride_rgb565; |
| 879 src_stride_rgb565 = -src_stride_rgb565; | 885 src_stride_rgb565 = -src_stride_rgb565; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 918 return 0; | 924 return 0; |
| 919 } | 925 } |
| 920 | 926 |
| 921 // Convert ARGB1555 to ARGB. | 927 // Convert ARGB1555 to ARGB. |
| 922 LIBYUV_API | 928 LIBYUV_API |
| 923 int ARGB1555ToARGB(const uint8* src_argb1555, int src_stride_argb1555, | 929 int ARGB1555ToARGB(const uint8* src_argb1555, int src_stride_argb1555, |
| 924 uint8* dst_argb, int dst_stride_argb, | 930 uint8* dst_argb, int dst_stride_argb, |
| 925 int width, int height) { | 931 int width, int height) { |
| 926 int y; | 932 int y; |
| 927 void (*ARGB1555ToARGBRow)(const uint8* src_argb1555, uint8* dst_argb, | 933 void (*ARGB1555ToARGBRow)(const uint8* src_argb1555, uint8* dst_argb, |
| 928 int pix) = ARGB1555ToARGBRow_C; | 934 int width) = ARGB1555ToARGBRow_C; |
| 929 if (!src_argb1555 || !dst_argb || | 935 if (!src_argb1555 || !dst_argb || |
| 930 width <= 0 || height == 0) { | 936 width <= 0 || height == 0) { |
| 931 return -1; | 937 return -1; |
| 932 } | 938 } |
| 933 // Negative height means invert the image. | 939 // Negative height means invert the image. |
| 934 if (height < 0) { | 940 if (height < 0) { |
| 935 height = -height; | 941 height = -height; |
| 936 src_argb1555 = src_argb1555 + (height - 1) * src_stride_argb1555; | 942 src_argb1555 = src_argb1555 + (height - 1) * src_stride_argb1555; |
| 937 src_stride_argb1555 = -src_stride_argb1555; | 943 src_stride_argb1555 = -src_stride_argb1555; |
| 938 } | 944 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 976 return 0; | 982 return 0; |
| 977 } | 983 } |
| 978 | 984 |
| 979 // Convert ARGB4444 to ARGB. | 985 // Convert ARGB4444 to ARGB. |
| 980 LIBYUV_API | 986 LIBYUV_API |
| 981 int ARGB4444ToARGB(const uint8* src_argb4444, int src_stride_argb4444, | 987 int ARGB4444ToARGB(const uint8* src_argb4444, int src_stride_argb4444, |
| 982 uint8* dst_argb, int dst_stride_argb, | 988 uint8* dst_argb, int dst_stride_argb, |
| 983 int width, int height) { | 989 int width, int height) { |
| 984 int y; | 990 int y; |
| 985 void (*ARGB4444ToARGBRow)(const uint8* src_argb4444, uint8* dst_argb, | 991 void (*ARGB4444ToARGBRow)(const uint8* src_argb4444, uint8* dst_argb, |
| 986 int pix) = ARGB4444ToARGBRow_C; | 992 int width) = ARGB4444ToARGBRow_C; |
| 987 if (!src_argb4444 || !dst_argb || | 993 if (!src_argb4444 || !dst_argb || |
| 988 width <= 0 || height == 0) { | 994 width <= 0 || height == 0) { |
| 989 return -1; | 995 return -1; |
| 990 } | 996 } |
| 991 // Negative height means invert the image. | 997 // Negative height means invert the image. |
| 992 if (height < 0) { | 998 if (height < 0) { |
| 993 height = -height; | 999 height = -height; |
| 994 src_argb4444 = src_argb4444 + (height - 1) * src_stride_argb4444; | 1000 src_argb4444 = src_argb4444 + (height - 1) * src_stride_argb4444; |
| 995 src_stride_argb4444 = -src_stride_argb4444; | 1001 src_stride_argb4444 = -src_stride_argb4444; |
| 996 } | 1002 } |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1037 // Convert NV12 to ARGB. | 1043 // Convert NV12 to ARGB. |
| 1038 LIBYUV_API | 1044 LIBYUV_API |
| 1039 int NV12ToARGB(const uint8* src_y, int src_stride_y, | 1045 int NV12ToARGB(const uint8* src_y, int src_stride_y, |
| 1040 const uint8* src_uv, int src_stride_uv, | 1046 const uint8* src_uv, int src_stride_uv, |
| 1041 uint8* dst_argb, int dst_stride_argb, | 1047 uint8* dst_argb, int dst_stride_argb, |
| 1042 int width, int height) { | 1048 int width, int height) { |
| 1043 int y; | 1049 int y; |
| 1044 void (*NV12ToARGBRow)(const uint8* y_buf, | 1050 void (*NV12ToARGBRow)(const uint8* y_buf, |
| 1045 const uint8* uv_buf, | 1051 const uint8* uv_buf, |
| 1046 uint8* rgb_buf, | 1052 uint8* rgb_buf, |
| 1053 struct YuvConstants* yuvconstants, |
| 1047 int width) = NV12ToARGBRow_C; | 1054 int width) = NV12ToARGBRow_C; |
| 1048 if (!src_y || !src_uv || !dst_argb || | 1055 if (!src_y || !src_uv || !dst_argb || |
| 1049 width <= 0 || height == 0) { | 1056 width <= 0 || height == 0) { |
| 1050 return -1; | 1057 return -1; |
| 1051 } | 1058 } |
| 1052 // Negative height means invert the image. | 1059 // Negative height means invert the image. |
| 1053 if (height < 0) { | 1060 if (height < 0) { |
| 1054 height = -height; | 1061 height = -height; |
| 1055 dst_argb = dst_argb + (height - 1) * dst_stride_argb; | 1062 dst_argb = dst_argb + (height - 1) * dst_stride_argb; |
| 1056 dst_stride_argb = -dst_stride_argb; | 1063 dst_stride_argb = -dst_stride_argb; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1074 #if defined(HAS_NV12TOARGBROW_NEON) | 1081 #if defined(HAS_NV12TOARGBROW_NEON) |
| 1075 if (TestCpuFlag(kCpuHasNEON)) { | 1082 if (TestCpuFlag(kCpuHasNEON)) { |
| 1076 NV12ToARGBRow = NV12ToARGBRow_Any_NEON; | 1083 NV12ToARGBRow = NV12ToARGBRow_Any_NEON; |
| 1077 if (IS_ALIGNED(width, 8)) { | 1084 if (IS_ALIGNED(width, 8)) { |
| 1078 NV12ToARGBRow = NV12ToARGBRow_NEON; | 1085 NV12ToARGBRow = NV12ToARGBRow_NEON; |
| 1079 } | 1086 } |
| 1080 } | 1087 } |
| 1081 #endif | 1088 #endif |
| 1082 | 1089 |
| 1083 for (y = 0; y < height; ++y) { | 1090 for (y = 0; y < height; ++y) { |
| 1084 NV12ToARGBRow(src_y, src_uv, dst_argb, width); | 1091 NV12ToARGBRow(src_y, src_uv, dst_argb, &kYuvConstants, width); |
| 1085 dst_argb += dst_stride_argb; | 1092 dst_argb += dst_stride_argb; |
| 1086 src_y += src_stride_y; | 1093 src_y += src_stride_y; |
| 1087 if (y & 1) { | 1094 if (y & 1) { |
| 1088 src_uv += src_stride_uv; | 1095 src_uv += src_stride_uv; |
| 1089 } | 1096 } |
| 1090 } | 1097 } |
| 1091 return 0; | 1098 return 0; |
| 1092 } | 1099 } |
| 1093 | 1100 |
| 1094 // Convert NV21 to ARGB. | 1101 // Convert NV21 to ARGB. |
| 1095 LIBYUV_API | 1102 LIBYUV_API |
| 1096 int NV21ToARGB(const uint8* src_y, int src_stride_y, | 1103 int NV21ToARGB(const uint8* src_y, int src_stride_y, |
| 1097 const uint8* src_uv, int src_stride_uv, | 1104 const uint8* src_uv, int src_stride_uv, |
| 1098 uint8* dst_argb, int dst_stride_argb, | 1105 uint8* dst_argb, int dst_stride_argb, |
| 1099 int width, int height) { | 1106 int width, int height) { |
| 1100 int y; | 1107 int y; |
| 1101 void (*NV21ToARGBRow)(const uint8* y_buf, | 1108 void (*NV12ToARGBRow)(const uint8* y_buf, |
| 1102 const uint8* uv_buf, | 1109 const uint8* uv_buf, |
| 1103 uint8* rgb_buf, | 1110 uint8* rgb_buf, |
| 1104 int width) = NV21ToARGBRow_C; | 1111 struct YuvConstants* yuvconstants, |
| 1112 int width) = NV12ToARGBRow_C; |
| 1105 if (!src_y || !src_uv || !dst_argb || | 1113 if (!src_y || !src_uv || !dst_argb || |
| 1106 width <= 0 || height == 0) { | 1114 width <= 0 || height == 0) { |
| 1107 return -1; | 1115 return -1; |
| 1108 } | 1116 } |
| 1109 // Negative height means invert the image. | 1117 // Negative height means invert the image. |
| 1110 if (height < 0) { | 1118 if (height < 0) { |
| 1111 height = -height; | 1119 height = -height; |
| 1112 dst_argb = dst_argb + (height - 1) * dst_stride_argb; | 1120 dst_argb = dst_argb + (height - 1) * dst_stride_argb; |
| 1113 dst_stride_argb = -dst_stride_argb; | 1121 dst_stride_argb = -dst_stride_argb; |
| 1114 } | 1122 } |
| 1115 #if defined(HAS_NV21TOARGBROW_SSSE3) | 1123 #if defined(HAS_NV12TOARGBROW_SSSE3) |
| 1116 if (TestCpuFlag(kCpuHasSSSE3)) { | 1124 if (TestCpuFlag(kCpuHasSSSE3)) { |
| 1117 NV21ToARGBRow = NV21ToARGBRow_Any_SSSE3; | 1125 NV12ToARGBRow = NV12ToARGBRow_Any_SSSE3; |
| 1118 if (IS_ALIGNED(width, 8)) { | 1126 if (IS_ALIGNED(width, 8)) { |
| 1119 NV21ToARGBRow = NV21ToARGBRow_SSSE3; | 1127 NV12ToARGBRow = NV12ToARGBRow_SSSE3; |
| 1120 } | 1128 } |
| 1121 } | 1129 } |
| 1122 #endif | 1130 #endif |
| 1123 #if defined(HAS_NV21TOARGBROW_AVX2) | 1131 #if defined(HAS_NV12TOARGBROW_AVX2) |
| 1124 if (TestCpuFlag(kCpuHasAVX2)) { | 1132 if (TestCpuFlag(kCpuHasAVX2)) { |
| 1125 NV21ToARGBRow = NV21ToARGBRow_Any_AVX2; | 1133 NV12ToARGBRow = NV12ToARGBRow_Any_AVX2; |
| 1126 if (IS_ALIGNED(width, 16)) { | 1134 if (IS_ALIGNED(width, 16)) { |
| 1127 NV21ToARGBRow = NV21ToARGBRow_AVX2; | 1135 NV12ToARGBRow = NV12ToARGBRow_AVX2; |
| 1128 } | 1136 } |
| 1129 } | 1137 } |
| 1130 #endif | 1138 #endif |
| 1131 #if defined(HAS_NV21TOARGBROW_NEON) | 1139 #if defined(HAS_NV12TOARGBROW_NEON) |
| 1132 if (TestCpuFlag(kCpuHasNEON)) { | 1140 if (TestCpuFlag(kCpuHasNEON)) { |
| 1133 NV21ToARGBRow = NV21ToARGBRow_Any_NEON; | 1141 NV12ToARGBRow = NV12ToARGBRow_Any_NEON; |
| 1134 if (IS_ALIGNED(width, 8)) { | 1142 if (IS_ALIGNED(width, 8)) { |
| 1135 NV21ToARGBRow = NV21ToARGBRow_NEON; | 1143 NV12ToARGBRow = NV12ToARGBRow_NEON; |
| 1136 } | 1144 } |
| 1137 } | 1145 } |
| 1138 #endif | 1146 #endif |
| 1139 | 1147 |
| 1140 for (y = 0; y < height; ++y) { | 1148 for (y = 0; y < height; ++y) { |
| 1141 NV21ToARGBRow(src_y, src_uv, dst_argb, width); | 1149 NV12ToARGBRow(src_y, src_uv, dst_argb, &kYvuConstants, width); |
| 1142 dst_argb += dst_stride_argb; | 1150 dst_argb += dst_stride_argb; |
| 1143 src_y += src_stride_y; | 1151 src_y += src_stride_y; |
| 1144 if (y & 1) { | 1152 if (y & 1) { |
| 1145 src_uv += src_stride_uv; | 1153 src_uv += src_stride_uv; |
| 1146 } | 1154 } |
| 1147 } | 1155 } |
| 1148 return 0; | 1156 return 0; |
| 1149 } | 1157 } |
| 1150 | 1158 |
| 1151 // Convert M420 to ARGB. | 1159 // Convert M420 to ARGB. |
| 1152 LIBYUV_API | 1160 LIBYUV_API |
| 1153 int M420ToARGB(const uint8* src_m420, int src_stride_m420, | 1161 int M420ToARGB(const uint8* src_m420, int src_stride_m420, |
| 1154 uint8* dst_argb, int dst_stride_argb, | 1162 uint8* dst_argb, int dst_stride_argb, |
| 1155 int width, int height) { | 1163 int width, int height) { |
| 1156 int y; | 1164 int y; |
| 1157 void (*NV12ToARGBRow)(const uint8* y_buf, | 1165 void (*NV12ToARGBRow)(const uint8* y_buf, |
| 1158 const uint8* uv_buf, | 1166 const uint8* uv_buf, |
| 1159 uint8* rgb_buf, | 1167 uint8* rgb_buf, |
| 1168 struct YuvConstants* yuvconstants, |
| 1160 int width) = NV12ToARGBRow_C; | 1169 int width) = NV12ToARGBRow_C; |
| 1161 if (!src_m420 || !dst_argb || | 1170 if (!src_m420 || !dst_argb || |
| 1162 width <= 0 || height == 0) { | 1171 width <= 0 || height == 0) { |
| 1163 return -1; | 1172 return -1; |
| 1164 } | 1173 } |
| 1165 // Negative height means invert the image. | 1174 // Negative height means invert the image. |
| 1166 if (height < 0) { | 1175 if (height < 0) { |
| 1167 height = -height; | 1176 height = -height; |
| 1168 dst_argb = dst_argb + (height - 1) * dst_stride_argb; | 1177 dst_argb = dst_argb + (height - 1) * dst_stride_argb; |
| 1169 dst_stride_argb = -dst_stride_argb; | 1178 dst_stride_argb = -dst_stride_argb; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1187 #if defined(HAS_NV12TOARGBROW_NEON) | 1196 #if defined(HAS_NV12TOARGBROW_NEON) |
| 1188 if (TestCpuFlag(kCpuHasNEON)) { | 1197 if (TestCpuFlag(kCpuHasNEON)) { |
| 1189 NV12ToARGBRow = NV12ToARGBRow_Any_NEON; | 1198 NV12ToARGBRow = NV12ToARGBRow_Any_NEON; |
| 1190 if (IS_ALIGNED(width, 8)) { | 1199 if (IS_ALIGNED(width, 8)) { |
| 1191 NV12ToARGBRow = NV12ToARGBRow_NEON; | 1200 NV12ToARGBRow = NV12ToARGBRow_NEON; |
| 1192 } | 1201 } |
| 1193 } | 1202 } |
| 1194 #endif | 1203 #endif |
| 1195 | 1204 |
| 1196 for (y = 0; y < height - 1; y += 2) { | 1205 for (y = 0; y < height - 1; y += 2) { |
| 1197 NV12ToARGBRow(src_m420, src_m420 + src_stride_m420 * 2, dst_argb, width); | 1206 NV12ToARGBRow(src_m420, src_m420 + src_stride_m420 * 2, dst_argb, |
| 1207 &kYuvConstants, width); |
| 1198 NV12ToARGBRow(src_m420 + src_stride_m420, src_m420 + src_stride_m420 * 2, | 1208 NV12ToARGBRow(src_m420 + src_stride_m420, src_m420 + src_stride_m420 * 2, |
| 1199 dst_argb + dst_stride_argb, width); | 1209 dst_argb + dst_stride_argb, &kYuvConstants, width); |
| 1200 dst_argb += dst_stride_argb * 2; | 1210 dst_argb += dst_stride_argb * 2; |
| 1201 src_m420 += src_stride_m420 * 3; | 1211 src_m420 += src_stride_m420 * 3; |
| 1202 } | 1212 } |
| 1203 if (height & 1) { | 1213 if (height & 1) { |
| 1204 NV12ToARGBRow(src_m420, src_m420 + src_stride_m420 * 2, dst_argb, width); | 1214 NV12ToARGBRow(src_m420, src_m420 + src_stride_m420 * 2, dst_argb, |
| 1215 &kYuvConstants, width); |
| 1205 } | 1216 } |
| 1206 return 0; | 1217 return 0; |
| 1207 } | 1218 } |
| 1208 | 1219 |
| 1209 // Convert YUY2 to ARGB. | 1220 // Convert YUY2 to ARGB. |
| 1210 LIBYUV_API | 1221 LIBYUV_API |
| 1211 int YUY2ToARGB(const uint8* src_yuy2, int src_stride_yuy2, | 1222 int YUY2ToARGB(const uint8* src_yuy2, int src_stride_yuy2, |
| 1212 uint8* dst_argb, int dst_stride_argb, | 1223 uint8* dst_argb, int dst_stride_argb, |
| 1213 int width, int height) { | 1224 int width, int height) { |
| 1214 int y; | 1225 int y; |
| 1215 void (*YUY2ToARGBRow)(const uint8* src_yuy2, uint8* dst_argb, int pix) = | 1226 void (*YUY2ToARGBRow)(const uint8* src_yuy2, |
| 1227 uint8* dst_argb, |
| 1228 struct YuvConstants* yuvconstants, |
| 1229 int width) = |
| 1216 YUY2ToARGBRow_C; | 1230 YUY2ToARGBRow_C; |
| 1217 if (!src_yuy2 || !dst_argb || | 1231 if (!src_yuy2 || !dst_argb || |
| 1218 width <= 0 || height == 0) { | 1232 width <= 0 || height == 0) { |
| 1219 return -1; | 1233 return -1; |
| 1220 } | 1234 } |
| 1221 // Negative height means invert the image. | 1235 // Negative height means invert the image. |
| 1222 if (height < 0) { | 1236 if (height < 0) { |
| 1223 height = -height; | 1237 height = -height; |
| 1224 src_yuy2 = src_yuy2 + (height - 1) * src_stride_yuy2; | 1238 src_yuy2 = src_yuy2 + (height - 1) * src_stride_yuy2; |
| 1225 src_stride_yuy2 = -src_stride_yuy2; | 1239 src_stride_yuy2 = -src_stride_yuy2; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1249 #endif | 1263 #endif |
| 1250 #if defined(HAS_YUY2TOARGBROW_NEON) | 1264 #if defined(HAS_YUY2TOARGBROW_NEON) |
| 1251 if (TestCpuFlag(kCpuHasNEON)) { | 1265 if (TestCpuFlag(kCpuHasNEON)) { |
| 1252 YUY2ToARGBRow = YUY2ToARGBRow_Any_NEON; | 1266 YUY2ToARGBRow = YUY2ToARGBRow_Any_NEON; |
| 1253 if (IS_ALIGNED(width, 8)) { | 1267 if (IS_ALIGNED(width, 8)) { |
| 1254 YUY2ToARGBRow = YUY2ToARGBRow_NEON; | 1268 YUY2ToARGBRow = YUY2ToARGBRow_NEON; |
| 1255 } | 1269 } |
| 1256 } | 1270 } |
| 1257 #endif | 1271 #endif |
| 1258 for (y = 0; y < height; ++y) { | 1272 for (y = 0; y < height; ++y) { |
| 1259 YUY2ToARGBRow(src_yuy2, dst_argb, width); | 1273 YUY2ToARGBRow(src_yuy2, dst_argb, &kYuvConstants, width); |
| 1260 src_yuy2 += src_stride_yuy2; | 1274 src_yuy2 += src_stride_yuy2; |
| 1261 dst_argb += dst_stride_argb; | 1275 dst_argb += dst_stride_argb; |
| 1262 } | 1276 } |
| 1263 return 0; | 1277 return 0; |
| 1264 } | 1278 } |
| 1265 | 1279 |
| 1266 // Convert UYVY to ARGB. | 1280 // Convert UYVY to ARGB. |
| 1267 LIBYUV_API | 1281 LIBYUV_API |
| 1268 int UYVYToARGB(const uint8* src_uyvy, int src_stride_uyvy, | 1282 int UYVYToARGB(const uint8* src_uyvy, int src_stride_uyvy, |
| 1269 uint8* dst_argb, int dst_stride_argb, | 1283 uint8* dst_argb, int dst_stride_argb, |
| 1270 int width, int height) { | 1284 int width, int height) { |
| 1271 int y; | 1285 int y; |
| 1272 void (*UYVYToARGBRow)(const uint8* src_uyvy, uint8* dst_argb, int pix) = | 1286 void (*UYVYToARGBRow)(const uint8* src_uyvy, |
| 1287 uint8* dst_argb, |
| 1288 struct YuvConstants* yuvconstants, |
| 1289 int width) = |
| 1273 UYVYToARGBRow_C; | 1290 UYVYToARGBRow_C; |
| 1274 if (!src_uyvy || !dst_argb || | 1291 if (!src_uyvy || !dst_argb || |
| 1275 width <= 0 || height == 0) { | 1292 width <= 0 || height == 0) { |
| 1276 return -1; | 1293 return -1; |
| 1277 } | 1294 } |
| 1278 // Negative height means invert the image. | 1295 // Negative height means invert the image. |
| 1279 if (height < 0) { | 1296 if (height < 0) { |
| 1280 height = -height; | 1297 height = -height; |
| 1281 src_uyvy = src_uyvy + (height - 1) * src_stride_uyvy; | 1298 src_uyvy = src_uyvy + (height - 1) * src_stride_uyvy; |
| 1282 src_stride_uyvy = -src_stride_uyvy; | 1299 src_stride_uyvy = -src_stride_uyvy; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1306 #endif | 1323 #endif |
| 1307 #if defined(HAS_UYVYTOARGBROW_NEON) | 1324 #if defined(HAS_UYVYTOARGBROW_NEON) |
| 1308 if (TestCpuFlag(kCpuHasNEON)) { | 1325 if (TestCpuFlag(kCpuHasNEON)) { |
| 1309 UYVYToARGBRow = UYVYToARGBRow_Any_NEON; | 1326 UYVYToARGBRow = UYVYToARGBRow_Any_NEON; |
| 1310 if (IS_ALIGNED(width, 8)) { | 1327 if (IS_ALIGNED(width, 8)) { |
| 1311 UYVYToARGBRow = UYVYToARGBRow_NEON; | 1328 UYVYToARGBRow = UYVYToARGBRow_NEON; |
| 1312 } | 1329 } |
| 1313 } | 1330 } |
| 1314 #endif | 1331 #endif |
| 1315 for (y = 0; y < height; ++y) { | 1332 for (y = 0; y < height; ++y) { |
| 1316 UYVYToARGBRow(src_uyvy, dst_argb, width); | 1333 UYVYToARGBRow(src_uyvy, dst_argb, &kYuvConstants, width); |
| 1317 src_uyvy += src_stride_uyvy; | 1334 src_uyvy += src_stride_uyvy; |
| 1318 dst_argb += dst_stride_argb; | 1335 dst_argb += dst_stride_argb; |
| 1319 } | 1336 } |
| 1320 return 0; | 1337 return 0; |
| 1321 } | 1338 } |
| 1322 | 1339 |
| 1323 // Convert J420 to ARGB. | 1340 // Convert J420 to ARGB. |
| 1324 LIBYUV_API | 1341 LIBYUV_API |
| 1325 int J420ToARGB(const uint8* src_y, int src_stride_y, | 1342 int J420ToARGB(const uint8* src_y, int src_stride_y, |
| 1326 const uint8* src_u, int src_stride_u, | 1343 const uint8* src_u, int src_stride_u, |
| 1327 const uint8* src_v, int src_stride_v, | 1344 const uint8* src_v, int src_stride_v, |
| 1328 uint8* dst_argb, int dst_stride_argb, | 1345 uint8* dst_argb, int dst_stride_argb, |
| 1329 int width, int height) { | 1346 int width, int height) { |
| 1330 int y; | 1347 int y; |
| 1331 void (*J422ToARGBRow)(const uint8* y_buf, | 1348 void (*I422ToARGBRow)(const uint8* y_buf, |
| 1332 const uint8* u_buf, | 1349 const uint8* u_buf, |
| 1333 const uint8* v_buf, | 1350 const uint8* v_buf, |
| 1334 uint8* rgb_buf, | 1351 uint8* rgb_buf, |
| 1335 int width) = J422ToARGBRow_C; | 1352 struct YuvConstants* yuvconstants, |
| 1353 int width) = I422ToARGBRow_C; |
| 1336 if (!src_y || !src_u || !src_v || !dst_argb || | 1354 if (!src_y || !src_u || !src_v || !dst_argb || |
| 1337 width <= 0 || height == 0) { | 1355 width <= 0 || height == 0) { |
| 1338 return -1; | 1356 return -1; |
| 1339 } | 1357 } |
| 1340 // Negative height means invert the image. | 1358 // Negative height means invert the image. |
| 1341 if (height < 0) { | 1359 if (height < 0) { |
| 1342 height = -height; | 1360 height = -height; |
| 1343 dst_argb = dst_argb + (height - 1) * dst_stride_argb; | 1361 dst_argb = dst_argb + (height - 1) * dst_stride_argb; |
| 1344 dst_stride_argb = -dst_stride_argb; | 1362 dst_stride_argb = -dst_stride_argb; |
| 1345 } | 1363 } |
| 1346 #if defined(HAS_J422TOARGBROW_SSSE3) | 1364 #if defined(HAS_I422TOARGBROW_SSSE3) |
| 1347 if (TestCpuFlag(kCpuHasSSSE3)) { | 1365 if (TestCpuFlag(kCpuHasSSSE3)) { |
| 1348 J422ToARGBRow = J422ToARGBRow_Any_SSSE3; | 1366 I422ToARGBRow = I422ToARGBRow_Any_SSSE3; |
| 1349 if (IS_ALIGNED(width, 8)) { | 1367 if (IS_ALIGNED(width, 8)) { |
| 1350 J422ToARGBRow = J422ToARGBRow_SSSE3; | 1368 I422ToARGBRow = I422ToARGBRow_SSSE3; |
| 1351 } | 1369 } |
| 1352 } | 1370 } |
| 1353 #endif | 1371 #endif |
| 1354 #if defined(HAS_J422TOARGBROW_AVX2) | 1372 #if defined(HAS_I422TOARGBROW_AVX2) |
| 1355 if (TestCpuFlag(kCpuHasAVX2)) { | 1373 if (TestCpuFlag(kCpuHasAVX2)) { |
| 1356 J422ToARGBRow = J422ToARGBRow_Any_AVX2; | 1374 I422ToARGBRow = I422ToARGBRow_Any_AVX2; |
| 1357 if (IS_ALIGNED(width, 16)) { | 1375 if (IS_ALIGNED(width, 16)) { |
| 1358 J422ToARGBRow = J422ToARGBRow_AVX2; | 1376 I422ToARGBRow = I422ToARGBRow_AVX2; |
| 1359 } | 1377 } |
| 1360 } | 1378 } |
| 1361 #endif | 1379 #endif |
| 1362 #if defined(HAS_J422TOARGBROW_NEON) | 1380 #if defined(HAS_I422TOARGBROW_NEON) |
| 1363 if (TestCpuFlag(kCpuHasNEON)) { | 1381 if (TestCpuFlag(kCpuHasNEON)) { |
| 1364 J422ToARGBRow = J422ToARGBRow_Any_NEON; | 1382 I422ToARGBRow = I422ToARGBRow_Any_NEON; |
| 1365 if (IS_ALIGNED(width, 8)) { | 1383 if (IS_ALIGNED(width, 8)) { |
| 1366 J422ToARGBRow = J422ToARGBRow_NEON; | 1384 I422ToARGBRow = I422ToARGBRow_NEON; |
| 1367 } | 1385 } |
| 1368 } | 1386 } |
| 1369 #endif | 1387 #endif |
| 1370 #if defined(HAS_J422TOARGBROW_MIPS_DSPR2) | 1388 #if defined(HAS_I422TOARGBROW_MIPS_DSPR2) |
| 1371 if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) && | 1389 if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) && |
| 1372 IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) && | 1390 IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) && |
| 1373 IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) && | 1391 IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) && |
| 1374 IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) && | 1392 IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) && |
| 1375 IS_ALIGNED(dst_argb, 4) && IS_ALIGNED(dst_stride_argb, 4)) { | 1393 IS_ALIGNED(dst_argb, 4) && IS_ALIGNED(dst_stride_argb, 4)) { |
| 1376 J422ToARGBRow = J422ToARGBRow_MIPS_DSPR2; | 1394 I422ToARGBRow = I422ToARGBRow_MIPS_DSPR2; |
| 1377 } | 1395 } |
| 1378 #endif | 1396 #endif |
| 1379 | 1397 |
| 1380 for (y = 0; y < height; ++y) { | 1398 for (y = 0; y < height; ++y) { |
| 1381 J422ToARGBRow(src_y, src_u, src_v, dst_argb, width); | 1399 I422ToARGBRow(src_y, src_u, src_v, dst_argb, &kYuvJConstants, width); |
| 1382 dst_argb += dst_stride_argb; | 1400 dst_argb += dst_stride_argb; |
| 1383 src_y += src_stride_y; | 1401 src_y += src_stride_y; |
| 1384 if (y & 1) { | 1402 if (y & 1) { |
| 1385 src_u += src_stride_u; | 1403 src_u += src_stride_u; |
| 1386 src_v += src_stride_v; | 1404 src_v += src_stride_v; |
| 1387 } | 1405 } |
| 1388 } | 1406 } |
| 1389 return 0; | 1407 return 0; |
| 1390 } | 1408 } |
| 1391 | 1409 |
| 1392 // Convert J422 to ARGB. | 1410 // Convert J422 to ARGB. |
| 1393 LIBYUV_API | 1411 LIBYUV_API |
| 1394 int J422ToARGB(const uint8* src_y, int src_stride_y, | 1412 int J422ToARGB(const uint8* src_y, int src_stride_y, |
| 1395 const uint8* src_u, int src_stride_u, | 1413 const uint8* src_u, int src_stride_u, |
| 1396 const uint8* src_v, int src_stride_v, | 1414 const uint8* src_v, int src_stride_v, |
| 1397 uint8* dst_argb, int dst_stride_argb, | 1415 uint8* dst_argb, int dst_stride_argb, |
| 1398 int width, int height) { | 1416 int width, int height) { |
| 1399 int y; | 1417 int y; |
| 1400 void (*J422ToARGBRow)(const uint8* y_buf, | 1418 void (*I422ToARGBRow)(const uint8* y_buf, |
| 1401 const uint8* u_buf, | 1419 const uint8* u_buf, |
| 1402 const uint8* v_buf, | 1420 const uint8* v_buf, |
| 1403 uint8* rgb_buf, | 1421 uint8* rgb_buf, |
| 1404 int width) = J422ToARGBRow_C; | 1422 struct YuvConstants* yuvconstants, |
| 1423 int width) = I422ToARGBRow_C; |
| 1405 if (!src_y || !src_u || !src_v || | 1424 if (!src_y || !src_u || !src_v || |
| 1406 !dst_argb || | 1425 !dst_argb || |
| 1407 width <= 0 || height == 0) { | 1426 width <= 0 || height == 0) { |
| 1408 return -1; | 1427 return -1; |
| 1409 } | 1428 } |
| 1410 // Negative height means invert the image. | 1429 // Negative height means invert the image. |
| 1411 if (height < 0) { | 1430 if (height < 0) { |
| 1412 height = -height; | 1431 height = -height; |
| 1413 dst_argb = dst_argb + (height - 1) * dst_stride_argb; | 1432 dst_argb = dst_argb + (height - 1) * dst_stride_argb; |
| 1414 dst_stride_argb = -dst_stride_argb; | 1433 dst_stride_argb = -dst_stride_argb; |
| 1415 } | 1434 } |
| 1416 // Coalesce rows. | 1435 // Coalesce rows. |
| 1417 if (src_stride_y == width && | 1436 if (src_stride_y == width && |
| 1418 src_stride_u * 2 == width && | 1437 src_stride_u * 2 == width && |
| 1419 src_stride_v * 2 == width && | 1438 src_stride_v * 2 == width && |
| 1420 dst_stride_argb == width * 4) { | 1439 dst_stride_argb == width * 4) { |
| 1421 width *= height; | 1440 width *= height; |
| 1422 height = 1; | 1441 height = 1; |
| 1423 src_stride_y = src_stride_u = src_stride_v = dst_stride_argb = 0; | 1442 src_stride_y = src_stride_u = src_stride_v = dst_stride_argb = 0; |
| 1424 } | 1443 } |
| 1425 #if defined(HAS_J422TOARGBROW_SSSE3) | 1444 #if defined(HAS_I422TOARGBROW_SSSE3) |
| 1426 if (TestCpuFlag(kCpuHasSSSE3)) { | 1445 if (TestCpuFlag(kCpuHasSSSE3)) { |
| 1427 J422ToARGBRow = J422ToARGBRow_Any_SSSE3; | 1446 I422ToARGBRow = I422ToARGBRow_Any_SSSE3; |
| 1428 if (IS_ALIGNED(width, 8)) { | 1447 if (IS_ALIGNED(width, 8)) { |
| 1429 J422ToARGBRow = J422ToARGBRow_SSSE3; | 1448 I422ToARGBRow = I422ToARGBRow_SSSE3; |
| 1430 } | 1449 } |
| 1431 } | 1450 } |
| 1432 #endif | 1451 #endif |
| 1433 #if defined(HAS_J422TOARGBROW_AVX2) | 1452 #if defined(HAS_I422TOARGBROW_AVX2) |
| 1434 if (TestCpuFlag(kCpuHasAVX2)) { | 1453 if (TestCpuFlag(kCpuHasAVX2)) { |
| 1435 J422ToARGBRow = J422ToARGBRow_Any_AVX2; | 1454 I422ToARGBRow = I422ToARGBRow_Any_AVX2; |
| 1436 if (IS_ALIGNED(width, 16)) { | 1455 if (IS_ALIGNED(width, 16)) { |
| 1437 J422ToARGBRow = J422ToARGBRow_AVX2; | 1456 I422ToARGBRow = I422ToARGBRow_AVX2; |
| 1438 } | 1457 } |
| 1439 } | 1458 } |
| 1440 #endif | 1459 #endif |
| 1441 #if defined(HAS_J422TOARGBROW_NEON) | 1460 #if defined(HAS_I422TOARGBROW_NEON) |
| 1442 if (TestCpuFlag(kCpuHasNEON)) { | 1461 if (TestCpuFlag(kCpuHasNEON)) { |
| 1443 J422ToARGBRow = J422ToARGBRow_Any_NEON; | 1462 I422ToARGBRow = I422ToARGBRow_Any_NEON; |
| 1444 if (IS_ALIGNED(width, 8)) { | 1463 if (IS_ALIGNED(width, 8)) { |
| 1445 J422ToARGBRow = J422ToARGBRow_NEON; | 1464 I422ToARGBRow = I422ToARGBRow_NEON; |
| 1446 } | 1465 } |
| 1447 } | 1466 } |
| 1448 #endif | 1467 #endif |
| 1449 #if defined(HAS_J422TOARGBROW_MIPS_DSPR2) | 1468 #if defined(HAS_I422TOARGBROW_MIPS_DSPR2) |
| 1450 if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) && | 1469 if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) && |
| 1451 IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) && | 1470 IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) && |
| 1452 IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) && | 1471 IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) && |
| 1453 IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) && | 1472 IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) && |
| 1454 IS_ALIGNED(dst_argb, 4) && IS_ALIGNED(dst_stride_argb, 4)) { | 1473 IS_ALIGNED(dst_argb, 4) && IS_ALIGNED(dst_stride_argb, 4)) { |
| 1455 J422ToARGBRow = J422ToARGBRow_MIPS_DSPR2; | 1474 I422ToARGBRow = I422ToARGBRow_MIPS_DSPR2; |
| 1456 } | 1475 } |
| 1457 #endif | 1476 #endif |
| 1458 | 1477 |
| 1459 for (y = 0; y < height; ++y) { | 1478 for (y = 0; y < height; ++y) { |
| 1460 J422ToARGBRow(src_y, src_u, src_v, dst_argb, width); | 1479 I422ToARGBRow(src_y, src_u, src_v, dst_argb, &kYuvJConstants, width); |
| 1461 dst_argb += dst_stride_argb; | 1480 dst_argb += dst_stride_argb; |
| 1462 src_y += src_stride_y; | 1481 src_y += src_stride_y; |
| 1463 src_u += src_stride_u; | 1482 src_u += src_stride_u; |
| 1464 src_v += src_stride_v; | 1483 src_v += src_stride_v; |
| 1465 } | 1484 } |
| 1466 return 0; | 1485 return 0; |
| 1467 } | 1486 } |
| 1468 | 1487 |
| 1469 // Convert J420 to ABGR. | 1488 // Convert J420 to ABGR. |
| 1470 LIBYUV_API | 1489 LIBYUV_API |
| 1471 int J420ToABGR(const uint8* src_y, int src_stride_y, | 1490 int J420ToABGR(const uint8* src_y, int src_stride_y, |
| 1472 const uint8* src_u, int src_stride_u, | 1491 const uint8* src_u, int src_stride_u, |
| 1473 const uint8* src_v, int src_stride_v, | 1492 const uint8* src_v, int src_stride_v, |
| 1474 uint8* dst_abgr, int dst_stride_abgr, | 1493 uint8* dst_abgr, int dst_stride_abgr, |
| 1475 int width, int height) { | 1494 int width, int height) { |
| 1476 int y; | 1495 int y; |
| 1477 void (*J422ToABGRRow)(const uint8* y_buf, | 1496 void (*I422ToABGRRow)(const uint8* y_buf, |
| 1478 const uint8* u_buf, | 1497 const uint8* u_buf, |
| 1479 const uint8* v_buf, | 1498 const uint8* v_buf, |
| 1480 uint8* rgb_buf, | 1499 uint8* rgb_buf, |
| 1481 int width) = J422ToABGRRow_C; | 1500 struct YuvConstants* yuvconstants, |
| 1501 int width) = I422ToABGRRow_C; |
| 1482 if (!src_y || !src_u || !src_v || !dst_abgr || | 1502 if (!src_y || !src_u || !src_v || !dst_abgr || |
| 1483 width <= 0 || height == 0) { | 1503 width <= 0 || height == 0) { |
| 1484 return -1; | 1504 return -1; |
| 1485 } | 1505 } |
| 1486 // Negative height means invert the image. | 1506 // Negative height means invert the image. |
| 1487 if (height < 0) { | 1507 if (height < 0) { |
| 1488 height = -height; | 1508 height = -height; |
| 1489 dst_abgr = dst_abgr + (height - 1) * dst_stride_abgr; | 1509 dst_abgr = dst_abgr + (height - 1) * dst_stride_abgr; |
| 1490 dst_stride_abgr = -dst_stride_abgr; | 1510 dst_stride_abgr = -dst_stride_abgr; |
| 1491 } | 1511 } |
| 1492 #if defined(HAS_J422TOABGRROW_SSSE3) | 1512 #if defined(HAS_I422TOABGRROW_SSSE3) |
| 1493 if (TestCpuFlag(kCpuHasSSSE3)) { | 1513 if (TestCpuFlag(kCpuHasSSSE3)) { |
| 1494 J422ToABGRRow = J422ToABGRRow_Any_SSSE3; | 1514 I422ToABGRRow = I422ToABGRRow_Any_SSSE3; |
| 1495 if (IS_ALIGNED(width, 8)) { | 1515 if (IS_ALIGNED(width, 8)) { |
| 1496 J422ToABGRRow = J422ToABGRRow_SSSE3; | 1516 I422ToABGRRow = I422ToABGRRow_SSSE3; |
| 1497 } | 1517 } |
| 1498 } | 1518 } |
| 1499 #endif | 1519 #endif |
| 1500 #if defined(HAS_J422TOABGRROW_AVX2) | 1520 #if defined(HAS_I422TOABGRROW_AVX2) |
| 1501 if (TestCpuFlag(kCpuHasAVX2)) { | 1521 if (TestCpuFlag(kCpuHasAVX2)) { |
| 1502 J422ToABGRRow = J422ToABGRRow_Any_AVX2; | 1522 I422ToABGRRow = I422ToABGRRow_Any_AVX2; |
| 1503 if (IS_ALIGNED(width, 16)) { | 1523 if (IS_ALIGNED(width, 16)) { |
| 1504 J422ToABGRRow = J422ToABGRRow_AVX2; | 1524 I422ToABGRRow = I422ToABGRRow_AVX2; |
| 1505 } | 1525 } |
| 1506 } | 1526 } |
| 1507 #endif | 1527 #endif |
| 1508 #if defined(HAS_J422TOABGRROW_NEON) | 1528 #if defined(HAS_I422TOABGRROW_NEON) |
| 1509 if (TestCpuFlag(kCpuHasNEON)) { | 1529 if (TestCpuFlag(kCpuHasNEON)) { |
| 1510 J422ToABGRRow = J422ToABGRRow_Any_NEON; | 1530 I422ToABGRRow = I422ToABGRRow_Any_NEON; |
| 1511 if (IS_ALIGNED(width, 8)) { | 1531 if (IS_ALIGNED(width, 8)) { |
| 1512 J422ToABGRRow = J422ToABGRRow_NEON; | 1532 I422ToABGRRow = I422ToABGRRow_NEON; |
| 1513 } | 1533 } |
| 1514 } | 1534 } |
| 1515 #endif | 1535 #endif |
| 1516 #if defined(HAS_J422TOABGRROW_MIPS_DSPR2) | 1536 #if defined(HAS_I422TOABGRROW_MIPS_DSPR2) |
| 1517 if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) && | 1537 if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) && |
| 1518 IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) && | 1538 IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) && |
| 1519 IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) && | 1539 IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) && |
| 1520 IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) && | 1540 IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) && |
| 1521 IS_ALIGNED(dst_abgr, 4) && IS_ALIGNED(dst_stride_abgr, 4)) { | 1541 IS_ALIGNED(dst_abgr, 4) && IS_ALIGNED(dst_stride_abgr, 4)) { |
| 1522 J422ToABGRRow = J422ToABGRRow_MIPS_DSPR2; | 1542 I422ToABGRRow = I422ToABGRRow_MIPS_DSPR2; |
| 1523 } | 1543 } |
| 1524 #endif | 1544 #endif |
| 1525 | 1545 |
| 1526 for (y = 0; y < height; ++y) { | 1546 for (y = 0; y < height; ++y) { |
| 1527 J422ToABGRRow(src_y, src_u, src_v, dst_abgr, width); | 1547 I422ToABGRRow(src_y, src_u, src_v, dst_abgr, &kYuvJConstants, width); |
| 1528 dst_abgr += dst_stride_abgr; | 1548 dst_abgr += dst_stride_abgr; |
| 1529 src_y += src_stride_y; | 1549 src_y += src_stride_y; |
| 1530 if (y & 1) { | 1550 if (y & 1) { |
| 1531 src_u += src_stride_u; | 1551 src_u += src_stride_u; |
| 1532 src_v += src_stride_v; | 1552 src_v += src_stride_v; |
| 1533 } | 1553 } |
| 1534 } | 1554 } |
| 1535 return 0; | 1555 return 0; |
| 1536 } | 1556 } |
| 1537 | 1557 |
| 1538 // Convert J422 to ABGR. | 1558 // Convert J422 to ABGR. |
| 1539 LIBYUV_API | 1559 LIBYUV_API |
| 1540 int J422ToABGR(const uint8* src_y, int src_stride_y, | 1560 int J422ToABGR(const uint8* src_y, int src_stride_y, |
| 1541 const uint8* src_u, int src_stride_u, | 1561 const uint8* src_u, int src_stride_u, |
| 1542 const uint8* src_v, int src_stride_v, | 1562 const uint8* src_v, int src_stride_v, |
| 1543 uint8* dst_abgr, int dst_stride_abgr, | 1563 uint8* dst_abgr, int dst_stride_abgr, |
| 1544 int width, int height) { | 1564 int width, int height) { |
| 1545 int y; | 1565 int y; |
| 1546 void (*J422ToABGRRow)(const uint8* y_buf, | 1566 void (*I422ToABGRRow)(const uint8* y_buf, |
| 1547 const uint8* u_buf, | 1567 const uint8* u_buf, |
| 1548 const uint8* v_buf, | 1568 const uint8* v_buf, |
| 1549 uint8* rgb_buf, | 1569 uint8* rgb_buf, |
| 1550 int width) = J422ToABGRRow_C; | 1570 struct YuvConstants* yuvconstants, |
| 1571 int width) = I422ToABGRRow_C; |
| 1551 if (!src_y || !src_u || !src_v || | 1572 if (!src_y || !src_u || !src_v || |
| 1552 !dst_abgr || | 1573 !dst_abgr || |
| 1553 width <= 0 || height == 0) { | 1574 width <= 0 || height == 0) { |
| 1554 return -1; | 1575 return -1; |
| 1555 } | 1576 } |
| 1556 // Negative height means invert the image. | 1577 // Negative height means invert the image. |
| 1557 if (height < 0) { | 1578 if (height < 0) { |
| 1558 height = -height; | 1579 height = -height; |
| 1559 dst_abgr = dst_abgr + (height - 1) * dst_stride_abgr; | 1580 dst_abgr = dst_abgr + (height - 1) * dst_stride_abgr; |
| 1560 dst_stride_abgr = -dst_stride_abgr; | 1581 dst_stride_abgr = -dst_stride_abgr; |
| 1561 } | 1582 } |
| 1562 // Coalesce rows. | 1583 // Coalesce rows. |
| 1563 if (src_stride_y == width && | 1584 if (src_stride_y == width && |
| 1564 src_stride_u * 2 == width && | 1585 src_stride_u * 2 == width && |
| 1565 src_stride_v * 2 == width && | 1586 src_stride_v * 2 == width && |
| 1566 dst_stride_abgr == width * 4) { | 1587 dst_stride_abgr == width * 4) { |
| 1567 width *= height; | 1588 width *= height; |
| 1568 height = 1; | 1589 height = 1; |
| 1569 src_stride_y = src_stride_u = src_stride_v = dst_stride_abgr = 0; | 1590 src_stride_y = src_stride_u = src_stride_v = dst_stride_abgr = 0; |
| 1570 } | 1591 } |
| 1571 #if defined(HAS_J422TOABGRROW_SSSE3) | 1592 #if defined(HAS_I422TOABGRROW_SSSE3) |
| 1572 if (TestCpuFlag(kCpuHasSSSE3)) { | 1593 if (TestCpuFlag(kCpuHasSSSE3)) { |
| 1573 J422ToABGRRow = J422ToABGRRow_Any_SSSE3; | 1594 I422ToABGRRow = I422ToABGRRow_Any_SSSE3; |
| 1574 if (IS_ALIGNED(width, 8)) { | 1595 if (IS_ALIGNED(width, 8)) { |
| 1575 J422ToABGRRow = J422ToABGRRow_SSSE3; | 1596 I422ToABGRRow = I422ToABGRRow_SSSE3; |
| 1576 } | 1597 } |
| 1577 } | 1598 } |
| 1578 #endif | 1599 #endif |
| 1579 #if defined(HAS_J422TOABGRROW_AVX2) | 1600 #if defined(HAS_I422TOABGRROW_AVX2) |
| 1580 if (TestCpuFlag(kCpuHasAVX2)) { | 1601 if (TestCpuFlag(kCpuHasAVX2)) { |
| 1581 J422ToABGRRow = J422ToABGRRow_Any_AVX2; | 1602 I422ToABGRRow = I422ToABGRRow_Any_AVX2; |
| 1582 if (IS_ALIGNED(width, 16)) { | 1603 if (IS_ALIGNED(width, 16)) { |
| 1583 J422ToABGRRow = J422ToABGRRow_AVX2; | 1604 I422ToABGRRow = I422ToABGRRow_AVX2; |
| 1584 } | 1605 } |
| 1585 } | 1606 } |
| 1586 #endif | 1607 #endif |
| 1587 #if defined(HAS_J422TOABGRROW_NEON) | 1608 #if defined(HAS_I422TOABGRROW_NEON) |
| 1588 if (TestCpuFlag(kCpuHasNEON)) { | 1609 if (TestCpuFlag(kCpuHasNEON)) { |
| 1589 J422ToABGRRow = J422ToABGRRow_Any_NEON; | 1610 I422ToABGRRow = I422ToABGRRow_Any_NEON; |
| 1590 if (IS_ALIGNED(width, 8)) { | 1611 if (IS_ALIGNED(width, 8)) { |
| 1591 J422ToABGRRow = J422ToABGRRow_NEON; | 1612 I422ToABGRRow = I422ToABGRRow_NEON; |
| 1592 } | 1613 } |
| 1593 } | 1614 } |
| 1594 #endif | 1615 #endif |
| 1595 #if defined(HAS_J422TOABGRROW_MIPS_DSPR2) | 1616 #if defined(HAS_I422TOABGRROW_MIPS_DSPR2) |
| 1596 if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) && | 1617 if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) && |
| 1597 IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) && | 1618 IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) && |
| 1598 IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) && | 1619 IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) && |
| 1599 IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) && | 1620 IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) && |
| 1600 IS_ALIGNED(dst_abgr, 4) && IS_ALIGNED(dst_stride_abgr, 4)) { | 1621 IS_ALIGNED(dst_abgr, 4) && IS_ALIGNED(dst_stride_abgr, 4)) { |
| 1601 J422ToABGRRow = J422ToABGRRow_MIPS_DSPR2; | 1622 I422ToABGRRow = I422ToABGRRow_MIPS_DSPR2; |
| 1602 } | 1623 } |
| 1603 #endif | 1624 #endif |
| 1604 | 1625 |
| 1605 for (y = 0; y < height; ++y) { | 1626 for (y = 0; y < height; ++y) { |
| 1606 J422ToABGRRow(src_y, src_u, src_v, dst_abgr, width); | 1627 I422ToABGRRow(src_y, src_u, src_v, dst_abgr, &kYuvJConstants, width); |
| 1607 dst_abgr += dst_stride_abgr; | 1628 dst_abgr += dst_stride_abgr; |
| 1608 src_y += src_stride_y; | 1629 src_y += src_stride_y; |
| 1609 src_u += src_stride_u; | 1630 src_u += src_stride_u; |
| 1610 src_v += src_stride_v; | 1631 src_v += src_stride_v; |
| 1611 } | 1632 } |
| 1612 return 0; | 1633 return 0; |
| 1613 } | 1634 } |
| 1614 | 1635 |
| 1615 // Convert H420 to ARGB. | 1636 // Convert H420 to ARGB. |
| 1616 LIBYUV_API | 1637 LIBYUV_API |
| 1617 int H420ToARGB(const uint8* src_y, int src_stride_y, | 1638 int H420ToARGB(const uint8* src_y, int src_stride_y, |
| 1618 const uint8* src_u, int src_stride_u, | 1639 const uint8* src_u, int src_stride_u, |
| 1619 const uint8* src_v, int src_stride_v, | 1640 const uint8* src_v, int src_stride_v, |
| 1620 uint8* dst_argb, int dst_stride_argb, | 1641 uint8* dst_argb, int dst_stride_argb, |
| 1621 int width, int height) { | 1642 int width, int height) { |
| 1622 int y; | 1643 int y; |
| 1623 void (*H422ToARGBRow)(const uint8* y_buf, | 1644 void (*I422ToARGBRow)(const uint8* y_buf, |
| 1624 const uint8* u_buf, | 1645 const uint8* u_buf, |
| 1625 const uint8* v_buf, | 1646 const uint8* v_buf, |
| 1626 uint8* rgb_buf, | 1647 uint8* rgb_buf, |
| 1627 int width) = H422ToARGBRow_C; | 1648 struct YuvConstants* yuvconstants, |
| 1649 int width) = I422ToARGBRow_C; |
| 1628 if (!src_y || !src_u || !src_v || !dst_argb || | 1650 if (!src_y || !src_u || !src_v || !dst_argb || |
| 1629 width <= 0 || height == 0) { | 1651 width <= 0 || height == 0) { |
| 1630 return -1; | 1652 return -1; |
| 1631 } | 1653 } |
| 1632 // Negative height means invert the image. | 1654 // Negative height means invert the image. |
| 1633 if (height < 0) { | 1655 if (height < 0) { |
| 1634 height = -height; | 1656 height = -height; |
| 1635 dst_argb = dst_argb + (height - 1) * dst_stride_argb; | 1657 dst_argb = dst_argb + (height - 1) * dst_stride_argb; |
| 1636 dst_stride_argb = -dst_stride_argb; | 1658 dst_stride_argb = -dst_stride_argb; |
| 1637 } | 1659 } |
| 1638 #if defined(HAS_H422TOARGBROW_SSSE3) | 1660 #if defined(HAS_I422TOARGBROW_SSSE3) |
| 1639 if (TestCpuFlag(kCpuHasSSSE3)) { | 1661 if (TestCpuFlag(kCpuHasSSSE3)) { |
| 1640 H422ToARGBRow = H422ToARGBRow_Any_SSSE3; | 1662 I422ToARGBRow = I422ToARGBRow_Any_SSSE3; |
| 1641 if (IS_ALIGNED(width, 8)) { | 1663 if (IS_ALIGNED(width, 8)) { |
| 1642 H422ToARGBRow = H422ToARGBRow_SSSE3; | 1664 I422ToARGBRow = I422ToARGBRow_SSSE3; |
| 1643 } | 1665 } |
| 1644 } | 1666 } |
| 1645 #endif | 1667 #endif |
| 1646 #if defined(HAS_H422TOARGBROW_AVX2) | 1668 #if defined(HAS_I422TOARGBROW_AVX2) |
| 1647 if (TestCpuFlag(kCpuHasAVX2)) { | 1669 if (TestCpuFlag(kCpuHasAVX2)) { |
| 1648 H422ToARGBRow = H422ToARGBRow_Any_AVX2; | 1670 I422ToARGBRow = I422ToARGBRow_Any_AVX2; |
| 1649 if (IS_ALIGNED(width, 16)) { | 1671 if (IS_ALIGNED(width, 16)) { |
| 1650 H422ToARGBRow = H422ToARGBRow_AVX2; | 1672 I422ToARGBRow = I422ToARGBRow_AVX2; |
| 1651 } | 1673 } |
| 1652 } | 1674 } |
| 1653 #endif | 1675 #endif |
| 1654 #if defined(HAS_H422TOARGBROW_NEON) | 1676 #if defined(HAS_I422TOARGBROW_NEON) |
| 1655 if (TestCpuFlag(kCpuHasNEON)) { | 1677 if (TestCpuFlag(kCpuHasNEON)) { |
| 1656 H422ToARGBRow = H422ToARGBRow_Any_NEON; | 1678 I422ToARGBRow = I422ToARGBRow_Any_NEON; |
| 1657 if (IS_ALIGNED(width, 8)) { | 1679 if (IS_ALIGNED(width, 8)) { |
| 1658 H422ToARGBRow = H422ToARGBRow_NEON; | 1680 I422ToARGBRow = I422ToARGBRow_NEON; |
| 1659 } | 1681 } |
| 1660 } | 1682 } |
| 1661 #endif | 1683 #endif |
| 1662 #if defined(HAS_H422TOARGBROW_MIPS_DSPR2) | 1684 #if defined(HAS_I422TOARGBROW_MIPS_DSPR2) |
| 1663 if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) && | 1685 if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) && |
| 1664 IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) && | 1686 IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) && |
| 1665 IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) && | 1687 IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) && |
| 1666 IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) && | 1688 IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) && |
| 1667 IS_ALIGNED(dst_argb, 4) && IS_ALIGNED(dst_stride_argb, 4)) { | 1689 IS_ALIGNED(dst_argb, 4) && IS_ALIGNED(dst_stride_argb, 4)) { |
| 1668 H422ToARGBRow = H422ToARGBRow_MIPS_DSPR2; | 1690 I422ToARGBRow = I422ToARGBRow_MIPS_DSPR2; |
| 1669 } | 1691 } |
| 1670 #endif | 1692 #endif |
| 1671 | 1693 |
| 1672 for (y = 0; y < height; ++y) { | 1694 for (y = 0; y < height; ++y) { |
| 1673 H422ToARGBRow(src_y, src_u, src_v, dst_argb, width); | 1695 I422ToARGBRow(src_y, src_u, src_v, dst_argb, &kYuvHConstants, width); |
| 1674 dst_argb += dst_stride_argb; | 1696 dst_argb += dst_stride_argb; |
| 1675 src_y += src_stride_y; | 1697 src_y += src_stride_y; |
| 1676 if (y & 1) { | 1698 if (y & 1) { |
| 1677 src_u += src_stride_u; | 1699 src_u += src_stride_u; |
| 1678 src_v += src_stride_v; | 1700 src_v += src_stride_v; |
| 1679 } | 1701 } |
| 1680 } | 1702 } |
| 1681 return 0; | 1703 return 0; |
| 1682 } | 1704 } |
| 1683 | 1705 |
| 1684 // Convert H422 to ARGB. | 1706 // Convert H422 to ARGB. |
| 1685 LIBYUV_API | 1707 LIBYUV_API |
| 1686 int H422ToARGB(const uint8* src_y, int src_stride_y, | 1708 int H422ToARGB(const uint8* src_y, int src_stride_y, |
| 1687 const uint8* src_u, int src_stride_u, | 1709 const uint8* src_u, int src_stride_u, |
| 1688 const uint8* src_v, int src_stride_v, | 1710 const uint8* src_v, int src_stride_v, |
| 1689 uint8* dst_argb, int dst_stride_argb, | 1711 uint8* dst_argb, int dst_stride_argb, |
| 1690 int width, int height) { | 1712 int width, int height) { |
| 1691 int y; | 1713 int y; |
| 1692 void (*H422ToARGBRow)(const uint8* y_buf, | 1714 void (*I422ToARGBRow)(const uint8* y_buf, |
| 1693 const uint8* u_buf, | 1715 const uint8* u_buf, |
| 1694 const uint8* v_buf, | 1716 const uint8* v_buf, |
| 1695 uint8* rgb_buf, | 1717 uint8* rgb_buf, |
| 1696 int width) = H422ToARGBRow_C; | 1718 struct YuvConstants* yuvconstants, |
| 1719 int width) = I422ToARGBRow_C; |
| 1697 if (!src_y || !src_u || !src_v || | 1720 if (!src_y || !src_u || !src_v || |
| 1698 !dst_argb || | 1721 !dst_argb || |
| 1699 width <= 0 || height == 0) { | 1722 width <= 0 || height == 0) { |
| 1700 return -1; | 1723 return -1; |
| 1701 } | 1724 } |
| 1702 // Negative height means invert the image. | 1725 // Negative height means invert the image. |
| 1703 if (height < 0) { | 1726 if (height < 0) { |
| 1704 height = -height; | 1727 height = -height; |
| 1705 dst_argb = dst_argb + (height - 1) * dst_stride_argb; | 1728 dst_argb = dst_argb + (height - 1) * dst_stride_argb; |
| 1706 dst_stride_argb = -dst_stride_argb; | 1729 dst_stride_argb = -dst_stride_argb; |
| 1707 } | 1730 } |
| 1708 // Coalesce rows. | 1731 // Coalesce rows. |
| 1709 if (src_stride_y == width && | 1732 if (src_stride_y == width && |
| 1710 src_stride_u * 2 == width && | 1733 src_stride_u * 2 == width && |
| 1711 src_stride_v * 2 == width && | 1734 src_stride_v * 2 == width && |
| 1712 dst_stride_argb == width * 4) { | 1735 dst_stride_argb == width * 4) { |
| 1713 width *= height; | 1736 width *= height; |
| 1714 height = 1; | 1737 height = 1; |
| 1715 src_stride_y = src_stride_u = src_stride_v = dst_stride_argb = 0; | 1738 src_stride_y = src_stride_u = src_stride_v = dst_stride_argb = 0; |
| 1716 } | 1739 } |
| 1717 #if defined(HAS_H422TOARGBROW_SSSE3) | 1740 #if defined(HAS_I422TOARGBROW_SSSE3) |
| 1718 if (TestCpuFlag(kCpuHasSSSE3)) { | 1741 if (TestCpuFlag(kCpuHasSSSE3)) { |
| 1719 H422ToARGBRow = H422ToARGBRow_Any_SSSE3; | 1742 I422ToARGBRow = I422ToARGBRow_Any_SSSE3; |
| 1720 if (IS_ALIGNED(width, 8)) { | 1743 if (IS_ALIGNED(width, 8)) { |
| 1721 H422ToARGBRow = H422ToARGBRow_SSSE3; | 1744 I422ToARGBRow = I422ToARGBRow_SSSE3; |
| 1722 } | 1745 } |
| 1723 } | 1746 } |
| 1724 #endif | 1747 #endif |
| 1725 #if defined(HAS_H422TOARGBROW_AVX2) | 1748 #if defined(HAS_I422TOARGBROW_AVX2) |
| 1726 if (TestCpuFlag(kCpuHasAVX2)) { | 1749 if (TestCpuFlag(kCpuHasAVX2)) { |
| 1727 H422ToARGBRow = H422ToARGBRow_Any_AVX2; | 1750 I422ToARGBRow = I422ToARGBRow_Any_AVX2; |
| 1728 if (IS_ALIGNED(width, 16)) { | 1751 if (IS_ALIGNED(width, 16)) { |
| 1729 H422ToARGBRow = H422ToARGBRow_AVX2; | 1752 I422ToARGBRow = I422ToARGBRow_AVX2; |
| 1730 } | 1753 } |
| 1731 } | 1754 } |
| 1732 #endif | 1755 #endif |
| 1733 #if defined(HAS_H422TOARGBROW_NEON) | 1756 #if defined(HAS_I422TOARGBROW_NEON) |
| 1734 if (TestCpuFlag(kCpuHasNEON)) { | 1757 if (TestCpuFlag(kCpuHasNEON)) { |
| 1735 H422ToARGBRow = H422ToARGBRow_Any_NEON; | 1758 I422ToARGBRow = I422ToARGBRow_Any_NEON; |
| 1736 if (IS_ALIGNED(width, 8)) { | 1759 if (IS_ALIGNED(width, 8)) { |
| 1737 H422ToARGBRow = H422ToARGBRow_NEON; | 1760 I422ToARGBRow = I422ToARGBRow_NEON; |
| 1738 } | 1761 } |
| 1739 } | 1762 } |
| 1740 #endif | 1763 #endif |
| 1741 #if defined(HAS_H422TOARGBROW_MIPS_DSPR2) | 1764 #if defined(HAS_I422TOARGBROW_MIPS_DSPR2) |
| 1742 if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) && | 1765 if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) && |
| 1743 IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) && | 1766 IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) && |
| 1744 IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) && | 1767 IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) && |
| 1745 IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) && | 1768 IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) && |
| 1746 IS_ALIGNED(dst_argb, 4) && IS_ALIGNED(dst_stride_argb, 4)) { | 1769 IS_ALIGNED(dst_argb, 4) && IS_ALIGNED(dst_stride_argb, 4)) { |
| 1747 H422ToARGBRow = H422ToARGBRow_MIPS_DSPR2; | 1770 I422ToARGBRow = I422ToARGBRow_MIPS_DSPR2; |
| 1748 } | 1771 } |
| 1749 #endif | 1772 #endif |
| 1750 | 1773 |
| 1751 for (y = 0; y < height; ++y) { | 1774 for (y = 0; y < height; ++y) { |
| 1752 H422ToARGBRow(src_y, src_u, src_v, dst_argb, width); | 1775 I422ToARGBRow(src_y, src_u, src_v, dst_argb, &kYuvHConstants, width); |
| 1753 dst_argb += dst_stride_argb; | 1776 dst_argb += dst_stride_argb; |
| 1754 src_y += src_stride_y; | 1777 src_y += src_stride_y; |
| 1755 src_u += src_stride_u; | 1778 src_u += src_stride_u; |
| 1756 src_v += src_stride_v; | 1779 src_v += src_stride_v; |
| 1757 } | 1780 } |
| 1758 return 0; | 1781 return 0; |
| 1759 } | 1782 } |
| 1760 | 1783 |
| 1761 // Convert H420 to ABGR. | 1784 // Convert H420 to ABGR. |
| 1762 LIBYUV_API | 1785 LIBYUV_API |
| 1763 int H420ToABGR(const uint8* src_y, int src_stride_y, | 1786 int H420ToABGR(const uint8* src_y, int src_stride_y, |
| 1764 const uint8* src_u, int src_stride_u, | 1787 const uint8* src_u, int src_stride_u, |
| 1765 const uint8* src_v, int src_stride_v, | 1788 const uint8* src_v, int src_stride_v, |
| 1766 uint8* dst_abgr, int dst_stride_abgr, | 1789 uint8* dst_abgr, int dst_stride_abgr, |
| 1767 int width, int height) { | 1790 int width, int height) { |
| 1768 int y; | 1791 int y; |
| 1769 void (*H422ToABGRRow)(const uint8* y_buf, | 1792 void (*I422ToABGRRow)(const uint8* y_buf, |
| 1770 const uint8* u_buf, | 1793 const uint8* u_buf, |
| 1771 const uint8* v_buf, | 1794 const uint8* v_buf, |
| 1772 uint8* rgb_buf, | 1795 uint8* rgb_buf, |
| 1773 int width) = H422ToABGRRow_C; | 1796 struct YuvConstants* yuvconstants, |
| 1797 int width) = I422ToABGRRow_C; |
| 1774 if (!src_y || !src_u || !src_v || !dst_abgr || | 1798 if (!src_y || !src_u || !src_v || !dst_abgr || |
| 1775 width <= 0 || height == 0) { | 1799 width <= 0 || height == 0) { |
| 1776 return -1; | 1800 return -1; |
| 1777 } | 1801 } |
| 1778 // Negative height means invert the image. | 1802 // Negative height means invert the image. |
| 1779 if (height < 0) { | 1803 if (height < 0) { |
| 1780 height = -height; | 1804 height = -height; |
| 1781 dst_abgr = dst_abgr + (height - 1) * dst_stride_abgr; | 1805 dst_abgr = dst_abgr + (height - 1) * dst_stride_abgr; |
| 1782 dst_stride_abgr = -dst_stride_abgr; | 1806 dst_stride_abgr = -dst_stride_abgr; |
| 1783 } | 1807 } |
| 1784 #if defined(HAS_H422TOABGRROW_SSSE3) | 1808 #if defined(HAS_I422TOABGRROW_SSSE3) |
| 1785 if (TestCpuFlag(kCpuHasSSSE3)) { | 1809 if (TestCpuFlag(kCpuHasSSSE3)) { |
| 1786 H422ToABGRRow = H422ToABGRRow_Any_SSSE3; | 1810 I422ToABGRRow = I422ToABGRRow_Any_SSSE3; |
| 1787 if (IS_ALIGNED(width, 8)) { | 1811 if (IS_ALIGNED(width, 8)) { |
| 1788 H422ToABGRRow = H422ToABGRRow_SSSE3; | 1812 I422ToABGRRow = I422ToABGRRow_SSSE3; |
| 1789 } | 1813 } |
| 1790 } | 1814 } |
| 1791 #endif | 1815 #endif |
| 1792 #if defined(HAS_H422TOABGRROW_AVX2) | 1816 #if defined(HAS_I422TOABGRROW_AVX2) |
| 1793 if (TestCpuFlag(kCpuHasAVX2)) { | 1817 if (TestCpuFlag(kCpuHasAVX2)) { |
| 1794 H422ToABGRRow = H422ToABGRRow_Any_AVX2; | 1818 I422ToABGRRow = I422ToABGRRow_Any_AVX2; |
| 1795 if (IS_ALIGNED(width, 16)) { | 1819 if (IS_ALIGNED(width, 16)) { |
| 1796 H422ToABGRRow = H422ToABGRRow_AVX2; | 1820 I422ToABGRRow = I422ToABGRRow_AVX2; |
| 1797 } | 1821 } |
| 1798 } | 1822 } |
| 1799 #endif | 1823 #endif |
| 1800 #if defined(HAS_H422TOABGRROW_NEON) | 1824 #if defined(HAS_I422TOABGRROW_NEON) |
| 1801 if (TestCpuFlag(kCpuHasNEON)) { | 1825 if (TestCpuFlag(kCpuHasNEON)) { |
| 1802 H422ToABGRRow = H422ToABGRRow_Any_NEON; | 1826 I422ToABGRRow = I422ToABGRRow_Any_NEON; |
| 1803 if (IS_ALIGNED(width, 8)) { | 1827 if (IS_ALIGNED(width, 8)) { |
| 1804 H422ToABGRRow = H422ToABGRRow_NEON; | 1828 I422ToABGRRow = I422ToABGRRow_NEON; |
| 1805 } | 1829 } |
| 1806 } | 1830 } |
| 1807 #endif | 1831 #endif |
| 1808 #if defined(HAS_H422TOABGRROW_MIPS_DSPR2) | 1832 #if defined(HAS_I422TOABGRROW_MIPS_DSPR2) |
| 1809 if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) && | 1833 if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) && |
| 1810 IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) && | 1834 IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) && |
| 1811 IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) && | 1835 IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) && |
| 1812 IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) && | 1836 IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) && |
| 1813 IS_ALIGNED(dst_abgr, 4) && IS_ALIGNED(dst_stride_abgr, 4)) { | 1837 IS_ALIGNED(dst_abgr, 4) && IS_ALIGNED(dst_stride_abgr, 4)) { |
| 1814 H422ToABGRRow = H422ToABGRRow_MIPS_DSPR2; | 1838 I422ToABGRRow = I422ToABGRRow_MIPS_DSPR2; |
| 1815 } | 1839 } |
| 1816 #endif | 1840 #endif |
| 1817 | 1841 |
| 1818 for (y = 0; y < height; ++y) { | 1842 for (y = 0; y < height; ++y) { |
| 1819 H422ToABGRRow(src_y, src_u, src_v, dst_abgr, width); | 1843 I422ToABGRRow(src_y, src_u, src_v, dst_abgr, &kYuvHConstants, width); |
| 1820 dst_abgr += dst_stride_abgr; | 1844 dst_abgr += dst_stride_abgr; |
| 1821 src_y += src_stride_y; | 1845 src_y += src_stride_y; |
| 1822 if (y & 1) { | 1846 if (y & 1) { |
| 1823 src_u += src_stride_u; | 1847 src_u += src_stride_u; |
| 1824 src_v += src_stride_v; | 1848 src_v += src_stride_v; |
| 1825 } | 1849 } |
| 1826 } | 1850 } |
| 1827 return 0; | 1851 return 0; |
| 1828 } | 1852 } |
| 1829 | 1853 |
| 1830 // Convert H422 to ABGR. | 1854 // Convert H422 to ABGR. |
| 1831 LIBYUV_API | 1855 LIBYUV_API |
| 1832 int H422ToABGR(const uint8* src_y, int src_stride_y, | 1856 int H422ToABGR(const uint8* src_y, int src_stride_y, |
| 1833 const uint8* src_u, int src_stride_u, | 1857 const uint8* src_u, int src_stride_u, |
| 1834 const uint8* src_v, int src_stride_v, | 1858 const uint8* src_v, int src_stride_v, |
| 1835 uint8* dst_abgr, int dst_stride_abgr, | 1859 uint8* dst_abgr, int dst_stride_abgr, |
| 1836 int width, int height) { | 1860 int width, int height) { |
| 1837 int y; | 1861 int y; |
| 1838 void (*H422ToABGRRow)(const uint8* y_buf, | 1862 void (*I422ToABGRRow)(const uint8* y_buf, |
| 1839 const uint8* u_buf, | 1863 const uint8* u_buf, |
| 1840 const uint8* v_buf, | 1864 const uint8* v_buf, |
| 1841 uint8* rgb_buf, | 1865 uint8* rgb_buf, |
| 1842 int width) = H422ToABGRRow_C; | 1866 struct YuvConstants* yuvconstants, |
| 1867 int width) = I422ToABGRRow_C; |
| 1843 if (!src_y || !src_u || !src_v || | 1868 if (!src_y || !src_u || !src_v || |
| 1844 !dst_abgr || | 1869 !dst_abgr || |
| 1845 width <= 0 || height == 0) { | 1870 width <= 0 || height == 0) { |
| 1846 return -1; | 1871 return -1; |
| 1847 } | 1872 } |
| 1848 // Negative height means invert the image. | 1873 // Negative height means invert the image. |
| 1849 if (height < 0) { | 1874 if (height < 0) { |
| 1850 height = -height; | 1875 height = -height; |
| 1851 dst_abgr = dst_abgr + (height - 1) * dst_stride_abgr; | 1876 dst_abgr = dst_abgr + (height - 1) * dst_stride_abgr; |
| 1852 dst_stride_abgr = -dst_stride_abgr; | 1877 dst_stride_abgr = -dst_stride_abgr; |
| 1853 } | 1878 } |
| 1854 // Coalesce rows. | 1879 // Coalesce rows. |
| 1855 if (src_stride_y == width && | 1880 if (src_stride_y == width && |
| 1856 src_stride_u * 2 == width && | 1881 src_stride_u * 2 == width && |
| 1857 src_stride_v * 2 == width && | 1882 src_stride_v * 2 == width && |
| 1858 dst_stride_abgr == width * 4) { | 1883 dst_stride_abgr == width * 4) { |
| 1859 width *= height; | 1884 width *= height; |
| 1860 height = 1; | 1885 height = 1; |
| 1861 src_stride_y = src_stride_u = src_stride_v = dst_stride_abgr = 0; | 1886 src_stride_y = src_stride_u = src_stride_v = dst_stride_abgr = 0; |
| 1862 } | 1887 } |
| 1863 #if defined(HAS_H422TOABGRROW_SSSE3) | 1888 #if defined(HAS_I422TOABGRROW_SSSE3) |
| 1864 if (TestCpuFlag(kCpuHasSSSE3)) { | 1889 if (TestCpuFlag(kCpuHasSSSE3)) { |
| 1865 H422ToABGRRow = H422ToABGRRow_Any_SSSE3; | 1890 I422ToABGRRow = I422ToABGRRow_Any_SSSE3; |
| 1866 if (IS_ALIGNED(width, 8)) { | 1891 if (IS_ALIGNED(width, 8)) { |
| 1867 H422ToABGRRow = H422ToABGRRow_SSSE3; | 1892 I422ToABGRRow = I422ToABGRRow_SSSE3; |
| 1868 } | 1893 } |
| 1869 } | 1894 } |
| 1870 #endif | 1895 #endif |
| 1871 #if defined(HAS_H422TOABGRROW_AVX2) | 1896 #if defined(HAS_I422TOABGRROW_AVX2) |
| 1872 if (TestCpuFlag(kCpuHasAVX2)) { | 1897 if (TestCpuFlag(kCpuHasAVX2)) { |
| 1873 H422ToABGRRow = H422ToABGRRow_Any_AVX2; | 1898 I422ToABGRRow = I422ToABGRRow_Any_AVX2; |
| 1874 if (IS_ALIGNED(width, 16)) { | 1899 if (IS_ALIGNED(width, 16)) { |
| 1875 H422ToABGRRow = H422ToABGRRow_AVX2; | 1900 I422ToABGRRow = I422ToABGRRow_AVX2; |
| 1876 } | 1901 } |
| 1877 } | 1902 } |
| 1878 #endif | 1903 #endif |
| 1879 #if defined(HAS_H422TOABGRROW_NEON) | 1904 #if defined(HAS_I422TOABGRROW_NEON) |
| 1880 if (TestCpuFlag(kCpuHasNEON)) { | 1905 if (TestCpuFlag(kCpuHasNEON)) { |
| 1881 H422ToABGRRow = H422ToABGRRow_Any_NEON; | 1906 I422ToABGRRow = I422ToABGRRow_Any_NEON; |
| 1882 if (IS_ALIGNED(width, 8)) { | 1907 if (IS_ALIGNED(width, 8)) { |
| 1883 H422ToABGRRow = H422ToABGRRow_NEON; | 1908 I422ToABGRRow = I422ToABGRRow_NEON; |
| 1884 } | 1909 } |
| 1885 } | 1910 } |
| 1886 #endif | 1911 #endif |
| 1887 #if defined(HAS_H422TOABGRROW_MIPS_DSPR2) | 1912 #if defined(HAS_I422TOABGRROW_MIPS_DSPR2) |
| 1888 if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) && | 1913 if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) && |
| 1889 IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) && | 1914 IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) && |
| 1890 IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) && | 1915 IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) && |
| 1891 IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) && | 1916 IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) && |
| 1892 IS_ALIGNED(dst_abgr, 4) && IS_ALIGNED(dst_stride_abgr, 4)) { | 1917 IS_ALIGNED(dst_abgr, 4) && IS_ALIGNED(dst_stride_abgr, 4)) { |
| 1893 H422ToABGRRow = H422ToABGRRow_MIPS_DSPR2; | 1918 I422ToABGRRow = I422ToABGRRow_MIPS_DSPR2; |
| 1894 } | 1919 } |
| 1895 #endif | 1920 #endif |
| 1896 | 1921 |
| 1897 for (y = 0; y < height; ++y) { | 1922 for (y = 0; y < height; ++y) { |
| 1898 H422ToABGRRow(src_y, src_u, src_v, dst_abgr, width); | 1923 I422ToABGRRow(src_y, src_u, src_v, dst_abgr, &kYuvHConstants, width); |
| 1899 dst_abgr += dst_stride_abgr; | 1924 dst_abgr += dst_stride_abgr; |
| 1900 src_y += src_stride_y; | 1925 src_y += src_stride_y; |
| 1901 src_u += src_stride_u; | 1926 src_u += src_stride_u; |
| 1902 src_v += src_stride_v; | 1927 src_v += src_stride_v; |
| 1903 } | 1928 } |
| 1904 return 0; | 1929 return 0; |
| 1905 } | 1930 } |
| 1906 | 1931 |
| 1907 #ifdef __cplusplus | 1932 #ifdef __cplusplus |
| 1908 } // extern "C" | 1933 } // extern "C" |
| 1909 } // namespace libyuv | 1934 } // namespace libyuv |
| 1910 #endif | 1935 #endif |
| OLD | NEW |