summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2019-01-15 01:14:34 -0300
committerJames Almer <jamrial@gmail.com>2019-01-17 13:24:14 -0300
commitaf05070ddf8e748132047b265cebd7f893fb37f9 (patch)
tree4594cc0e309dd07602b2c70ad5a73f63bca9665d
parentf60fdbc96074a884eaa36d44946415203d3b2b79 (diff)
downloadffmpeg-streaming-af05070ddf8e748132047b265cebd7f893fb37f9.zip
ffmpeg-streaming-af05070ddf8e748132047b265cebd7f893fb37f9.tar.gz
avfilter/vf_paletteuse: don't constantly free and realloc internal frames
Reviewed-by: Clément Bœsch <u@pkh.me> Signed-off-by: James Almer <jamrial@gmail.com>
-rw-r--r--libavfilter/vf_paletteuse.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/libavfilter/vf_paletteuse.c b/libavfilter/vf_paletteuse.c
index 5966f10..ed12881 100644
--- a/libavfilter/vf_paletteuse.c
+++ b/libavfilter/vf_paletteuse.c
@@ -814,7 +814,7 @@ static void set_processing_window(enum diff_mode diff_mode,
int width = cur_src->width;
int height = cur_src->height;
- if (prv_src && diff_mode == DIFF_MODE_RECTANGLE) {
+ if (prv_src->data[0] && diff_mode == DIFF_MODE_RECTANGLE) {
int y;
int x_end = cur_src->width - 1,
y_end = cur_src->height - 1;
@@ -911,11 +911,10 @@ static int apply_palette(AVFilterLink *inlink, AVFrame *in, AVFrame **outf)
set_processing_window(s->diff_mode, s->last_in, in,
s->last_out, out, &x, &y, &w, &h);
- av_frame_free(&s->last_in);
- av_frame_free(&s->last_out);
- s->last_in = av_frame_clone(in);
- s->last_out = av_frame_clone(out);
- if (!s->last_in || !s->last_out ||
+ av_frame_unref(s->last_in);
+ av_frame_unref(s->last_out);
+ if (av_frame_ref(s->last_in, in) < 0 ||
+ av_frame_ref(s->last_out, out) < 0 ||
av_frame_make_writable(s->last_in) < 0) {
av_frame_free(&in);
av_frame_free(&out);
@@ -1086,6 +1085,14 @@ static av_cold int init(AVFilterContext *ctx)
{
PaletteUseContext *s = ctx->priv;
+ s->last_in = av_frame_alloc();
+ s->last_out = av_frame_alloc();
+ if (!s->last_in || !s->last_out) {
+ av_frame_free(&s->last_in);
+ av_frame_free(&s->last_out);
+ return AVERROR(ENOMEM);
+ }
+
s->set_frame = set_frame_lut[s->color_search_method][s->dither];
if (s->dither == DITHERING_BAYER) {
OpenPOWER on IntegriCloud