summaryrefslogtreecommitdiffstats
path: root/libavfilter
diff options
context:
space:
mode:
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>2014-09-01 23:47:12 +0200
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>2014-09-02 19:20:28 +0200
commit098af260675b601c0a02a373b53ed21b77775f22 (patch)
treefd6622872e8d7296567ce9bd8597282e973f0e68 /libavfilter
parent4ea8406e38112bc374367386966d3a4c7357916c (diff)
downloadffmpeg-streaming-098af260675b601c0a02a373b53ed21b77775f22.zip
ffmpeg-streaming-098af260675b601c0a02a373b53ed21b77775f22.tar.gz
vf_deshake: Avoid doing a malloc+free for every single frame.
Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
Diffstat (limited to 'libavfilter')
-rw-r--r--libavfilter/deshake.h2
-rw-r--r--libavfilter/vf_deshake.c10
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);
}
OpenPOWER on IntegriCloud