[x265] [PATCH] A few small performance improvements for intrapred c code
dtyx265 at gmail.com
dtyx265 at gmail.com
Wed Oct 1 03:43:15 CEST 2014
# HG changeset patch
# User David T Yuen <dtyx265 at gmail.com>
# Date 1412127675 25200
# Node ID 353ccf9c2b2adc37cfb1bc7124fcca131599e0ad
# Parent 5a6845566d1492d29af29ecc0cf75d644994735c
A few small performance improvements for intrapred c code
diff -r 5a6845566d14 -r 353ccf9c2b2a source/common/intrapred.cpp
--- a/source/common/intrapred.cpp Mon Sep 29 17:37:47 2014 -0500
+++ b/source/common/intrapred.cpp Tue Sep 30 18:41:15 2014 -0700
@@ -35,10 +35,6 @@
for (w = 0; w < width; w++)
{
sum += above[w];
- }
-
- for (w = 0; w < width; w++)
- {
sum += left[w];
}
@@ -57,11 +53,10 @@
dst[x] = (pixel)((above[x] + 3 * dst[x] + 2) >> 2);
}
- dst += dststride;
for (int y = 1; y < size; y++)
{
+ dst += dststride;
*dst = (pixel)((left[y] + 3 * *dst + 2) >> 2);
- dst += dststride;
}
}
@@ -134,13 +129,11 @@
}
template<int width>
-void intra_pred_ang_c(pixel* dst, intptr_t dstStride, pixel *refLeft, pixel *refAbove, int dirMode, int bFilter)
+void intra_pred_ang_c1(pixel* dst, intptr_t dstStride, pixel *refLeft, pixel *refAbove, int dirMode, int bFilter)
{
// Map the mode index to main prediction direction and angle
int k, l;
- bool modeHor = (dirMode < 18);
- bool modeVer = !modeHor;
- int intraPredAngle = modeVer ? (int)dirMode - VER_IDX : modeHor ? -((int)dirMode - HOR_IDX) : 0;
+ int intraPredAngle = dirMode > 17 ? (int)dirMode - VER_IDX : -((int)dirMode - HOR_IDX);
int absAng = abs(intraPredAngle);
int signAng = intraPredAngle < 0 ? -1 : 1;
@@ -154,27 +147,12 @@
// Do angular predictions
{
- pixel* refMain;
- pixel* refSide;
-
- // Initialise the Main and Left reference array.
- if (intraPredAngle < 0)
+ pixel* refMain = refLeft;
+ pixel* refSide = refAbove;
+ if (dirMode > 17)
{
- refMain = (modeVer ? refAbove : refLeft); // + (width - 1);
- refSide = (modeVer ? refLeft : refAbove); // + (width - 1);
-
- // Extend the Main reference to the left.
- int invAngleSum = 128; // rounding for (shift by 8)
- for (k = -1; k > width * intraPredAngle >> 5; k--)
- {
- invAngleSum += invAngle;
- refMain[k] = refSide[invAngleSum >> 8];
- }
- }
- else
- {
- refMain = modeVer ? refAbove : refLeft;
- refSide = modeVer ? refLeft : refAbove;
+ refMain = refAbove;
+ refSide = refLeft;
}
if (intraPredAngle == 0)
@@ -197,6 +175,18 @@
}
else
{
+ // Initialise the Main and Left reference array.
+ if (intraPredAngle < 0)
+ {
+ // Extend the Main reference to the left.
+ int invAngleSum = 128; // rounding for (shift by 8)
+ for (k = -1; k > width * intraPredAngle >> 5; k--)
+ {
+ invAngleSum += invAngle;
+ refMain[k] = refSide[invAngleSum >> 8];
+ }
+ }
+
int deltaPos = 0;
int deltaInt;
int deltaFract;
@@ -227,18 +217,24 @@
}
}
}
+ }
+}
- // Flip the block if this is the horizontal mode
- if (modeHor)
+template<int width>
+void intra_pred_ang_c(pixel* dst, intptr_t dstStride, pixel *refLeft, pixel *refAbove, int dirMode, int bFilter)
+{
+ int k, l;
+ intra_pred_ang_c1<width>(dst, dstStride, refLeft, refAbove, dirMode, bFilter);
+
+ if (dirMode < 18)
+ {
+ for (k = 0; k < width - 1; k++)
{
- for (k = 0; k < width - 1; k++)
+ for (l = k + 1; l < width; l++)
{
- for (l = k + 1; l < width; l++)
- {
- pixel tmp = dst[k * dstStride + l];
- dst[k * dstStride + l] = dst[l * dstStride + k];
- dst[l * dstStride + k] = tmp;
- }
+ dst[l * dstStride + k] ^= dst[k * dstStride + l];
+ dst[k * dstStride + l] ^= dst[l * dstStride + k];
+ dst[l * dstStride + k] ^= dst[k * dstStride + l];
}
}
}
@@ -250,28 +246,22 @@
const int size = 1 << log2Size;
for (int mode = 2; mode <= 34; mode++)
{
- pixel *left = (g_intraFilterFlags[mode] & size ? left1 : left0);
- pixel *above = (g_intraFilterFlags[mode] & size ? above1 : above0);
+ pixel *left;
+ pixel *above;
+
+ if (g_intraFilterFlags[mode] & size)
+ {
+ left = left1;
+ above = above1;
+ }
+ else
+ {
+ left = left0;
+ above = above0;
+ }
pixel *out = dest + ((mode - 2) << (log2Size * 2));
- intra_pred_ang_c<size>(out, size, left, above, mode, bLuma);
-
- // Optimize code don't flip buffer
- bool modeHor = (mode < 18);
-
- // transpose the block if this is a horizontal mode
- if (modeHor)
- {
- for (int k = 0; k < size - 1; k++)
- {
- for (int l = k + 1; l < size; l++)
- {
- pixel tmp = out[k * size + l];
- out[k * size + l] = out[l * size + k];
- out[l * size + k] = tmp;
- }
- }
- }
+ intra_pred_ang_c1<size>(out, size, left, above, mode, bLuma);
}
}
}
More information about the x265-devel
mailing list