diff options
author | Yuan Tong <tongyuan200097@gmail.com> | 2021-02-25 15:21:28 +0800 |
---|---|---|
committer | Frank Barchard <fbarchard@chromium.org> | 2021-02-25 23:16:54 +0000 |
commit | a8c181050c202854ae32433164e6bd5d1e7c4368 (patch) | |
tree | c300dbf9bfa59d0dc2772c311b0dfd154e08d54a /source/row_common.cc | |
parent | 08815a29766a78398a8e2b9ed095280e9d0a73c2 (diff) | |
download | libyuv-a8c181050c202854ae32433164e6bd5d1e7c4368.tar.gz |
Add 10/12 bit YUV To YUV functions
The following functions (and their 12 bit variant) are added:
planar, 10->10:
I410ToI010, I210ToI010
planar, 10->8:
I410ToI444, I210ToI422
planar<->biplanar, 10->10:
I010ToP010, I210ToP210, I410ToP410
P010ToI010, P210ToI210, P410ToI410
R=fbarchard@chromium.org
Change-Id: I9aa2bafa0d6a6e1e38ce4e20cbb437e10f9b0158
Bug: libyuv:834, libyuv:873
Reviewed-on: https://chromium-review.googlesource.com/c/libyuv/libyuv/+/2709822
Reviewed-by: Frank Barchard <fbarchard@chromium.org>
Reviewed-by: richard winterton <rrwinterton@gmail.com>
Diffstat (limited to 'source/row_common.cc')
-rw-r--r-- | source/row_common.cc | 46 |
1 files changed, 31 insertions, 15 deletions
diff --git a/source/row_common.cc b/source/row_common.cc index eb889c83..a941c3f5 100644 --- a/source/row_common.cc +++ b/source/row_common.cc @@ -2521,27 +2521,33 @@ void MergeXRGBRow_C(const uint8_t* src_r, } } -// Use scale to convert lsb formats to msb, depending how many bits there are: -// 128 = 9 bits -// 64 = 10 bits -// 16 = 12 bits -// 1 = 16 bits +// Convert lsb formats to msb, depending on sample depth. void MergeUVRow_16_C(const uint16_t* src_u, const uint16_t* src_v, uint16_t* dst_uv, - int scale, + int depth, int width) { + int shift = 16 - depth; int x; - for (x = 0; x < width - 1; x += 2) { - dst_uv[0] = src_u[x] * scale; - dst_uv[1] = src_v[x] * scale; - dst_uv[2] = src_u[x + 1] * scale; - dst_uv[3] = src_v[x + 1] * scale; - dst_uv += 4; + for (x = 0; x < width; ++x) { + dst_uv[0] = src_u[x] << shift; + dst_uv[1] = src_v[x] << shift; + dst_uv += 2; } - if (width & 1) { - dst_uv[0] = src_u[width - 1] * scale; - dst_uv[1] = src_v[width - 1] * scale; +} + +// Convert msb formats to lsb, depending on sample depth. +void SplitUVRow_16_C(const uint16_t* src_uv, + uint16_t* dst_u, + uint16_t* dst_v, + int depth, + int width) { + int shift = 16 - depth; + int x; + for (x = 0; x < width; ++x) { + dst_u[x] = src_uv[0] >> shift; + dst_v[x] = src_uv[1] >> shift; + src_uv += 2; } } @@ -2555,6 +2561,16 @@ void MultiplyRow_16_C(const uint16_t* src_y, } } +void DivideRow_16_C(const uint16_t* src_y, + uint16_t* dst_y, + int scale, + int width) { + int x; + for (x = 0; x < width; ++x) { + dst_y[x] = (src_y[x] * scale) >> 16; + } +} + // Use scale to convert lsb formats to msb, depending how many bits there are: // 32768 = 9 bits // 16384 = 10 bits |