<div style="line-height:1.7;color:#000000;font-size:14px;font-family:arial"><div>>- bool modeHor = (dirMode < 18);<br>>- bool modeVer = !modeHor;<br>>- int intraPredAngle = modeVer ? (int)dirMode - VER_IDX : modeHor ? -((int)dirMode - HOR_IDX) : 0;<br>>+ int intraPredAngle = dirMode > 17 ? (int)dirMode - VER_IDX : -((int)dirMode - HOR_IDX);<br></div><div>for this example, origin code easy to know it is a horizon mode and easy to find in specification,</div><div>In new code, we have to find where is the constant 17 and reason</div><div>New code difficult match to HEVC specification, it means more jobs during port or understand.<br></div><div> </div>At 2014-10-02 01:54:15,dave <dtyx265@gmail.com> wrote:<br> <blockquote id="isReplyContent" style="margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid;">
<div class="moz-cite-prefix">I know the C model is not a priority, I
just felt like doing it. Also, I don't think I really changed the
core algorithms. As my comment states, "A few small performance
improvements".<br>
<br>
On 10/01/2014 08:32 AM, chen wrote:<br>
</div>
<blockquote cite="mid:51e043b2.696.148cc574dd0.Coremail.chenm003@163.com" type="cite">
<div style="color: rgb(0, 0, 0); line-height: 1.7; font-family: arial; font-size: 14px;">
<div>We don't worry about C model performance, it is for
reference only.</div>
<div>I like clear code, it easy to port to different platform
with algorithm re-design.</div>
<pre>At 2014-10-01 09:43:15,<a class="moz-txt-link-abbreviated" href="mailto:dtyx265@gmail.com">dtyx265@gmail.com</a> wrote:
># HG changeset patch
># User David T Yuen <a class="moz-txt-link-rfc2396E" href="mailto:dtyx265@gmail.com"><dtyx265@gmail.com></a>
># 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);
> }
> }
> }
>_______________________________________________
>x265-devel mailing list
><a class="moz-txt-link-abbreviated" href="mailto:x265-devel@videolan.org">x265-devel@videolan.org</a>
><a class="moz-txt-link-freetext" href="https://mailman.videolan.org/listinfo/x265-devel">https://mailman.videolan.org/listinfo/x265-devel</a>
</pre>
</div>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
x265-devel mailing list
<a class="moz-txt-link-abbreviated" href="mailto:x265-devel@videolan.org">x265-devel@videolan.org</a>
<a class="moz-txt-link-freetext" href="https://mailman.videolan.org/listinfo/x265-devel">https://mailman.videolan.org/listinfo/x265-devel</a>
</pre>
</blockquote>
<br>
</blockquote></div>