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

Side by Side Diff: source/planar_functions.cc

Issue 1593833002: Fix memory overwrite in YUY2ToNV12 odd wdiths (Closed) Base URL: https://chromium.googlesource.com/libyuv/libyuv@master
Patch Set: add note about odd width Created 4 years, 11 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 | « include/libyuv/version.h ('k') | unit_test/convert_test.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 2406 matching lines...) Expand 10 before | Expand all | Expand 10 after
2417 #endif 2417 #endif
2418 2418
2419 for (y = 0; y < height; ++y) { 2419 for (y = 0; y < height; ++y) {
2420 ARGBCopyYToAlphaRow(src_y, dst_argb, width); 2420 ARGBCopyYToAlphaRow(src_y, dst_argb, width);
2421 src_y += src_stride_y; 2421 src_y += src_stride_y;
2422 dst_argb += dst_stride_argb; 2422 dst_argb += dst_stride_argb;
2423 } 2423 }
2424 return 0; 2424 return 0;
2425 } 2425 }
2426 2426
2427 // TODO(fbarchard): Consider if width is even Y channel can be split
2428 // directly. A SplitUVRow_Odd function could copy the remaining chroma.
2429
2427 LIBYUV_API 2430 LIBYUV_API
2428 int YUY2ToNV12(const uint8* src_yuy2, int src_stride_yuy2, 2431 int YUY2ToNV12(const uint8* src_yuy2, int src_stride_yuy2,
2429 uint8* dst_y, int dst_stride_y, 2432 uint8* dst_y, int dst_stride_y,
2430 uint8* dst_uv, int dst_stride_uv, 2433 uint8* dst_uv, int dst_stride_uv,
2431 int width, int height) { 2434 int width, int height) {
2432 int y; 2435 int y;
2433 int halfwidth = (width + 1) >> 1; 2436 int halfwidth = (width + 1) >> 1;
2434 void (*SplitUVRow)(const uint8* src_uv, uint8* dst_u, uint8* dst_v, 2437 void (*SplitUVRow)(const uint8* src_uv, uint8* dst_u, uint8* dst_v,
2435 int width) = SplitUVRow_C; 2438 int width) = SplitUVRow_C;
2436 void (*InterpolateRow)(uint8* dst_ptr, const uint8* src_ptr, 2439 void (*InterpolateRow)(uint8* dst_ptr, const uint8* src_ptr,
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
2491 if (TestCpuFlag(kCpuHasNEON)) { 2494 if (TestCpuFlag(kCpuHasNEON)) {
2492 InterpolateRow = InterpolateRow_Any_NEON; 2495 InterpolateRow = InterpolateRow_Any_NEON;
2493 if (IS_ALIGNED(width, 16)) { 2496 if (IS_ALIGNED(width, 16)) {
2494 InterpolateRow = InterpolateRow_NEON; 2497 InterpolateRow = InterpolateRow_NEON;
2495 } 2498 }
2496 } 2499 }
2497 #endif 2500 #endif
2498 2501
2499 { 2502 {
2500 int awidth = halfwidth * 2; 2503 int awidth = halfwidth * 2;
2501 // 2 rows of uv 2504 // row of y and 2 rows of uv
2502 align_buffer_64(rows, awidth * 2); 2505 align_buffer_64(rows, awidth * 3);
2503 2506
2504 for (y = 0; y < height - 1; y += 2) { 2507 for (y = 0; y < height - 1; y += 2) {
2505 // Split Y from UV. 2508 // Split Y from UV.
2506 SplitUVRow(src_yuy2, dst_y, rows, awidth); 2509 SplitUVRow(src_yuy2, rows, rows + awidth, awidth);
2507 SplitUVRow(src_yuy2 + src_stride_yuy2, dst_y + dst_stride_y, 2510 memcpy(dst_y, rows, width);
2508 rows + awidth, awidth); 2511 SplitUVRow(src_yuy2 + src_stride_yuy2, rows, rows + awidth * 2, awidth);
2509 InterpolateRow(dst_uv, rows, awidth, awidth, 128); 2512 memcpy(dst_y + dst_stride_y, rows, width);
2513 InterpolateRow(dst_uv, rows + awidth, awidth, awidth, 128);
2510 src_yuy2 += src_stride_yuy2 * 2; 2514 src_yuy2 += src_stride_yuy2 * 2;
2511 dst_y += dst_stride_y * 2; 2515 dst_y += dst_stride_y * 2;
2512 dst_uv += dst_stride_uv; 2516 dst_uv += dst_stride_uv;
2513 } 2517 }
2514 if (height & 1) { 2518 if (height & 1) {
2515 // Split Y from UV. 2519 // Split Y from UV.
2516 SplitUVRow(src_yuy2, dst_y, dst_uv, awidth); 2520 SplitUVRow(src_yuy2, rows, dst_uv, awidth);
2521 memcpy(dst_y, rows, width);
2517 } 2522 }
2518 free_aligned_buffer_64(rows); 2523 free_aligned_buffer_64(rows);
2519 } 2524 }
2520 return 0; 2525 return 0;
2521 } 2526 }
2522 2527
2523 LIBYUV_API 2528 LIBYUV_API
2524 int UYVYToNV12(const uint8* src_uyvy, int src_stride_uyvy, 2529 int UYVYToNV12(const uint8* src_uyvy, int src_stride_uyvy,
2525 uint8* dst_y, int dst_stride_y, 2530 uint8* dst_y, int dst_stride_y,
2526 uint8* dst_uv, int dst_stride_uv, 2531 uint8* dst_uv, int dst_stride_uv,
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
2587 if (TestCpuFlag(kCpuHasNEON)) { 2592 if (TestCpuFlag(kCpuHasNEON)) {
2588 InterpolateRow = InterpolateRow_Any_NEON; 2593 InterpolateRow = InterpolateRow_Any_NEON;
2589 if (IS_ALIGNED(width, 16)) { 2594 if (IS_ALIGNED(width, 16)) {
2590 InterpolateRow = InterpolateRow_NEON; 2595 InterpolateRow = InterpolateRow_NEON;
2591 } 2596 }
2592 } 2597 }
2593 #endif 2598 #endif
2594 2599
2595 { 2600 {
2596 int awidth = halfwidth * 2; 2601 int awidth = halfwidth * 2;
2597 // 2 rows of uv 2602 // row of y and 2 rows of uv
2598 align_buffer_64(rows, awidth * 2); 2603 align_buffer_64(rows, awidth * 3);
2599 2604
2600 for (y = 0; y < height - 1; y += 2) { 2605 for (y = 0; y < height - 1; y += 2) {
2601 // Split Y from UV. 2606 // Split Y from UV.
2602 SplitUVRow(src_uyvy, rows, dst_y, awidth); 2607 SplitUVRow(src_uyvy, rows + awidth, rows, awidth);
2603 SplitUVRow(src_uyvy + src_stride_uyvy, rows + awidth, 2608 memcpy(dst_y, rows, width);
2604 dst_y + dst_stride_y, awidth); 2609 SplitUVRow(src_uyvy + src_stride_uyvy, rows + awidth * 2, rows, awidth);
2605 InterpolateRow(dst_uv, rows, awidth, awidth, 128); 2610 memcpy(dst_y + dst_stride_y, rows, width);
2611 InterpolateRow(dst_uv, rows + awidth, awidth, awidth, 128);
2606 src_uyvy += src_stride_uyvy * 2; 2612 src_uyvy += src_stride_uyvy * 2;
2607 dst_y += dst_stride_y * 2; 2613 dst_y += dst_stride_y * 2;
2608 dst_uv += dst_stride_uv; 2614 dst_uv += dst_stride_uv;
2609 } 2615 }
2610 if (height & 1) { 2616 if (height & 1) {
2611 // Split Y from UV. 2617 // Split Y from UV.
2612 SplitUVRow(src_uyvy, dst_uv, dst_y, awidth); 2618 SplitUVRow(src_uyvy, dst_uv, rows, awidth);
2619 memcpy(dst_y, rows, width);
2613 } 2620 }
2614 free_aligned_buffer_64(rows); 2621 free_aligned_buffer_64(rows);
2615 } 2622 }
2616 return 0; 2623 return 0;
2617 } 2624 }
2618 2625
2619 #ifdef __cplusplus 2626 #ifdef __cplusplus
2620 } // extern "C" 2627 } // extern "C"
2621 } // namespace libyuv 2628 } // namespace libyuv
2622 #endif 2629 #endif
OLDNEW
« no previous file with comments | « include/libyuv/version.h ('k') | unit_test/convert_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698