diff mbox series

[FFmpeg-devel,11/24] sws: do not reallocate scratch buffers for each slice

Message ID 20210531075515.19544-11-anton@khirnov.net
State Accepted
Headers show
Series [FFmpeg-devel,01/24] sws: remove unnecessary braces | expand

Checks

Context Check Description
andriy/x86_make success Make finished
andriy/x86_make_fate success Make fate finished
andriy/PPC64_make success Make finished
andriy/PPC64_make_fate success Make fate finished

Commit Message

Anton Khirnov May 31, 2021, 7:55 a.m. UTC
---
 libswscale/swscale.c          | 20 ++++++++++++--------
 libswscale/swscale_internal.h |  6 ++++++
 libswscale/utils.c            |  3 +++
 3 files changed, 21 insertions(+), 8 deletions(-)

Comments

Michael Niedermayer June 1, 2021, 12:22 p.m. UTC | #1
On Mon, May 31, 2021 at 09:55:02AM +0200, Anton Khirnov wrote:
> ---
>  libswscale/swscale.c          | 20 ++++++++++++--------
>  libswscale/swscale_internal.h |  6 ++++++
>  libswscale/utils.c            |  3 +++
>  3 files changed, 21 insertions(+), 8 deletions(-)
> 
> diff --git a/libswscale/swscale.c b/libswscale/swscale.c
> index 37c7cf60dd..2db40a6807 100644
> --- a/libswscale/swscale.c
> +++ b/libswscale/swscale.c
> @@ -871,7 +871,6 @@ int attribute_align_arg sws_scale(struct SwsContext *c,
>      int i, ret;
>      const uint8_t *src2[4];
>      uint8_t *dst2[4];
> -    uint8_t *rgb0_tmp = NULL;
>      int macro_height = isBayer(c->srcFormat) ? 2 : (1 << c->chrSrcVSubSample);
>      // copy strides, so they can safely be modified
>      int srcStride2[4];
> @@ -928,11 +927,14 @@ int attribute_align_arg sws_scale(struct SwsContext *c,
>      if (c->src0Alpha && !c->dst0Alpha && isALPHA(c->dstFormat)) {
>          uint8_t *base;
>          int x,y;
> -        rgb0_tmp = av_malloc(FFABS(srcStride[0]) * srcSliceH + 32);
> -        if (!rgb0_tmp)
> +
> +        av_fast_malloc(&c->rgb0_scratch, &c->rgb0_scratch_allocated,
> +                       FFABS(srcStride[0]) * srcSliceH + 32);
> +        if (!c->rgb0_scratch)
>              return AVERROR(ENOMEM);
>  
> -        base = srcStride[0] < 0 ? rgb0_tmp - srcStride[0] * (srcSliceH-1) : rgb0_tmp;
> +        base = srcStride[0] < 0 ? c->rgb0_scratch - srcStride[0] * (srcSliceH-1) :
> +                                  c->rgb0_scratch;
>          for (y=0; y<srcSliceH; y++){
>              memcpy(base + srcStride[0]*y, src2[0] + srcStride[0]*y, 4*c->srcW);
>              for (x=c->src0Alpha-1; x<4*c->srcW; x+=4) {
> @@ -944,11 +946,14 @@ int attribute_align_arg sws_scale(struct SwsContext *c,
>  
>      if (c->srcXYZ && !(c->dstXYZ && c->srcW==c->dstW && c->srcH==c->dstH)) {
>          uint8_t *base;
> -        rgb0_tmp = av_malloc(FFABS(srcStride[0]) * srcSliceH + 32);
> -        if (!rgb0_tmp)
> +
> +        av_fast_malloc(&c->xyz_scratch, &c->xyz_scratch_allocated,
> +                       FFABS(srcStride[0]) * srcSliceH + 32);
> +        if (!c->xyz_scratch)
>              return AVERROR(ENOMEM);
>  
> -        base = srcStride[0] < 0 ? rgb0_tmp - srcStride[0] * (srcSliceH-1) : rgb0_tmp;
> +        base = srcStride[0] < 0 ? c->xyz_scratch - srcStride[0] * (srcSliceH-1) :
> +                                  c->xyz_scratch;
>  
>          xyz12Torgb48(c, (uint16_t*)base, (const uint16_t*)src2[0], srcStride[0]/2, srcSliceH);
>          src2[0] = base;
> @@ -996,6 +1001,5 @@ int attribute_align_arg sws_scale(struct SwsContext *c,
>          rgb48Toxyz12(c, dst16, dst16, dstStride2[0]/2, ret);
>      }
>  
> -    av_free(rgb0_tmp);
>      return ret;
>  }

> diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h
> index a1de95cee0..e8a434427b 100644
> --- a/libswscale/swscale_internal.h
> +++ b/libswscale/swscale_internal.h
> @@ -626,6 +626,12 @@ typedef struct SwsContext {
>      SwsDither dither;
>  
>      SwsAlphaBlend alphablend;
> +
> +    uint8_t     *rgb0_scratch;
> +    unsigned int rgb0_scratch_allocated;
> +
> +    uint8_t     *xyz_scratch;
> +    unsigned int xyz_scratch_allocated;

these should have a few words documenting them. Size comes to mind as a usefull
parameter for a reader to be interrested in
lifetime is another one usefull to know for scratch areas, when can code use
them when does its content need to be preserved

otherwise LGTM

thx

[...]
diff mbox series

Patch

diff --git a/libswscale/swscale.c b/libswscale/swscale.c
index 37c7cf60dd..2db40a6807 100644
--- a/libswscale/swscale.c
+++ b/libswscale/swscale.c
@@ -871,7 +871,6 @@  int attribute_align_arg sws_scale(struct SwsContext *c,
     int i, ret;
     const uint8_t *src2[4];
     uint8_t *dst2[4];
-    uint8_t *rgb0_tmp = NULL;
     int macro_height = isBayer(c->srcFormat) ? 2 : (1 << c->chrSrcVSubSample);
     // copy strides, so they can safely be modified
     int srcStride2[4];
@@ -928,11 +927,14 @@  int attribute_align_arg sws_scale(struct SwsContext *c,
     if (c->src0Alpha && !c->dst0Alpha && isALPHA(c->dstFormat)) {
         uint8_t *base;
         int x,y;
-        rgb0_tmp = av_malloc(FFABS(srcStride[0]) * srcSliceH + 32);
-        if (!rgb0_tmp)
+
+        av_fast_malloc(&c->rgb0_scratch, &c->rgb0_scratch_allocated,
+                       FFABS(srcStride[0]) * srcSliceH + 32);
+        if (!c->rgb0_scratch)
             return AVERROR(ENOMEM);
 
-        base = srcStride[0] < 0 ? rgb0_tmp - srcStride[0] * (srcSliceH-1) : rgb0_tmp;
+        base = srcStride[0] < 0 ? c->rgb0_scratch - srcStride[0] * (srcSliceH-1) :
+                                  c->rgb0_scratch;
         for (y=0; y<srcSliceH; y++){
             memcpy(base + srcStride[0]*y, src2[0] + srcStride[0]*y, 4*c->srcW);
             for (x=c->src0Alpha-1; x<4*c->srcW; x+=4) {
@@ -944,11 +946,14 @@  int attribute_align_arg sws_scale(struct SwsContext *c,
 
     if (c->srcXYZ && !(c->dstXYZ && c->srcW==c->dstW && c->srcH==c->dstH)) {
         uint8_t *base;
-        rgb0_tmp = av_malloc(FFABS(srcStride[0]) * srcSliceH + 32);
-        if (!rgb0_tmp)
+
+        av_fast_malloc(&c->xyz_scratch, &c->xyz_scratch_allocated,
+                       FFABS(srcStride[0]) * srcSliceH + 32);
+        if (!c->xyz_scratch)
             return AVERROR(ENOMEM);
 
-        base = srcStride[0] < 0 ? rgb0_tmp - srcStride[0] * (srcSliceH-1) : rgb0_tmp;
+        base = srcStride[0] < 0 ? c->xyz_scratch - srcStride[0] * (srcSliceH-1) :
+                                  c->xyz_scratch;
 
         xyz12Torgb48(c, (uint16_t*)base, (const uint16_t*)src2[0], srcStride[0]/2, srcSliceH);
         src2[0] = base;
@@ -996,6 +1001,5 @@  int attribute_align_arg sws_scale(struct SwsContext *c,
         rgb48Toxyz12(c, dst16, dst16, dstStride2[0]/2, ret);
     }
 
-    av_free(rgb0_tmp);
     return ret;
 }
diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h
index a1de95cee0..e8a434427b 100644
--- a/libswscale/swscale_internal.h
+++ b/libswscale/swscale_internal.h
@@ -626,6 +626,12 @@  typedef struct SwsContext {
     SwsDither dither;
 
     SwsAlphaBlend alphablend;
+
+    uint8_t     *rgb0_scratch;
+    unsigned int rgb0_scratch_allocated;
+
+    uint8_t     *xyz_scratch;
+    unsigned int xyz_scratch_allocated;
 } SwsContext;
 //FIXME check init (where 0)
 
diff --git a/libswscale/utils.c b/libswscale/utils.c
index 6bac7b658d..d45d7afcbf 100644
--- a/libswscale/utils.c
+++ b/libswscale/utils.c
@@ -2293,6 +2293,9 @@  void sws_freeContext(SwsContext *c)
     av_freep(&c->gamma);
     av_freep(&c->inv_gamma);
 
+    av_freep(&c->rgb0_scratch);
+    av_freep(&c->xyz_scratch);
+
     ff_free_filters(c);
 
     av_free(c);