Commit 05f72b86 authored by Emmanuel Weber's avatar Emmanuel Weber Committed by Frank Barchard

add I444Scale and I444Rotate

Bug: b:132108021
Change-Id: Ife6abbd54c4620984e412c9244c6b65fe4c7946a
Reviewed-on: https://chromium-review.googlesource.com/c/libyuv/libyuv/+/1597418Reviewed-by: 's avatarFrank Barchard <fbarchard@chromium.org>
parent 413a8d80
...@@ -49,6 +49,24 @@ int I420Rotate(const uint8_t* src_y, ...@@ -49,6 +49,24 @@ int I420Rotate(const uint8_t* src_y,
int height, int height,
enum RotationMode mode); enum RotationMode mode);
// Rotate I444 frame.
LIBYUV_API
int I444Rotate(const uint8_t* src_y,
int src_stride_y,
const uint8_t* src_u,
int src_stride_u,
const uint8_t* src_v,
int src_stride_v,
uint8_t* dst_y,
int dst_stride_y,
uint8_t* dst_u,
int dst_stride_u,
uint8_t* dst_v,
int dst_stride_v,
int width,
int height,
enum RotationMode mode);
// Rotate NV12 input and store in I420. // Rotate NV12 input and store in I420.
LIBYUV_API LIBYUV_API
int NV12ToI420Rotate(const uint8_t* src_y, int NV12ToI420Rotate(const uint8_t* src_y,
......
...@@ -97,6 +97,35 @@ int I420Scale_16(const uint16_t* src_y, ...@@ -97,6 +97,35 @@ int I420Scale_16(const uint16_t* src_y,
int dst_height, int dst_height,
enum FilterMode filtering); enum FilterMode filtering);
// Scales a YUV 4:4:4 image from the src width and height to the
// dst width and height.
// If filtering is kFilterNone, a simple nearest-neighbor algorithm is
// used. This produces basic (blocky) quality at the fastest speed.
// If filtering is kFilterBilinear, interpolation is used to produce a better
// quality image, at the expense of speed.
// If filtering is kFilterBox, averaging is used to produce ever better
// quality image, at further expense of speed.
// Returns 0 if successful.
LIBYUV_API
int I444Scale(const uint8_t* src_y,
int src_stride_y,
const uint8_t* src_u,
int src_stride_u,
const uint8_t* src_v,
int src_stride_v,
int src_width,
int src_height,
uint8_t* dst_y,
int dst_stride_y,
uint8_t* dst_u,
int dst_stride_u,
uint8_t* dst_v,
int dst_stride_v,
int dst_width,
int dst_height,
enum FilterMode filtering);
#ifdef __cplusplus #ifdef __cplusplus
// Legacy API. Deprecated. // Legacy API. Deprecated.
LIBYUV_API LIBYUV_API
......
...@@ -481,6 +481,75 @@ int I420Rotate(const uint8_t* src_y, ...@@ -481,6 +481,75 @@ int I420Rotate(const uint8_t* src_y,
return -1; return -1;
} }
LIBYUV_API
int I444Rotate(const uint8_t* src_y,
int src_stride_y,
const uint8_t* src_u,
int src_stride_u,
const uint8_t* src_v,
int src_stride_v,
uint8_t* dst_y,
int dst_stride_y,
uint8_t* dst_u,
int dst_stride_u,
uint8_t* dst_v,
int dst_stride_v,
int width,
int height,
enum libyuv::RotationMode mode) {
if (!src_y || !src_u || !src_v || width <= 0 || height == 0 || !dst_y ||
!dst_u || !dst_v) {
return -1;
}
// Negative height means invert the image.
if (height < 0) {
height = -height;
src_y = src_y + (height - 1) * src_stride_y;
src_u = src_u + (height - 1) * src_stride_u;
src_v = src_v + (height - 1) * src_stride_v;
src_stride_y = -src_stride_y;
src_stride_u = -src_stride_u;
src_stride_v = -src_stride_v;
}
switch (mode) {
case libyuv::kRotate0:
// copy frame
CopyPlane(src_y, src_stride_y, dst_y, dst_stride_y, width, height);
CopyPlane(src_u, src_stride_u, dst_u, dst_stride_u, width, height);
CopyPlane(src_v, src_stride_v, dst_v, dst_stride_v, width, height);
return 0;
case libyuv::kRotate90:
RotatePlane90(src_y, src_stride_y, dst_y, dst_stride_y,
width, height);
RotatePlane90(src_u, src_stride_u, dst_u, dst_stride_u,
width, height);
RotatePlane90(src_v, src_stride_v, dst_v, dst_stride_v,
width, height);
return 0;
case libyuv::kRotate270:
RotatePlane270(src_y, src_stride_y, dst_y, dst_stride_y,
width, height);
RotatePlane270(src_u, src_stride_u, dst_u, dst_stride_u,
width, height);
RotatePlane270(src_v, src_stride_v, dst_v, dst_stride_v,
width, height);
return 0;
case libyuv::kRotate180:
RotatePlane180(src_y, src_stride_y, dst_y, dst_stride_y,
width, height);
RotatePlane180(src_u, src_stride_u, dst_u, dst_stride_u,
width, height);
RotatePlane180(src_v, src_stride_v, dst_v, dst_stride_v,
width, height);
return 0;
default:
break;
}
return -1;
}
LIBYUV_API LIBYUV_API
int NV12ToI420Rotate(const uint8_t* src_y, int NV12ToI420Rotate(const uint8_t* src_y,
int src_stride_y, int src_stride_y,
......
...@@ -1788,6 +1788,42 @@ int I420Scale_16(const uint16_t* src_y, ...@@ -1788,6 +1788,42 @@ int I420Scale_16(const uint16_t* src_y,
return 0; return 0;
} }
// Scale an I444 image.
// This function in turn calls a scaling function for each plane.
LIBYUV_API
int I444Scale(const uint8_t* src_y,
int src_stride_y,
const uint8_t* src_u,
int src_stride_u,
const uint8_t* src_v,
int src_stride_v,
int src_width,
int src_height,
uint8_t* dst_y,
int dst_stride_y,
uint8_t* dst_u,
int dst_stride_u,
uint8_t* dst_v,
int dst_stride_v,
int dst_width,
int dst_height,
enum FilterMode filtering) {
if (!src_y || !src_u || !src_v || src_width == 0 || src_height == 0 ||
src_width > 32768 || src_height > 32768 || !dst_y || !dst_u || !dst_v ||
dst_width <= 0 || dst_height <= 0) {
return -1;
}
ScalePlane(src_y, src_stride_y, src_width, src_height, dst_y, dst_stride_y,
dst_width, dst_height, filtering);
ScalePlane(src_u, src_stride_u, src_width, src_height, dst_u, dst_stride_u,
dst_width, dst_height, filtering);
ScalePlane(src_v, src_stride_v, src_width, src_height, dst_v, dst_stride_v,
dst_width, dst_height, filtering);
return 0;
}
// Deprecated api // Deprecated api
LIBYUV_API LIBYUV_API
int Scale(const uint8_t* src_y, int Scale(const uint8_t* src_y,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment