[FFmpeg-devel] [PATCH 3/4] avfilter/vf_colormatrix: clean up and simplify calculations

Thomas Mundt loudmax at yahoo.de
Fri Mar 25 23:31:59 CET 2016


Signed-off-by: Thomas Mundt <loudmax at yahoo.de>
---
 libavfilter/vf_colormatrix.c | 49 +++++++++++++++++++-------------------------
 1 file changed, 21 insertions(+), 28 deletions(-)

diff --git a/libavfilter/vf_colormatrix.c b/libavfilter/vf_colormatrix.c
index 6840b91..5fe9ce3 100644
--- a/libavfilter/vf_colormatrix.c
+++ b/libavfilter/vf_colormatrix.c
@@ -38,7 +38,6 @@
 #include "libavutil/avstring.h"
 
 #define NS(n) ((n) < 0 ? (int)((n)*65536.0-0.5+DBL_EPSILON) : (int)((n)*65536.0+0.5))
-#define CB(n) av_clip_uint8(n)
 
 static const double yuv_coeff_luma[5][3] = { 
     { +0.7152, +0.0722, +0.2126 }, // Rec.709 (0)
@@ -61,10 +60,8 @@ enum ColorMode {
 typedef struct {
     const AVClass *class;
     int yuv_convert[25][3][3];
-    int interlaced;
     int source, dest;        ///< ColorMode
     int mode;
-    int hsub, vsub;
 } ColorMatrixContext;
 
 typedef struct ThreadData {
@@ -227,11 +224,11 @@ static int process_slice_uyvy422(AVFilterContext *ctx, void *arg, int jobnr, int
         for (x = 0; x < width; x += 4) {
             const int u = srcp[x + 0] - 128;
             const int v = srcp[x + 2] - 128;
-            const int uvval = c2 * u + c3 * v + 1081344;
-            dstp[x + 0] = CB((c4 * u + c5 * v + 8421376) >> 16);
-            dstp[x + 1] = CB((65536 * (srcp[x + 1] - 16) + uvval) >> 16);
-            dstp[x + 2] = CB((c6 * u + c7 * v + 8421376) >> 16);
-            dstp[x + 3] = CB((65536 * (srcp[x + 3] - 16) + uvval) >> 16);
+            const int uvval = (c2 * u + c3 * v + 32768) >> 16;
+            dstp[x + 0] = av_clip_uint8((c4 * u + c5 * v + 8421376) >> 16);
+            dstp[x + 1] = av_clip_uint8(srcp[x + 1] + uvval);
+            dstp[x + 2] = av_clip_uint8((c6 * u + c7 * v + 8421376) >> 16);
+            dstp[x + 3] = av_clip_uint8(srcp[x + 3] + uvval);
         }
         srcp += src_pitch;
         dstp += dst_pitch;
@@ -271,10 +268,10 @@ static int process_slice_yuv444p(AVFilterContext *ctx, void *arg, int jobnr, int
         for (x = 0; x < width; x++) {
             const int u = srcpU[x] - 128;
             const int v = srcpV[x] - 128;
-            const int uvval = c2 * u + c3 * v + 1081344;
-            dstpY[x] = CB((65536 * (srcpY[x] - 16) + uvval) >> 16);
-            dstpU[x] = CB((c4 * u + c5 * v + 8421376) >> 16);
-            dstpV[x] = CB((c6 * u + c7 * v + 8421376) >> 16);
+            const int uvval = (c2 * u + c3 * v + 32768) >> 16;
+            dstpY[x] = av_clip_uint8(srcpY[x] + uvval);
+            dstpU[x] = av_clip_uint8((c4 * u + c5 * v + 8421376) >> 16);
+            dstpV[x] = av_clip_uint8((c6 * u + c7 * v + 8421376) >> 16);
         }
         srcpY += src_pitchY;
         dstpY += dst_pitchY;
@@ -318,11 +315,11 @@ static int process_slice_yuv422p(AVFilterContext *ctx, void *arg, int jobnr, int
         for (x = 0; x < width; x += 2) {
             const int u = srcpU[x >> 1] - 128;
             const int v = srcpV[x >> 1] - 128;
-            const int uvval = c2 * u + c3 * v + 1081344;
-            dstpY[x + 0] = CB((65536 * (srcpY[x + 0] - 16) + uvval) >> 16);
-            dstpY[x + 1] = CB((65536 * (srcpY[x + 1] - 16) + uvval) >> 16);
-            dstpU[x >> 1] = CB((c4 * u + c5 * v + 8421376) >> 16);
-            dstpV[x >> 1] = CB((c6 * u + c7 * v + 8421376) >> 16);
+            const int uvval = (c2 * u + c3 * v + 32768) >> 16;
+            dstpY[x + 0] = av_clip_uint8(srcpY[x + 0] + uvval);
+            dstpY[x + 1] = av_clip_uint8(srcpY[x + 1] + uvval);
+            dstpU[x >> 1] = av_clip_uint8((c4 * u + c5 * v + 8421376) >> 16);
+            dstpV[x >> 1] = av_clip_uint8((c6 * u + c7 * v + 8421376) >> 16);
         }
         srcpY += src_pitchY;
         dstpY += dst_pitchY;
@@ -368,13 +365,13 @@ static int process_slice_yuv420p(AVFilterContext *ctx, void *arg, int jobnr, int
         for (x = 0; x < width; x += 2) {
             const int u = srcpU[x >> 1] - 128;
             const int v = srcpV[x >> 1] - 128;
-            const int uvval = c2 * u + c3 * v + 1081344;
-            dstpY[x + 0] = CB((65536 * (srcpY[x + 0] - 16) + uvval) >> 16);
-            dstpY[x + 1] = CB((65536 * (srcpY[x + 1] - 16) + uvval) >> 16);
-            dstpN[x + 0] = CB((65536 * (srcpN[x + 0] - 16) + uvval) >> 16);
-            dstpN[x + 1] = CB((65536 * (srcpN[x + 1] - 16) + uvval) >> 16);
-            dstpU[x >> 1] = CB((c4 * u + c5 * v + 8421376) >> 16);
-            dstpV[x >> 1] = CB((c6 * u + c7 * v + 8421376) >> 16);
+            const int uvval = (c2 * u + c3 * v + 32768) >> 16;
+            dstpY[x + 0] = av_clip_uint8(srcpY[x + 0] + uvval);
+            dstpY[x + 1] = av_clip_uint8(srcpY[x + 1] + uvval);
+            dstpN[x + 0] = av_clip_uint8(srcpN[x + 0] + uvval);
+            dstpN[x + 1] = av_clip_uint8(srcpN[x + 1] + uvval);
+            dstpU[x >> 1] = av_clip_uint8((c4 * u + c5 * v + 8421376) >> 16);
+            dstpV[x >> 1] = av_clip_uint8((c6 * u + c7 * v + 8421376) >> 16);
         }
         srcpY += src_pitchY << 1;
         dstpY += dst_pitchY << 1;
@@ -393,10 +390,6 @@ static int config_input(AVFilterLink *inlink)
 {
     AVFilterContext *ctx = inlink->dst;
     ColorMatrixContext *color = ctx->priv;
-    const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(inlink->format);
-
-    color->hsub = pix_desc->log2_chroma_w;
-    color->vsub = pix_desc->log2_chroma_h;
 
     av_log(ctx, AV_LOG_VERBOSE, "%s -> %s\n",
            color_modes[color->source], color_modes[color->dest]);
-- 
2.7.4.windows.1




More information about the ffmpeg-devel mailing list