Re: [FFmpeg-devel] [PATCH] vf_deshake: Avoid doing a malloc+free for every single frame.

2014-09-02 Thread Reimar Döffinger
On Tue, Sep 02, 2014 at 01:55:20AM +0200, Michael Niedermayer wrote:
 On Mon, Sep 01, 2014 at 11:49:28PM +0200, Reimar Döffinger wrote:
  Signed-off-by: Reimar Döffinger reimar.doeffin...@gmx.de
  ---
   libavfilter/deshake.h|  2 ++
   libavfilter/vf_deshake.c | 10 ++
   2 files changed, 8 insertions(+), 4 deletions(-)
 
 LGTM

Pushed.
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH] vf_deshake: Avoid doing a malloc+free for every single frame.

2014-09-01 Thread Reimar Döffinger
Signed-off-by: Reimar Döffinger reimar.doeffin...@gmx.de
---
 libavfilter/deshake.h|  2 ++
 libavfilter/vf_deshake.c | 10 ++
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/libavfilter/deshake.h b/libavfilter/deshake.h
index 20df88f..62e81c3 100644
--- a/libavfilter/deshake.h
+++ b/libavfilter/deshake.h
@@ -76,6 +76,8 @@ typedef struct {
 typedef struct {
 const AVClass *class;
 int counts[2*MAX_R+1][2*MAX_R+1]; ///  Scratch buffer for motion search
+double *angles;/// Scratch buffer for block angles
+unsigned angles_size;
 AVFrame *ref;  /// Previous frame
 int rx;/// Maximum horizontal shift
 int ry;/// Maximum vertical shift
diff --git a/libavfilter/vf_deshake.c b/libavfilter/vf_deshake.c
index 6514421..ccc263b 100644
--- a/libavfilter/vf_deshake.c
+++ b/libavfilter/vf_deshake.c
@@ -244,10 +244,11 @@ static void find_motion(DeshakeContext *deshake, uint8_t 
*src1, uint8_t *src2,
 int contrast;
 
 int pos;
-double *angles = av_malloc_array(width * height / (16 * 
deshake-blocksize), sizeof(*angles));
 int center_x = 0, center_y = 0;
 double p_x, p_y;
 
+av_fast_malloc(deshake-angles, deshake-angles_size, width * height / 
(16 * deshake-blocksize) * sizeof(*deshake-angles));
+
 // Reset counts to zero
 for (x = 0; x  deshake-rx * 2 + 1; x++) {
 for (y = 0; y  deshake-ry * 2 + 1; y++) {
@@ -269,7 +270,7 @@ static void find_motion(DeshakeContext *deshake, uint8_t 
*src1, uint8_t *src2,
 if (mv.x != -1  mv.y != -1) {
 deshake-counts[mv.x + deshake-rx][mv.y + deshake-ry] += 
1;
 if (x  deshake-rx  y  deshake-ry)
-angles[pos++] = block_angle(x, y, 0, 0, mv);
+deshake-angles[pos++] = block_angle(x, y, 0, 0, mv);
 
 center_x += mv.x;
 center_y += mv.y;
@@ -281,7 +282,7 @@ static void find_motion(DeshakeContext *deshake, uint8_t 
*src1, uint8_t *src2,
 if (pos) {
  center_x /= pos;
  center_y /= pos;
- t-angle = clean_mean(angles, pos);
+ t-angle = clean_mean(deshake-angles, pos);
  if (t-angle  0.001)
   t-angle = 0;
 } else {
@@ -312,7 +313,6 @@ static void find_motion(DeshakeContext *deshake, uint8_t 
*src1, uint8_t *src2,
 t-angle = av_clipf(t-angle, -0.1, 0.1);
 
 //av_log(NULL, AV_LOG_ERROR, %d x %d\n, avg-x, avg-y);
-av_free(angles);
 }
 
 static int deshake_transform_c(AVFilterContext *ctx,
@@ -422,6 +422,8 @@ static av_cold void uninit(AVFilterContext *ctx)
 ff_opencl_deshake_uninit(ctx);
 }
 av_frame_free(deshake-ref);
+av_freep(deshake-angles);
+deshake-angles_size = 0;
 if (deshake-fp)
 fclose(deshake-fp);
 }
-- 
2.1.0

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel