[FFmpeg-devel] [PATCH 3/5] avfilter/deshake: remove avcodec dependency

Clément Bœsch u at pkh.me
Sat Aug 2 23:34:09 CEST 2014


---
 configure                |  4 +---
 libavfilter/deshake.h    |  5 ++---
 libavfilter/vf_deshake.c | 20 ++++++++------------
 3 files changed, 11 insertions(+), 18 deletions(-)

diff --git a/configure b/configure
index 5159f10..bc187a5 100755
--- a/configure
+++ b/configure
@@ -2531,8 +2531,7 @@ cropdetect_filter_deps="gpl"
 dctdnoiz_filter_deps="avcodec"
 dctdnoiz_filter_select="dct"
 delogo_filter_deps="gpl"
-deshake_filter_deps="avcodec"
-deshake_filter_select="me_cmp"
+deshake_filter_select="pixelutils"
 drawtext_filter_deps="libfreetype"
 ebur128_filter_deps="gpl"
 flite_filter_deps="libflite"
@@ -5241,7 +5240,6 @@ enabled amovie_filter       && prepend avfilter_deps "avformat avcodec"
 enabled aresample_filter    && prepend avfilter_deps "swresample"
 enabled asyncts_filter      && prepend avfilter_deps "avresample"
 enabled atempo_filter       && prepend avfilter_deps "avcodec"
-enabled deshake_filter      && prepend avfilter_deps "avcodec"
 enabled ebur128_filter && enabled swresample && prepend avfilter_deps "swresample"
 enabled elbg_filter         && prepend avfilter_deps "avcodec"
 enabled mcdeint_filter      && prepend avfilter_deps "avcodec"
diff --git a/libavfilter/deshake.h b/libavfilter/deshake.h
index 615953c..f61ed80 100644
--- a/libavfilter/deshake.h
+++ b/libavfilter/deshake.h
@@ -24,8 +24,8 @@
 
 #include "config.h"
 #include "avfilter.h"
-#include "libavcodec/dsputil.h"
 #include "transform.h"
+#include "libavutil/pixelutils.h"
 #if CONFIG_OPENCL
 #include "libavutil/opencl.h"
 #endif
@@ -80,8 +80,7 @@ typedef struct {
     int blocksize;             ///< Size of blocks to compare
     int contrast;              ///< Contrast threshold
     int search;                ///< Motion search method
-    AVCodecContext *avctx;
-    DSPContext c;              ///< Context providing optimized SAD methods
+    av_pixelutils_sad_fn sad;  ///< Sum of the absolute difference function
     Transform last;            ///< Transform from last frame
     int refcount;              ///< Number of reference frames (defines averaging window)
     FILE *fp;
diff --git a/libavfilter/vf_deshake.c b/libavfilter/vf_deshake.c
index 50aa451..95a6c51 100644
--- a/libavfilter/vf_deshake.c
+++ b/libavfilter/vf_deshake.c
@@ -57,7 +57,6 @@
 #include "libavutil/mem.h"
 #include "libavutil/opt.h"
 #include "libavutil/pixdesc.h"
-#include "libavcodec/dsputil.h"
 
 #include "deshake.h"
 #include "deshake_opencl.h"
@@ -132,9 +131,8 @@ static void find_block_motion(DeshakeContext *deshake, uint8_t *src1,
     int smallest = INT_MAX;
     int tmp, tmp2;
 
-    #define CMP(i, j) deshake->c.sad[0](NULL, src1 + cy * stride + cx, \
-                                        src2 + (j) * stride + (i), stride, \
-                                        deshake->blocksize)
+    #define CMP(i, j) deshake->sad(src1 + cy  * stride + cx,  stride,\
+                                   src2 + (j) * stride + (i), stride)
 
     if (deshake->search == EXHAUSTIVE) {
         // Compare every possible position - this is sloooow!
@@ -201,7 +199,7 @@ static int block_contrast(uint8_t *src, int x, int y, int stride, int blocksize)
     int i, j, pos;
 
     for (i = 0; i <= blocksize * 2; i++) {
-        // We use a width of 16 here to match the libavcodec sad functions
+        // We use a width of 16 here to match the sad function
         for (j = 0; j <= 15; j++) {
             pos = (y - i) * stride + (x - j);
             if (src[pos] < lowest)
@@ -263,7 +261,7 @@ static void find_motion(DeshakeContext *deshake, uint8_t *src1, uint8_t *src2,
     pos = 0;
     // Find motion for every block and store the motion vector in the counts
     for (y = deshake->ry; y < height - deshake->ry - (deshake->blocksize * 2); y += deshake->blocksize * 2) {
-        // We use a width of 16 here to match the libavcodec sad functions
+        // We use a width of 16 here to match the sad function
         for (x = deshake->rx; x < width - deshake->rx - 16; x += 16) {
             // If the contrast is too low, just skip this block as it probably
             // won't be very useful to us.
@@ -351,6 +349,10 @@ static av_cold int init(AVFilterContext *ctx)
     int ret;
     DeshakeContext *deshake = ctx->priv;
 
+    deshake->sad = av_pixelutils_get_sad_fn(4, 4, 1, deshake); // 16x16, 2nd source unaligned
+    if (!deshake->sad)
+        return AVERROR(EINVAL);
+
     deshake->refcount = 20; // XXX: add to options?
     deshake->blocksize /= 2;
     deshake->blocksize = av_clip(deshake->blocksize, 4, 128);
@@ -413,9 +415,6 @@ static int config_props(AVFilterLink *link)
     deshake->last.angle = 0;
     deshake->last.zoom = 0;
 
-    deshake->avctx = avcodec_alloc_context3(NULL);
-    avpriv_dsputil_init(&deshake->c, deshake->avctx);
-
     return 0;
 }
 
@@ -428,9 +427,6 @@ static av_cold void uninit(AVFilterContext *ctx)
     av_frame_free(&deshake->ref);
     if (deshake->fp)
         fclose(deshake->fp);
-    if (deshake->avctx)
-        avcodec_close(deshake->avctx);
-    av_freep(&deshake->avctx);
 }
 
 static int filter_frame(AVFilterLink *link, AVFrame *in)
-- 
2.0.2



More information about the ffmpeg-devel mailing list