Commit 8ae294e4 authored by fbarchard@google.com's avatar fbarchard@google.com

handle last 1 or 2 rows of 3/4 and 3/8 scalers with careful vertical filtering

BUG=none
TEST=none
Review URL: https://webrtc-codereview.appspot.com/380004

git-svn-id: http://libyuv.googlecode.com/svn/trunk@165 16f28f9a-4ce2-e073-06de-1de4eb20be90
parent 57261c19
Name: libyuv Name: libyuv
URL: http://code.google.com/p/libyuv/ URL: http://code.google.com/p/libyuv/
Version: 164 Version: 165
License: BSD License: BSD
License File: LICENSE License File: LICENSE
......
...@@ -16,7 +16,7 @@ namespace libyuv { ...@@ -16,7 +16,7 @@ namespace libyuv {
extern "C" { extern "C" {
#endif #endif
#define LIBYUV_VERSION 164 #define LIBYUV_VERSION 165
#ifdef __cplusplus #ifdef __cplusplus
} // extern "C" } // extern "C"
......
...@@ -2972,7 +2972,7 @@ static void ScaleRowDown38_C(const uint8* src_ptr, int, ...@@ -2972,7 +2972,7 @@ static void ScaleRowDown38_C(const uint8* src_ptr, int,
static void ScaleRowDown38_3_Int_C(const uint8* src_ptr, int src_stride, static void ScaleRowDown38_3_Int_C(const uint8* src_ptr, int src_stride,
uint8* dst_ptr, int dst_width) { uint8* dst_ptr, int dst_width) {
assert((dst_width % 3 == 0) && (dst_width > 0)); assert((dst_width % 3 == 0) && (dst_width > 0));
for (int i = 0; i < dst_width; i+=3) { for (int i = 0; i < dst_width; i += 3) {
dst_ptr[0] = (src_ptr[0] + src_ptr[1] + src_ptr[2] + dst_ptr[0] = (src_ptr[0] + src_ptr[1] + src_ptr[2] +
src_ptr[src_stride + 0] + src_ptr[src_stride + 1] + src_ptr[src_stride + 0] + src_ptr[src_stride + 1] +
src_ptr[src_stride + 2] + src_ptr[src_stride * 2 + 0] + src_ptr[src_stride + 2] + src_ptr[src_stride * 2 + 0] +
...@@ -2996,7 +2996,7 @@ static void ScaleRowDown38_3_Int_C(const uint8* src_ptr, int src_stride, ...@@ -2996,7 +2996,7 @@ static void ScaleRowDown38_3_Int_C(const uint8* src_ptr, int src_stride,
static void ScaleRowDown38_2_Int_C(const uint8* src_ptr, int src_stride, static void ScaleRowDown38_2_Int_C(const uint8* src_ptr, int src_stride,
uint8* dst_ptr, int dst_width) { uint8* dst_ptr, int dst_width) {
assert((dst_width % 3 == 0) && (dst_width > 0)); assert((dst_width % 3 == 0) && (dst_width > 0));
for (int i = 0; i < dst_width; i+=3) { for (int i = 0; i < dst_width; i += 3) {
dst_ptr[0] = (src_ptr[0] + src_ptr[1] + src_ptr[2] + dst_ptr[0] = (src_ptr[0] + src_ptr[1] + src_ptr[2] +
src_ptr[src_stride + 0] + src_ptr[src_stride + 1] + src_ptr[src_stride + 0] + src_ptr[src_stride + 1] +
src_ptr[src_stride + 2]) * (65536 / 6) >> 16; src_ptr[src_stride + 2]) * (65536 / 6) >> 16;
...@@ -3084,6 +3084,7 @@ static void ScalePlaneDown2(int src_width, int src_height, ...@@ -3084,6 +3084,7 @@ static void ScalePlaneDown2(int src_width, int src_height,
{ {
ScaleRowDown2 = filtering ? ScaleRowDown2Int_C : ScaleRowDown2_C; ScaleRowDown2 = filtering ? ScaleRowDown2Int_C : ScaleRowDown2_C;
} }
// TODO(fbarchard): Loop through source height to allow odd height.
for (int y = 0; y < dst_height; ++y) { for (int y = 0; y < dst_height; ++y) {
ScaleRowDown2(src_ptr, src_stride, dst_ptr, dst_width); ScaleRowDown2(src_ptr, src_stride, dst_ptr, dst_width);
src_ptr += (src_stride << 1); src_ptr += (src_stride << 1);
...@@ -3232,13 +3233,14 @@ static void ScalePlaneDown34(int src_width, int src_height, ...@@ -3232,13 +3233,14 @@ static void ScalePlaneDown34(int src_width, int src_height,
dst_ptr += dst_stride; dst_ptr += dst_stride;
} }
if ((dst_height % 3) >= 1) { // Remainder 1 or 2 rows with last row vertically unfiltered
if ((dst_height % 3) == 2) {
ScaleRowDown34_0(src_ptr, src_stride, dst_ptr, dst_width); ScaleRowDown34_0(src_ptr, src_stride, dst_ptr, dst_width);
src_ptr += src_stride; src_ptr += src_stride;
dst_ptr += dst_stride; dst_ptr += dst_stride;
} ScaleRowDown34_1(src_ptr, 0, dst_ptr, dst_width);
if ((dst_height % 3) >= 2) { } else if ((dst_height % 3) == 1) {
ScaleRowDown34_1(src_ptr, src_stride, dst_ptr, dst_width); ScaleRowDown34_0(src_ptr, 0, dst_ptr, dst_width);
} }
} }
...@@ -3248,7 +3250,16 @@ static void ScalePlaneDown34(int src_width, int src_height, ...@@ -3248,7 +3250,16 @@ static void ScalePlaneDown34(int src_width, int src_height,
* This is an optimized version for scaling down a plane to 3/8 * This is an optimized version for scaling down a plane to 3/8
* of its original size. * of its original size.
* *
* Reduces 16x3 to 6x1 * Uses box filter arranges like this
* aaabbbcc -> abc
* aaabbbcc def
* aaabbbcc ghi
* dddeeeff
* dddeeeff
* dddeeeff
* ggghhhii
* ggghhhii
* Boxes are 3x3, 2x3, 3x2 and 2x2
*/ */
static void ScalePlaneDown38(int src_width, int src_height, static void ScalePlaneDown38(int src_width, int src_height,
int dst_width, int dst_height, int dst_width, int dst_height,
...@@ -3303,13 +3314,15 @@ static void ScalePlaneDown38(int src_width, int src_height, ...@@ -3303,13 +3314,15 @@ static void ScalePlaneDown38(int src_width, int src_height,
src_ptr += src_stride * 2; src_ptr += src_stride * 2;
dst_ptr += dst_stride; dst_ptr += dst_stride;
} }
if ((dst_height % 3) >= 1) {
// Remainder 1 or 2 rows with last row vertically unfiltered
if ((dst_height % 3) == 2) {
ScaleRowDown38_3(src_ptr, src_stride, dst_ptr, dst_width); ScaleRowDown38_3(src_ptr, src_stride, dst_ptr, dst_width);
src_ptr += src_stride * 3; src_ptr += src_stride * 3;
dst_ptr += dst_stride; dst_ptr += dst_stride;
} ScaleRowDown38_3(src_ptr, 0, dst_ptr, dst_width);
if ((dst_height % 3) >= 2) { } else if ((dst_height % 3) == 1) {
ScaleRowDown38_3(src_ptr, src_stride, dst_ptr, dst_width); ScaleRowDown38_3(src_ptr, 0, dst_ptr, dst_width);
} }
} }
......
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