From 098af260675b601c0a02a373b53ed21b77775f22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reimar=20D=C3=B6ffinger?= Date: Mon, 1 Sep 2014 23:47:12 +0200 Subject: vf_deshake: Avoid doing a malloc+free for every single frame. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Reimar Döffinger --- libavfilter/vf_deshake.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'libavfilter/vf_deshake.c') diff --git a/libavfilter/vf_deshake.c b/libavfilter/vf_deshake.c index 65144211b9..ccc263b5ce 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); } -- cgit v1.2.3