From b577b4d388743e6f90f54e65fdb8edddbeaf17de Mon Sep 17 00:00:00 2001
From: Pedro Arthur <bygrandao@gmail.com>
Date: Wed, 17 Jun 2015 18:45:16 -0300
Subject: [PATCH] swscale: move variable filter attributes to filter->instance

---
 libswscale/slice.c            | 41 +++++++++++++++++++++++++++++------------
 libswscale/swscale_internal.h | 20 ++++++++++++++------
 libswscale/utils.c            |  2 --
 3 files changed, 43 insertions(+), 20 deletions(-)

diff --git a/libswscale/slice.c b/libswscale/slice.c
index 353d214..23532d8 100644
--- a/libswscale/slice.c
+++ b/libswscale/slice.c
@@ -137,9 +137,10 @@ static int init_slice_1(SwsSlice *s, uint8_t *v, uint8_t *v2, int dstW, int slic
 
 static int lum_h_scale(SwsContext *c, SwsFilterDescriptor *desc, int sliceY, int sliceH)
 {
+    LumScaleInstance *instance = desc->instance;
     int srcW = desc->src->width;
     int dstW = desc->dst->width;
-    int xInc = desc->xInc;
+    int xInc = instance->xInc;
 
     uint8_t ** src = desc->src->plane[0].line;
     uint8_t ** dst = desc->dst->plane[0].line;
@@ -150,8 +151,8 @@ static int lum_h_scale(SwsContext *c, SwsFilterDescriptor *desc, int sliceY, int
 
 
     if (!c->hyscale_fast) {
-        c->hyScale(c, (int16_t*)dst[dst_pos], dstW, (const uint8_t *)src[src_pos], desc->filter,
-                   desc->filter_pos, desc->filter_size);
+        c->hyScale(c, (int16_t*)dst[dst_pos], dstW, (const uint8_t *)src[src_pos], instance->filter,
+                   instance->filter_pos, instance->filter_size);
     } else { // fast bilinear upscale / crap downscale
         c->hyscale_fast(c, (int16_t*)dst[dst_pos], dstW, src[src_pos], srcW, xInc);
     }
@@ -171,8 +172,8 @@ static int lum_h_scale(SwsContext *c, SwsFilterDescriptor *desc, int sliceY, int
 
 
         if (!c->hyscale_fast) {
-            c->hyScale(c, (int16_t*)dst[dst_pos], dstW, (const uint8_t *)src[src_pos], desc->filter,
-                        desc->filter_pos, desc->filter_size);
+            c->hyScale(c, (int16_t*)dst[dst_pos], dstW, (const uint8_t *)src[src_pos], instance->filter,
+                        instance->filter_pos, instance->filter_size);
         } else { // fast bilinear upscale / crap downscale
             c->hyscale_fast(c, (int16_t*)dst[dst_pos], dstW, src[src_pos], srcW, xInc);
         }
@@ -186,7 +187,8 @@ static int lum_h_scale(SwsContext *c, SwsFilterDescriptor *desc, int sliceY, int
 static int lum_convert(SwsContext *c, SwsFilterDescriptor *desc, int sliceY, int sliceH)
 {
     int srcW = desc->src->width;
-    uint32_t * pal = desc->pal;
+    LumConvertInstance * instance = desc->instance;
+    uint32_t * pal = instance->pal;
 
     int sp = sliceY - desc->src->plane[0].sliceY;
     int dp = sliceY - desc->dst->plane[0].sliceY;
@@ -225,8 +227,13 @@ static int lum_convert(SwsContext *c, SwsFilterDescriptor *desc, int sliceY, int
 
 static int init_desc_fmt_convert(SwsFilterDescriptor *desc, SwsSlice * src, SwsSlice *dst, uint32_t *pal)
 {
+    LumConvertInstance * li = av_malloc(sizeof(LumConvertInstance));
+    if (!li)
+        return AVERROR(ENOMEM);
+    li->pal = pal;
+    desc->instance = li;
+
     desc->alpha = isALPHA(src->fmt) && isALPHA(dst->fmt);
-    desc->pal = pal;
     desc->src =src;
     desc->dst = dst;
     desc->process = &lum_convert;
@@ -237,15 +244,21 @@ static int init_desc_fmt_convert(SwsFilterDescriptor *desc, SwsSlice * src, SwsS
 
 static int init_desc_hscale(SwsFilterDescriptor *desc, SwsSlice *src, SwsSlice *dst, uint16_t *filter, int * filter_pos, int filter_size, int xInc)
 {
-    desc->alpha = isALPHA(src->fmt) && isALPHA(dst->fmt);
-    desc->filter = filter;
-    desc->filter_pos = filter_pos;
-    desc->filter_size = filter_size;
+    LumScaleInstance *li = av_malloc(sizeof(LumScaleInstance));
+    if (!li)
+        return AVERROR(ENOMEM);
+
+    li->filter = filter;
+    li->filter_pos = filter_pos;
+    li->filter_size = filter_size;
+    li->xInc = xInc;
+
+    desc->instance = li;
 
+    desc->alpha = isALPHA(src->fmt) && isALPHA(dst->fmt);
     desc->src = src;
     desc->dst = dst;
 
-    desc->xInc = xInc;
     desc->process = &lum_h_scale;
 
     return 1;
@@ -281,6 +294,10 @@ int ff_init_filters(SwsContext * c)
 
 int ff_free_filters(SwsContext *c)
 {
+    int i;
+    for (i = 0; i < c->numDesc; ++i)
+        av_freep(&c->desc->instance);
+
     av_freep(&c->desc);
     if (c->slice)
     {
diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h
index 40b8633..2fbbb5e 100644
--- a/libswscale/swscale_internal.h
+++ b/libswscale/swscale_internal.h
@@ -939,17 +939,25 @@ typedef struct SwsFilterDescriptor
     SwsSlice * src;
     SwsSlice * dst;
 
-    uint16_t * filter;
-    int * filter_pos;
-    int filter_size;
-
     int alpha;
-    int xInc;
-    uint32_t * pal;
+    void * instance;
 
    int (*process)(SwsContext*, struct SwsFilterDescriptor*, int, int);
 } SwsFilterDescriptor;
 
+typedef struct LumConvertInstance
+{
+    uint32_t * pal;
+} LumConvertInstance;
+
+typedef struct LumScaleInstance
+{
+    uint16_t * filter;
+    int * filter_pos;
+    int filter_size;
+    int xInc;
+} LumScaleInstance;
+
 int ff_init_slice_from_src(SwsSlice * s, uint8_t *src[4], int stride[4], int srcW, int sliceY, int sliceH, int skip);
 int ff_init_slice_from_lp(SwsSlice *s, uint8_t ***linesPool, int dstW, int sliceY, int sliceH);
 int ff_init_filters(SwsContext *c);
diff --git a/libswscale/utils.c b/libswscale/utils.c
index be97568..c843267 100644
--- a/libswscale/utils.c
+++ b/libswscale/utils.c
@@ -2020,8 +2020,6 @@ void sws_freeFilter(SwsFilter *filter)
     av_free(filter);
 }
 
-extern int ff_free_filters(SwsContext *s);
-
 void sws_freeContext(SwsContext *c)
 {
     int i;
-- 
1.9.1

