[FFmpeg-cvslog] lavfi/lut3d: restore original interpolation speed.

Clément Bœsch git at videolan.org
Sun May 26 18:49:15 CEST 2013


ffmpeg | branch: master | Clément Bœsch <ubitux at gmail.com> | Sun May 26 18:36:53 2013 +0200| [b6ee25e300420a3c98b78a1c2e983250ff065038] | committer: Clément Bœsch

lavfi/lut3d: restore original interpolation speed.

Call NEXT() only once since it got slower due to the overflow condition
introduced in 91b46145.

interp_trilinear:   1462 → 1280 decicycles
interp_tetrahedral: 1188 → 1097 decicycles

Tested on a Core2, GCC 4.8.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=b6ee25e300420a3c98b78a1c2e983250ff065038
---

 libavfilter/vf_lut3d.c |   40 ++++++++++++++++++++++------------------
 1 file changed, 22 insertions(+), 18 deletions(-)

diff --git a/libavfilter/vf_lut3d.c b/libavfilter/vf_lut3d.c
index 21206ca..41a7def 100644
--- a/libavfilter/vf_lut3d.c
+++ b/libavfilter/vf_lut3d.c
@@ -112,15 +112,17 @@ static inline struct rgbvec interp_nearest(const LUT3DContext *lut3d,
 static inline struct rgbvec interp_trilinear(const LUT3DContext *lut3d,
                                              const struct rgbvec *s)
 {
-    const struct rgbvec d = {s->r - PREV(s->r), s->g - PREV(s->g), s->b - PREV(s->b)};
-    const struct rgbvec c000 = lut3d->lut[PREV(s->r)][PREV(s->g)][PREV(s->b)];
-    const struct rgbvec c001 = lut3d->lut[PREV(s->r)][PREV(s->g)][NEXT(s->b)];
-    const struct rgbvec c010 = lut3d->lut[PREV(s->r)][NEXT(s->g)][PREV(s->b)];
-    const struct rgbvec c011 = lut3d->lut[PREV(s->r)][NEXT(s->g)][NEXT(s->b)];
-    const struct rgbvec c100 = lut3d->lut[NEXT(s->r)][PREV(s->g)][PREV(s->b)];
-    const struct rgbvec c101 = lut3d->lut[NEXT(s->r)][PREV(s->g)][NEXT(s->b)];
-    const struct rgbvec c110 = lut3d->lut[NEXT(s->r)][NEXT(s->g)][PREV(s->b)];
-    const struct rgbvec c111 = lut3d->lut[NEXT(s->r)][NEXT(s->g)][NEXT(s->b)];
+    const int prev[] = {PREV(s->r), PREV(s->g), PREV(s->b)};
+    const int next[] = {NEXT(s->r), NEXT(s->g), NEXT(s->b)};
+    const struct rgbvec d = {s->r - prev[0], s->g - prev[1], s->b - prev[2]};
+    const struct rgbvec c000 = lut3d->lut[prev[0]][prev[1]][prev[2]];
+    const struct rgbvec c001 = lut3d->lut[prev[0]][prev[1]][next[2]];
+    const struct rgbvec c010 = lut3d->lut[prev[0]][next[1]][prev[2]];
+    const struct rgbvec c011 = lut3d->lut[prev[0]][next[1]][next[2]];
+    const struct rgbvec c100 = lut3d->lut[next[0]][prev[1]][prev[2]];
+    const struct rgbvec c101 = lut3d->lut[next[0]][prev[1]][next[2]];
+    const struct rgbvec c110 = lut3d->lut[next[0]][next[1]][prev[2]];
+    const struct rgbvec c111 = lut3d->lut[next[0]][next[1]][next[2]];
     const struct rgbvec c00  = lerp(&c000, &c100, d.r);
     const struct rgbvec c10  = lerp(&c010, &c110, d.r);
     const struct rgbvec c01  = lerp(&c001, &c101, d.r);
@@ -138,15 +140,17 @@ static inline struct rgbvec interp_trilinear(const LUT3DContext *lut3d,
 static inline struct rgbvec interp_tetrahedral(const LUT3DContext *lut3d,
                                                const struct rgbvec *s)
 {
-    const struct rgbvec d = {s->r - PREV(s->r), s->g - PREV(s->g), s->b - PREV(s->b)};
-    const struct rgbvec c000 = lut3d->lut[PREV(s->r)][PREV(s->g)][PREV(s->b)];
-    const struct rgbvec c001 = lut3d->lut[PREV(s->r)][PREV(s->g)][NEXT(s->b)];
-    const struct rgbvec c010 = lut3d->lut[PREV(s->r)][NEXT(s->g)][PREV(s->b)];
-    const struct rgbvec c011 = lut3d->lut[PREV(s->r)][NEXT(s->g)][NEXT(s->b)];
-    const struct rgbvec c100 = lut3d->lut[NEXT(s->r)][PREV(s->g)][PREV(s->b)];
-    const struct rgbvec c101 = lut3d->lut[NEXT(s->r)][PREV(s->g)][NEXT(s->b)];
-    const struct rgbvec c110 = lut3d->lut[NEXT(s->r)][NEXT(s->g)][PREV(s->b)];
-    const struct rgbvec c111 = lut3d->lut[NEXT(s->r)][NEXT(s->g)][NEXT(s->b)];
+    const int prev[] = {PREV(s->r), PREV(s->g), PREV(s->b)};
+    const int next[] = {NEXT(s->r), NEXT(s->g), NEXT(s->b)};
+    const struct rgbvec d = {s->r - prev[0], s->g - prev[1], s->b - prev[2]};
+    const struct rgbvec c000 = lut3d->lut[prev[0]][prev[1]][prev[2]];
+    const struct rgbvec c001 = lut3d->lut[prev[0]][prev[1]][next[2]];
+    const struct rgbvec c010 = lut3d->lut[prev[0]][next[1]][prev[2]];
+    const struct rgbvec c011 = lut3d->lut[prev[0]][next[1]][next[2]];
+    const struct rgbvec c100 = lut3d->lut[next[0]][prev[1]][prev[2]];
+    const struct rgbvec c101 = lut3d->lut[next[0]][prev[1]][next[2]];
+    const struct rgbvec c110 = lut3d->lut[next[0]][next[1]][prev[2]];
+    const struct rgbvec c111 = lut3d->lut[next[0]][next[1]][next[2]];
     struct rgbvec c;
     if (d.r > d.g) {
         if (d.g > d.b) {



More information about the ffmpeg-cvslog mailing list