mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2025-12-06 16:56:55 +08:00
I422ToRGBA, I422ToBGRA and I422ToABGR.
BUG=73 TEST=I422ToRGBA_OptVsC Review URL: https://webrtc-codereview.appspot.com/819008 git-svn-id: http://libyuv.googlecode.com/svn/trunk@372 16f28f9a-4ce2-e073-06de-1de4eb20be90
This commit is contained in:
parent
dddf94c343
commit
cad0ad303c
@ -1,6 +1,6 @@
|
|||||||
Name: libyuv
|
Name: libyuv
|
||||||
URL: http://code.google.com/p/libyuv/
|
URL: http://code.google.com/p/libyuv/
|
||||||
Version: 371
|
Version: 372
|
||||||
License: BSD
|
License: BSD
|
||||||
License File: LICENSE
|
License File: LICENSE
|
||||||
|
|
||||||
|
|||||||
@ -110,6 +110,28 @@ int ARGBToI422(const uint8* src_frame, int src_stride_frame,
|
|||||||
uint8* dst_v, int dst_stride_v,
|
uint8* dst_v, int dst_stride_v,
|
||||||
int width, int height);
|
int width, int height);
|
||||||
|
|
||||||
|
// I422ToARGB is in convert_argb.h
|
||||||
|
// Convert I422 to BGRA.
|
||||||
|
int I422ToBGRA(const uint8* src_y, int src_stride_y,
|
||||||
|
const uint8* src_u, int src_stride_u,
|
||||||
|
const uint8* src_v, int src_stride_v,
|
||||||
|
uint8* dst_bgra, int dst_stride_bgra,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
// Convert I422 to ABGR.
|
||||||
|
int I422ToABGR(const uint8* src_y, int src_stride_y,
|
||||||
|
const uint8* src_u, int src_stride_u,
|
||||||
|
const uint8* src_v, int src_stride_v,
|
||||||
|
uint8* dst_abgr, int dst_stride_abgr,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
// Convert I422 to RGBA.
|
||||||
|
int I422ToRGBA(const uint8* src_y, int src_stride_y,
|
||||||
|
const uint8* src_u, int src_stride_u,
|
||||||
|
const uint8* src_v, int src_stride_v,
|
||||||
|
uint8* dst_rgba, int dst_stride_rgba,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
// Draw a rectangle into I420.
|
// Draw a rectangle into I420.
|
||||||
int I420Rect(uint8* dst_y, int dst_stride_y,
|
int I420Rect(uint8* dst_y, int dst_stride_y,
|
||||||
uint8* dst_u, int dst_stride_u,
|
uint8* dst_u, int dst_stride_u,
|
||||||
|
|||||||
@ -11,6 +11,6 @@
|
|||||||
#ifndef INCLUDE_LIBYUV_VERSION_H_ // NOLINT
|
#ifndef INCLUDE_LIBYUV_VERSION_H_ // NOLINT
|
||||||
#define INCLUDE_LIBYUV_VERSION_H_
|
#define INCLUDE_LIBYUV_VERSION_H_
|
||||||
|
|
||||||
#define LIBYUV_VERSION 371
|
#define LIBYUV_VERSION 372
|
||||||
|
|
||||||
#endif // INCLUDE_LIBYUV_VERSION_H_ NOLINT
|
#endif // INCLUDE_LIBYUV_VERSION_H_ NOLINT
|
||||||
|
|||||||
@ -296,6 +296,159 @@ int ARGBToI422(const uint8* src_argb, int src_stride_argb,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Convert I422 to BGRA.
|
||||||
|
int I422ToBGRA(const uint8* src_y, int src_stride_y,
|
||||||
|
const uint8* src_u, int src_stride_u,
|
||||||
|
const uint8* src_v, int src_stride_v,
|
||||||
|
uint8* dst_bgra, int dst_stride_bgra,
|
||||||
|
int width, int height) {
|
||||||
|
if (!src_y || !src_u || !src_v ||
|
||||||
|
!dst_bgra ||
|
||||||
|
width <= 0 || height == 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
// Negative height means invert the image.
|
||||||
|
if (height < 0) {
|
||||||
|
height = -height;
|
||||||
|
dst_bgra = dst_bgra + (height - 1) * dst_stride_bgra;
|
||||||
|
dst_stride_bgra = -dst_stride_bgra;
|
||||||
|
}
|
||||||
|
void (*I422ToBGRARow)(const uint8* y_buf,
|
||||||
|
const uint8* u_buf,
|
||||||
|
const uint8* v_buf,
|
||||||
|
uint8* rgb_buf,
|
||||||
|
int width) = I422ToBGRARow_C;
|
||||||
|
#if defined(HAS_I422TOBGRAROW_NEON)
|
||||||
|
if (TestCpuFlag(kCpuHasNEON)) {
|
||||||
|
I422ToBGRARow = I422ToBGRARow_Any_NEON;
|
||||||
|
if (IS_ALIGNED(width, 16)) {
|
||||||
|
I422ToBGRARow = I422ToBGRARow_NEON;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#elif defined(HAS_I422TOBGRAROW_SSSE3)
|
||||||
|
if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
|
||||||
|
I422ToBGRARow = I422ToBGRARow_Any_SSSE3;
|
||||||
|
if (IS_ALIGNED(width, 8)) {
|
||||||
|
I422ToBGRARow = I422ToBGRARow_Unaligned_SSSE3;
|
||||||
|
if (IS_ALIGNED(dst_bgra, 16) && IS_ALIGNED(dst_stride_bgra, 16)) {
|
||||||
|
I422ToBGRARow = I422ToBGRARow_SSSE3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (int y = 0; y < height; ++y) {
|
||||||
|
I422ToBGRARow(src_y, src_u, src_v, dst_bgra, width);
|
||||||
|
dst_bgra += dst_stride_bgra;
|
||||||
|
src_y += src_stride_y;
|
||||||
|
src_u += src_stride_u;
|
||||||
|
src_v += src_stride_v;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert I422 to ABGR.
|
||||||
|
int I422ToABGR(const uint8* src_y, int src_stride_y,
|
||||||
|
const uint8* src_u, int src_stride_u,
|
||||||
|
const uint8* src_v, int src_stride_v,
|
||||||
|
uint8* dst_abgr, int dst_stride_abgr,
|
||||||
|
int width, int height) {
|
||||||
|
if (!src_y || !src_u || !src_v ||
|
||||||
|
!dst_abgr ||
|
||||||
|
width <= 0 || height == 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
// Negative height means invert the image.
|
||||||
|
if (height < 0) {
|
||||||
|
height = -height;
|
||||||
|
dst_abgr = dst_abgr + (height - 1) * dst_stride_abgr;
|
||||||
|
dst_stride_abgr = -dst_stride_abgr;
|
||||||
|
}
|
||||||
|
void (*I422ToABGRRow)(const uint8* y_buf,
|
||||||
|
const uint8* u_buf,
|
||||||
|
const uint8* v_buf,
|
||||||
|
uint8* rgb_buf,
|
||||||
|
int width) = I422ToABGRRow_C;
|
||||||
|
#if defined(HAS_I422TOABGRROW_NEON)
|
||||||
|
if (TestCpuFlag(kCpuHasNEON)) {
|
||||||
|
I422ToABGRRow = I422ToABGRRow_Any_NEON;
|
||||||
|
if (IS_ALIGNED(width, 16)) {
|
||||||
|
I422ToABGRRow = I422ToABGRRow_NEON;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#elif defined(HAS_I422TOABGRROW_SSSE3)
|
||||||
|
if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
|
||||||
|
I422ToABGRRow = I422ToABGRRow_Any_SSSE3;
|
||||||
|
if (IS_ALIGNED(width, 8)) {
|
||||||
|
I422ToABGRRow = I422ToABGRRow_Unaligned_SSSE3;
|
||||||
|
if (IS_ALIGNED(dst_abgr, 16) && IS_ALIGNED(dst_stride_abgr, 16)) {
|
||||||
|
I422ToABGRRow = I422ToABGRRow_SSSE3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (int y = 0; y < height; ++y) {
|
||||||
|
I422ToABGRRow(src_y, src_u, src_v, dst_abgr, width);
|
||||||
|
dst_abgr += dst_stride_abgr;
|
||||||
|
src_y += src_stride_y;
|
||||||
|
src_u += src_stride_u;
|
||||||
|
src_v += src_stride_v;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert I422 to RGBA.
|
||||||
|
int I422ToRGBA(const uint8* src_y, int src_stride_y,
|
||||||
|
const uint8* src_u, int src_stride_u,
|
||||||
|
const uint8* src_v, int src_stride_v,
|
||||||
|
uint8* dst_rgba, int dst_stride_rgba,
|
||||||
|
int width, int height) {
|
||||||
|
if (!src_y || !src_u || !src_v ||
|
||||||
|
!dst_rgba ||
|
||||||
|
width <= 0 || height == 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
// Negative height means invert the image.
|
||||||
|
if (height < 0) {
|
||||||
|
height = -height;
|
||||||
|
dst_rgba = dst_rgba + (height - 1) * dst_stride_rgba;
|
||||||
|
dst_stride_rgba = -dst_stride_rgba;
|
||||||
|
}
|
||||||
|
void (*I422ToRGBARow)(const uint8* y_buf,
|
||||||
|
const uint8* u_buf,
|
||||||
|
const uint8* v_buf,
|
||||||
|
uint8* rgb_buf,
|
||||||
|
int width) = I422ToRGBARow_C;
|
||||||
|
#if defined(HAS_I422TORGBAROW_NEON)
|
||||||
|
if (TestCpuFlag(kCpuHasNEON)) {
|
||||||
|
I422ToRGBARow = I422ToRGBARow_Any_NEON;
|
||||||
|
if (IS_ALIGNED(width, 16)) {
|
||||||
|
I422ToRGBARow = I422ToRGBARow_NEON;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#elif defined(HAS_I422TORGBAROW_SSSE3)
|
||||||
|
if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
|
||||||
|
I422ToRGBARow = I422ToRGBARow_Any_SSSE3;
|
||||||
|
if (IS_ALIGNED(width, 8)) {
|
||||||
|
I422ToRGBARow = I422ToRGBARow_Unaligned_SSSE3;
|
||||||
|
if (IS_ALIGNED(dst_rgba, 16) && IS_ALIGNED(dst_stride_rgba, 16)) {
|
||||||
|
I422ToRGBARow = I422ToRGBARow_SSSE3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (int y = 0; y < height; ++y) {
|
||||||
|
I422ToRGBARow(src_y, src_u, src_v, dst_rgba, width);
|
||||||
|
dst_rgba += dst_stride_rgba;
|
||||||
|
src_y += src_stride_y;
|
||||||
|
src_u += src_stride_u;
|
||||||
|
src_v += src_stride_v;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Convert ARGB to RGBA.
|
// Convert ARGB to RGBA.
|
||||||
int ARGBToRGBA(const uint8* src_argb, int src_stride_argb,
|
int ARGBToRGBA(const uint8* src_argb, int src_stride_argb,
|
||||||
uint8* dst_rgba, int dst_stride_rgba,
|
uint8* dst_rgba, int dst_stride_rgba,
|
||||||
|
|||||||
@ -92,8 +92,11 @@ TESTPLANARTOB(I420, 2, 2, RGB24, 3)
|
|||||||
TESTPLANARTOB(I420, 2, 2, RGB565, 2)
|
TESTPLANARTOB(I420, 2, 2, RGB565, 2)
|
||||||
TESTPLANARTOB(I420, 2, 2, ARGB1555, 2)
|
TESTPLANARTOB(I420, 2, 2, ARGB1555, 2)
|
||||||
TESTPLANARTOB(I420, 2, 2, ARGB4444, 2)
|
TESTPLANARTOB(I420, 2, 2, ARGB4444, 2)
|
||||||
TESTPLANARTOB(I411, 4, 1, ARGB, 4)
|
|
||||||
TESTPLANARTOB(I422, 2, 1, ARGB, 4)
|
TESTPLANARTOB(I422, 2, 1, ARGB, 4)
|
||||||
|
TESTPLANARTOB(I422, 2, 1, BGRA, 4)
|
||||||
|
TESTPLANARTOB(I422, 2, 1, ABGR, 4)
|
||||||
|
TESTPLANARTOB(I422, 2, 1, RGBA, 4)
|
||||||
|
TESTPLANARTOB(I411, 4, 1, ARGB, 4)
|
||||||
TESTPLANARTOB(I444, 1, 1, ARGB, 4)
|
TESTPLANARTOB(I444, 1, 1, ARGB, 4)
|
||||||
TESTPLANARTOB(I420, 2, 2, YUY2, 2)
|
TESTPLANARTOB(I420, 2, 2, YUY2, 2)
|
||||||
TESTPLANARTOB(I420, 2, 2, UYVY, 2)
|
TESTPLANARTOB(I420, 2, 2, UYVY, 2)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user