[FFmpeg-devel] [PATCH 10/11] swscale: add SwsContext parameter to input functions

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Thu Aug 11 00:55:31 EEST 2022


Timo Rothenpieler:
> ---
>  libswscale/hscale.c           |  12 +--
>  libswscale/input.c            | 149 ++++++++++++++++++----------------
>  libswscale/swscale_internal.h |  17 ++--
>  libswscale/x86/swscale.c      |  13 +--
>  4 files changed, 106 insertions(+), 85 deletions(-)
> 
> diff --git a/libswscale/hscale.c b/libswscale/hscale.c
> index eca0635338..6789ce7540 100644
> --- a/libswscale/hscale.c
> +++ b/libswscale/hscale.c
> @@ -105,18 +105,18 @@ static int lum_convert(SwsContext *c, SwsFilterDescriptor *desc, int sliceY, int
>          uint8_t * dst = desc->dst->plane[0].line[i];
>  
>          if (c->lumToYV12) {
> -            c->lumToYV12(dst, src[0], src[1], src[2], srcW, pal);
> +            c->lumToYV12(dst, src[0], src[1], src[2], srcW, pal, c->input_opaque);
>          } else if (c->readLumPlanar) {
> -            c->readLumPlanar(dst, src, srcW, c->input_rgb2yuv_table);
> +            c->readLumPlanar(dst, src, srcW, c->input_rgb2yuv_table, c->input_opaque);
>          }
>  
>  
>          if (desc->alpha) {
>              dst = desc->dst->plane[3].line[i];
>              if (c->alpToYV12) {
> -                c->alpToYV12(dst, src[3], src[1], src[2], srcW, pal);
> +                c->alpToYV12(dst, src[3], src[1], src[2], srcW, pal, c->input_opaque);
>              } else if (c->readAlpPlanar) {
> -                c->readAlpPlanar(dst, src, srcW, NULL);
> +                c->readAlpPlanar(dst, src, srcW, NULL, c->input_opaque);
>              }
>          }
>      }
> @@ -224,9 +224,9 @@ static int chr_convert(SwsContext *c, SwsFilterDescriptor *desc, int sliceY, int
>          uint8_t * dst1 = desc->dst->plane[1].line[i];
>          uint8_t * dst2 = desc->dst->plane[2].line[i];
>          if (c->chrToYV12) {
> -            c->chrToYV12(dst1, dst2, src[0], src[1], src[2], srcW, pal);
> +            c->chrToYV12(dst1, dst2, src[0], src[1], src[2], srcW, pal, c->input_opaque);
>          } else if (c->readChrPlanar) {
> -            c->readChrPlanar(dst1, dst2, src, srcW, c->input_rgb2yuv_table);
> +            c->readChrPlanar(dst1, dst2, src, srcW, c->input_rgb2yuv_table, c->input_opaque);
>          }
>      }
>      return sliceH;
> diff --git a/libswscale/input.c b/libswscale/input.c
> index 68abc4d62c..36ef1e43ac 100644
> --- a/libswscale/input.c
> +++ b/libswscale/input.c
> @@ -88,7 +88,7 @@ rgb64ToUV_half_c_template(uint16_t *dstU, uint16_t *dstV,
>  
>  #define rgb64funcs(pattern, BE_LE, origin) \
>  static void pattern ## 64 ## BE_LE ## ToY_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused0, const uint8_t *unused1,\
> -                                    int width, uint32_t *rgb2yuv) \
> +                                    int width, uint32_t *rgb2yuv, void *opq) \
>  { \
>      const uint16_t *src = (const uint16_t *) _src; \
>      uint16_t *dst = (uint16_t *) _dst; \
> @@ -97,7 +97,7 @@ static void pattern ## 64 ## BE_LE ## ToY_c(uint8_t *_dst, const uint8_t *_src,
>   \
>  static void pattern ## 64 ## BE_LE ## ToUV_c(uint8_t *_dstU, uint8_t *_dstV, \
>                                      const uint8_t *unused0, const uint8_t *_src1, const uint8_t *_src2, \
> -                                    int width, uint32_t *rgb2yuv) \
> +                                    int width, uint32_t *rgb2yuv, void *opq) \
>  { \
>      const uint16_t *src1 = (const uint16_t *) _src1, \
>                     *src2 = (const uint16_t *) _src2; \
> @@ -107,7 +107,7 @@ static void pattern ## 64 ## BE_LE ## ToUV_c(uint8_t *_dstU, uint8_t *_dstV, \
>   \
>  static void pattern ## 64 ## BE_LE ## ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, \
>                                      const uint8_t *unused0, const uint8_t *_src1, const uint8_t *_src2, \
> -                                    int width, uint32_t *rgb2yuv) \
> +                                    int width, uint32_t *rgb2yuv, void *opq) \
>  { \
>      const uint16_t *src1 = (const uint16_t *) _src1, \
>                     *src2 = (const uint16_t *) _src2; \
> @@ -192,7 +192,8 @@ static void pattern ## 48 ## BE_LE ## ToY_c(uint8_t *_dst,              \
>                                              const uint8_t *_src,        \
>                                              const uint8_t *unused0, const uint8_t *unused1,\
>                                              int width,                  \
> -                                            uint32_t *rgb2yuv)          \
> +                                            uint32_t *rgb2yuv,          \
> +                                            void *opq)                  \
>  {                                                                       \
>      const uint16_t *src = (const uint16_t *)_src;                       \
>      uint16_t *dst       = (uint16_t *)_dst;                             \
> @@ -205,7 +206,8 @@ static void pattern ## 48 ## BE_LE ## ToUV_c(uint8_t *_dstU,            \
>                                               const uint8_t *_src1,      \
>                                               const uint8_t *_src2,      \
>                                               int width,                 \
> -                                             uint32_t *rgb2yuv)         \
> +                                             uint32_t *rgb2yuv,         \
> +                                             void *opq)                 \
>  {                                                                       \
>      const uint16_t *src1 = (const uint16_t *)_src1,                     \
>                     *src2 = (const uint16_t *)_src2;                     \
> @@ -220,7 +222,8 @@ static void pattern ## 48 ## BE_LE ## ToUV_half_c(uint8_t *_dstU,       \
>                                                    const uint8_t *_src1, \
>                                                    const uint8_t *_src2, \
>                                                    int width,            \
> -                                                  uint32_t *rgb2yuv)    \
> +                                                  uint32_t *rgb2yuv,    \
> +                                                  void *opq)            \
>  {                                                                       \
>      const uint16_t *src1 = (const uint16_t *)_src1,                     \
>                     *src2 = (const uint16_t *)_src2;                     \
> @@ -345,7 +348,7 @@ static av_always_inline void rgb16_32ToUV_half_c_template(int16_t *dstU,
>  #define rgb16_32_wrapper(fmt, name, shr, shg, shb, shp, maskr,          \
>                           maskg, maskb, rsh, gsh, bsh, S)                \
>  static void name ## ToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2,            \
> -                          int width, uint32_t *tab)                     \
> +                          int width, uint32_t *tab, void *opq)          \
>  {                                                                       \
>      rgb16_32ToY_c_template((int16_t*)dst, src, width, fmt, shr, shg, shb, shp,    \
>                             maskr, maskg, maskb, rsh, gsh, bsh, S, tab); \
> @@ -353,7 +356,7 @@ static void name ## ToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unuse
>                                                                          \
>  static void name ## ToUV_c(uint8_t *dstU, uint8_t *dstV,                \
>                             const uint8_t *unused0, const uint8_t *src, const uint8_t *dummy,    \
> -                           int width, uint32_t *tab)                    \
> +                           int width, uint32_t *tab, void *opq)         \
>  {                                                                       \
>      rgb16_32ToUV_c_template((int16_t*)dstU, (int16_t*)dstV, src, width, fmt,                \
>                              shr, shg, shb, shp,                         \
> @@ -363,7 +366,7 @@ static void name ## ToUV_c(uint8_t *dstU, uint8_t *dstV,                \
>  static void name ## ToUV_half_c(uint8_t *dstU, uint8_t *dstV,           \
>                                  const uint8_t *unused0, const uint8_t *src,                     \
>                                  const uint8_t *dummy,                   \
> -                                int width, uint32_t *tab)               \
> +                                int width, uint32_t *tab, void *opq)    \
>  {                                                                       \
>      rgb16_32ToUV_half_c_template((int16_t*)dstU, (int16_t*)dstV, src, width, fmt,           \
>                                   shr, shg, shb, shp,                    \
> @@ -392,7 +395,7 @@ rgb16_32_wrapper(AV_PIX_FMT_X2BGR10LE, bgr30le, 0, 6, 16, 0, 0x3FF, 0xFFC00, 0x3
>  
>  static void gbr24pToUV_half_c(uint8_t *_dstU, uint8_t *_dstV,
>                           const uint8_t *gsrc, const uint8_t *bsrc, const uint8_t *rsrc,
> -                         int width, uint32_t *rgb2yuv)
> +                         int width, uint32_t *rgb2yuv, void *opq)
>  {
>      uint16_t *dstU = (uint16_t *)_dstU;
>      uint16_t *dstV = (uint16_t *)_dstV;
> @@ -411,7 +414,7 @@ static void gbr24pToUV_half_c(uint8_t *_dstU, uint8_t *_dstV,
>  }
>  
>  static void rgba64leToA_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1,
> -                          const uint8_t *unused2, int width, uint32_t *unused)
> +                          const uint8_t *unused2, int width, uint32_t *unused, void *opq)
>  {
>      int16_t *dst = (int16_t *)_dst;
>      const uint16_t *src = (const uint16_t *)_src;
> @@ -421,7 +424,7 @@ static void rgba64leToA_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unu
>  }
>  
>  static void rgba64beToA_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1,
> -                          const uint8_t *unused2, int width, uint32_t *unused)
> +                          const uint8_t *unused2, int width, uint32_t *unused, void *opq)
>  {
>      int16_t *dst = (int16_t *)_dst;
>      const uint16_t *src = (const uint16_t *)_src;
> @@ -430,7 +433,8 @@ static void rgba64beToA_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unu
>          dst[i] = AV_RB16(src + 4 * i + 3);
>  }
>  
> -static void abgrToA_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused)
> +static void abgrToA_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1,
> +                      const uint8_t *unused2, int width, uint32_t *unused, void *opq)
>  {
>      int16_t *dst = (int16_t *)_dst;
>      int i;
> @@ -439,7 +443,8 @@ static void abgrToA_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1,
>      }
>  }
>  
> -static void rgbaToA_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused)
> +static void rgbaToA_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1,
> +                      const uint8_t *unused2, int width, uint32_t *unused, void *opq)
>  {
>      int16_t *dst = (int16_t *)_dst;
>      int i;
> @@ -448,7 +453,8 @@ static void rgbaToA_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1,
>      }
>  }
>  
> -static void palToA_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *pal)
> +static void palToA_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1,
> +                     const uint8_t *unused2, int width, uint32_t *pal, void *opq)
>  {
>      int16_t *dst = (int16_t *)_dst;
>      int i;
> @@ -459,7 +465,8 @@ static void palToA_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1,
>      }
>  }
>  
> -static void palToY_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *pal)
> +static void palToY_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1,
> +                     const uint8_t *unused2, int width, uint32_t *pal, void *opq)
>  {
>      int16_t *dst = (int16_t *)_dst;
>      int i;
> @@ -471,8 +478,8 @@ static void palToY_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1,
>  }
>  
>  static void palToUV_c(uint8_t *_dstU, uint8_t *_dstV,
> -                           const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
> -                      int width, uint32_t *pal)
> +                      const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
> +                      int width, uint32_t *pal, void *opq)
>  {
>      uint16_t *dstU = (uint16_t *)_dstU;
>      int16_t *dstV = (int16_t *)_dstV;
> @@ -486,7 +493,8 @@ static void palToUV_c(uint8_t *_dstU, uint8_t *_dstV,
>      }
>  }
>  
> -static void monowhite2Y_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2,  int width, uint32_t *unused)
> +static void monowhite2Y_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1,
> +                          const uint8_t *unused2,  int width, uint32_t *unused, void *opq)
>  {
>      int16_t *dst = (int16_t *)_dst;
>      int i, j;
> @@ -503,7 +511,8 @@ static void monowhite2Y_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unus
>      }
>  }
>  
> -static void monoblack2Y_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2,  int width, uint32_t *unused)
> +static void monoblack2Y_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1,
> +                          const uint8_t *unused2,  int width, uint32_t *unused, void *opq)
>  {
>      int16_t *dst = (int16_t *)_dst;
>      int i, j;
> @@ -520,8 +529,8 @@ static void monoblack2Y_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unus
>      }
>  }
>  
> -static void yuy2ToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2,  int width,
> -                      uint32_t *unused)
> +static void yuy2ToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
> +                      uint32_t *unused, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++)
> @@ -529,7 +538,7 @@ static void yuy2ToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1,
>  }
>  
>  static void yuy2ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src1,
> -                       const uint8_t *src2, int width, uint32_t *unused)
> +                       const uint8_t *src2, int width, uint32_t *unused, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++) {
> @@ -540,7 +549,7 @@ static void yuy2ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, con
>  }
>  
>  static void yvy2ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src1,
> -                       const uint8_t *src2, int width, uint32_t *unused)
> +                       const uint8_t *src2, int width, uint32_t *unused, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++) {
> @@ -551,7 +560,7 @@ static void yvy2ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, con
>  }
>  
>  static void y210le_UV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src,
> -                        const uint8_t *unused1, int width, uint32_t *unused2)
> +                        const uint8_t *unused1, int width, uint32_t *unused2, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++) {
> @@ -561,7 +570,7 @@ static void y210le_UV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, co
>  }
>  
>  static void y210le_Y_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused0,
> -                       const uint8_t *unused1, int width, uint32_t *unused2)
> +                       const uint8_t *unused1, int width, uint32_t *unused2, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++)
> @@ -569,7 +578,7 @@ static void y210le_Y_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused0,
>  }
>  
>  static void bswap16Y_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1, const uint8_t *unused2, int width,
> -                       uint32_t *unused)
> +                       uint32_t *unused, void *opq)
>  {
>      int i;
>      const uint16_t *src = (const uint16_t *)_src;
> @@ -579,7 +588,7 @@ static void bswap16Y_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused
>  }
>  
>  static void bswap16UV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *_src1,
> -                        const uint8_t *_src2, int width, uint32_t *unused)
> +                        const uint8_t *_src2, int width, uint32_t *unused, void *opq)
>  {
>      int i;
>      const uint16_t *src1 = (const uint16_t *)_src1,
> @@ -592,7 +601,7 @@ static void bswap16UV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0,
>  }
>  
>  static void read_ya16le_gray_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
> -                               uint32_t *unused)
> +                               uint32_t *unused, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++)
> @@ -600,7 +609,7 @@ static void read_ya16le_gray_c(uint8_t *dst, const uint8_t *src, const uint8_t *
>  }
>  
>  static void read_ya16le_alpha_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
> -                                uint32_t *unused)
> +                                uint32_t *unused, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++)
> @@ -608,7 +617,7 @@ static void read_ya16le_alpha_c(uint8_t *dst, const uint8_t *src, const uint8_t
>  }
>  
>  static void read_ya16be_gray_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
> -                               uint32_t *unused)
> +                               uint32_t *unused, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++)
> @@ -616,7 +625,7 @@ static void read_ya16be_gray_c(uint8_t *dst, const uint8_t *src, const uint8_t *
>  }
>  
>  static void read_ya16be_alpha_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
> -                                uint32_t *unused)
> +                                uint32_t *unused, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++)
> @@ -624,7 +633,7 @@ static void read_ya16be_alpha_c(uint8_t *dst, const uint8_t *src, const uint8_t
>  }
>  
>  static void read_ayuv64le_Y_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused0, const uint8_t *unused1, int width,
> -                               uint32_t *unused2)
> +                               uint32_t *unused2, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++)
> @@ -633,7 +642,7 @@ static void read_ayuv64le_Y_c(uint8_t *dst, const uint8_t *src, const uint8_t *u
>  
>  
>  static void read_ayuv64le_UV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src,
> -                               const uint8_t *unused1, int width, uint32_t *unused2)
> +                               const uint8_t *unused1, int width, uint32_t *unused2, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++) {
> @@ -643,7 +652,7 @@ static void read_ayuv64le_UV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unus
>  }
>  
>  static void read_ayuv64le_A_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused0, const uint8_t *unused1, int width,
> -                                uint32_t *unused2)
> +                              uint32_t *unused2, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++)
> @@ -651,7 +660,7 @@ static void read_ayuv64le_A_c(uint8_t *dst, const uint8_t *src, const uint8_t *u
>  }
>  
>  static void read_vuya_UV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src,
> -                           const uint8_t *unused1, int width, uint32_t *unused2)
> +                           const uint8_t *unused1, int width, uint32_t *unused2, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++) {
> @@ -661,7 +670,7 @@ static void read_vuya_UV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0,
>  }
>  
>  static void read_vuya_Y_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused0, const uint8_t *unused1, int width,
> -                          uint32_t *unused2)
> +                          uint32_t *unused2, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++)
> @@ -669,7 +678,7 @@ static void read_vuya_Y_c(uint8_t *dst, const uint8_t *src, const uint8_t *unuse
>  }
>  
>  static void read_vuya_A_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused0, const uint8_t *unused1, int width,
> -                          uint32_t *unused2)
> +                          uint32_t *unused2, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++)
> @@ -679,7 +688,7 @@ static void read_vuya_A_c(uint8_t *dst, const uint8_t *src, const uint8_t *unuse
>  /* This is almost identical to the previous, end exists only because
>   * yuy2ToY/UV)(dst, src + 1, ...) would have 100% unaligned accesses. */
>  static void uyvyToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2,  int width,
> -                      uint32_t *unused)
> +                      uint32_t *unused, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++)
> @@ -687,7 +696,7 @@ static void uyvyToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1,
>  }
>  
>  static void uyvyToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src1,
> -                       const uint8_t *src2, int width, uint32_t *unused)
> +                       const uint8_t *src2, int width, uint32_t *unused, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++) {
> @@ -709,20 +718,20 @@ static av_always_inline void nvXXtoUV_c(uint8_t *dst1, uint8_t *dst2,
>  
>  static void nv12ToUV_c(uint8_t *dstU, uint8_t *dstV,
>                         const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
> -                       int width, uint32_t *unused)
> +                       int width, uint32_t *unused, void *opq)
>  {
>      nvXXtoUV_c(dstU, dstV, src1, width);
>  }
>  
>  static void nv21ToUV_c(uint8_t *dstU, uint8_t *dstV,
>                         const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
> -                       int width, uint32_t *unused)
> +                       int width, uint32_t *unused, void *opq)
>  {
>      nvXXtoUV_c(dstV, dstU, src1, width);
>  }
>  
>  static void p010LEToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1,
> -                        const uint8_t *unused2, int width, uint32_t *unused)
> +                        const uint8_t *unused2, int width, uint32_t *unused, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++) {
> @@ -731,7 +740,7 @@ static void p010LEToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1
>  }
>  
>  static void p010BEToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1,
> -                        const uint8_t *unused2, int width, uint32_t *unused)
> +                        const uint8_t *unused2, int width, uint32_t *unused, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++) {
> @@ -741,7 +750,7 @@ static void p010BEToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1
>  
>  static void p010LEToUV_c(uint8_t *dstU, uint8_t *dstV,
>                         const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
> -                       int width, uint32_t *unused)
> +                       int width, uint32_t *unused, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++) {
> @@ -751,8 +760,8 @@ static void p010LEToUV_c(uint8_t *dstU, uint8_t *dstV,
>  }
>  
>  static void p010BEToUV_c(uint8_t *dstU, uint8_t *dstV,
> -                       const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
> -                       int width, uint32_t *unused)
> +                         const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
> +                         int width, uint32_t *unused, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++) {
> @@ -762,8 +771,8 @@ static void p010BEToUV_c(uint8_t *dstU, uint8_t *dstV,
>  }
>  
>  static void p016LEToUV_c(uint8_t *dstU, uint8_t *dstV,
> -                       const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
> -                       int width, uint32_t *unused)
> +                         const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
> +                         int width, uint32_t *unused, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++) {
> @@ -773,8 +782,8 @@ static void p016LEToUV_c(uint8_t *dstU, uint8_t *dstV,
>  }
>  
>  static void p016BEToUV_c(uint8_t *dstU, uint8_t *dstV,
> -                       const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
> -                       int width, uint32_t *unused)
> +                         const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
> +                         int width, uint32_t *unused, void *opq)
>  {
>      int i;
>      for (i = 0; i < width; i++) {
> @@ -786,7 +795,7 @@ static void p016BEToUV_c(uint8_t *dstU, uint8_t *dstV,
>  #define input_pixel(pos) (isBE(origin) ? AV_RB16(pos) : AV_RL16(pos))
>  
>  static void bgr24ToY_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2,
> -                       int width, uint32_t *rgb2yuv)
> +                       int width, uint32_t *rgb2yuv, void *opq)
>  {
>      int16_t *dst = (int16_t *)_dst;
>      int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
> @@ -801,7 +810,7 @@ static void bgr24ToY_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1
>  }
>  
>  static void bgr24ToUV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
> -                        const uint8_t *src2, int width, uint32_t *rgb2yuv)
> +                        const uint8_t *src2, int width, uint32_t *rgb2yuv, void *opq)
>  {
>      int16_t *dstU = (int16_t *)_dstU;
>      int16_t *dstV = (int16_t *)_dstV;
> @@ -820,7 +829,7 @@ static void bgr24ToUV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0,
>  }
>  
>  static void bgr24ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
> -                             const uint8_t *src2, int width, uint32_t *rgb2yuv)
> +                             const uint8_t *src2, int width, uint32_t *rgb2yuv, void *opq)
>  {
>      int16_t *dstU = (int16_t *)_dstU;
>      int16_t *dstV = (int16_t *)_dstV;
> @@ -839,7 +848,7 @@ static void bgr24ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unus
>  }
>  
>  static void rgb24ToY_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
> -                       uint32_t *rgb2yuv)
> +                       uint32_t *rgb2yuv, void *opq)
>  {
>      int16_t *dst = (int16_t *)_dst;
>      int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
> @@ -854,7 +863,7 @@ static void rgb24ToY_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1
>  }
>  
>  static void rgb24ToUV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
> -                        const uint8_t *src2, int width, uint32_t *rgb2yuv)
> +                        const uint8_t *src2, int width, uint32_t *rgb2yuv, void *opq)
>  {
>      int16_t *dstU = (int16_t *)_dstU;
>      int16_t *dstV = (int16_t *)_dstV;
> @@ -873,7 +882,7 @@ static void rgb24ToUV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0,
>  }
>  
>  static void rgb24ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
> -                             const uint8_t *src2, int width, uint32_t *rgb2yuv)
> +                             const uint8_t *src2, int width, uint32_t *rgb2yuv, void *opq)
>  {
>      int16_t *dstU = (int16_t *)_dstU;
>      int16_t *dstV = (int16_t *)_dstV;
> @@ -891,7 +900,7 @@ static void rgb24ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unus
>      }
>  }
>  
> -static void planar_rgb_to_y(uint8_t *_dst, const uint8_t *src[4], int width, int32_t *rgb2yuv)
> +static void planar_rgb_to_y(uint8_t *_dst, const uint8_t *src[4], int width, int32_t *rgb2yuv, void *opq)
>  {
>      uint16_t *dst = (uint16_t *)_dst;
>      int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
> @@ -905,7 +914,7 @@ static void planar_rgb_to_y(uint8_t *_dst, const uint8_t *src[4], int width, int
>      }
>  }
>  
> -static void planar_rgb_to_a(uint8_t *_dst, const uint8_t *src[4], int width, int32_t *unused)
> +static void planar_rgb_to_a(uint8_t *_dst, const uint8_t *src[4], int width, int32_t *unused, void *opq)
>  {
>      uint16_t *dst = (uint16_t *)_dst;
>      int i;
> @@ -913,7 +922,7 @@ static void planar_rgb_to_a(uint8_t *_dst, const uint8_t *src[4], int width, int
>          dst[i] = src[3][i] << 6;
>  }
>  
> -static void planar_rgb_to_uv(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *src[4], int width, int32_t *rgb2yuv)
> +static void planar_rgb_to_uv(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *src[4], int width, int32_t *rgb2yuv, void *opq)
>  {
>      uint16_t *dstU = (uint16_t *)_dstU;
>      uint16_t *dstV = (uint16_t *)_dstV;
> @@ -1049,24 +1058,27 @@ static av_always_inline void grayf32ToY16_c(uint8_t *_dst, const uint8_t *_src,
>  
>  #define rgb9plus_planar_funcs_endian(nbits, endian_name, endian)                                    \
>  static void planar_rgb##nbits##endian_name##_to_y(uint8_t *dst, const uint8_t *src[4],              \
> -                                                  int w, int32_t *rgb2yuv)                          \
> +                                                  int w, int32_t *rgb2yuv, void *opq)               \
>  {                                                                                                   \
>      planar_rgb16_to_y(dst, src, w, nbits, endian, rgb2yuv);                                         \
>  }                                                                                                   \
>  static void planar_rgb##nbits##endian_name##_to_uv(uint8_t *dstU, uint8_t *dstV,                    \
> -                                                   const uint8_t *src[4], int w, int32_t *rgb2yuv)  \
> +                                                   const uint8_t *src[4], int w, int32_t *rgb2yuv,  \
> +                                                   void *opq)                                       \
>  {                                                                                                   \
>      planar_rgb16_to_uv(dstU, dstV, src, w, nbits, endian, rgb2yuv);                                 \
>  }                                                                                                   \
>  
>  #define rgb9plus_planar_transparency_funcs(nbits)                           \
>  static void planar_rgb##nbits##le_to_a(uint8_t *dst, const uint8_t *src[4], \
> -                                       int w, int32_t *rgb2yuv)             \
> +                                       int w, int32_t *rgb2yuv,             \
> +                                       void *opq)                           \
>  {                                                                           \
>      planar_rgb16_to_a(dst, src, w, nbits, 0, rgb2yuv);                      \
>  }                                                                           \
>  static void planar_rgb##nbits##be_to_a(uint8_t *dst, const uint8_t *src[4], \
> -                                       int w, int32_t *rgb2yuv)             \
> +                                       int w, int32_t *rgb2yuv,             \
> +                                       void *opq)                           \
>  {                                                                           \
>      planar_rgb16_to_a(dst, src, w, nbits, 1, rgb2yuv);                      \
>  }
> @@ -1087,23 +1099,24 @@ rgb9plus_planar_transparency_funcs(16)
>  
>  #define rgbf32_planar_funcs_endian(endian_name, endian)                                             \
>  static void planar_rgbf32##endian_name##_to_y(uint8_t *dst, const uint8_t *src[4],                  \
> -                                                  int w, int32_t *rgb2yuv)                          \
> +                                                  int w, int32_t *rgb2yuv, void *opq)               \
>  {                                                                                                   \
>      planar_rgbf32_to_y(dst, src, w, endian, rgb2yuv);                                               \
>  }                                                                                                   \
>  static void planar_rgbf32##endian_name##_to_uv(uint8_t *dstU, uint8_t *dstV,                        \
> -                                                   const uint8_t *src[4], int w, int32_t *rgb2yuv)  \
> +                                               const uint8_t *src[4], int w, int32_t *rgb2yuv,      \
> +                                               void *opq)                                           \
>  {                                                                                                   \
>      planar_rgbf32_to_uv(dstU, dstV, src, w, endian, rgb2yuv);                                       \
>  }                                                                                                   \
>  static void planar_rgbf32##endian_name##_to_a(uint8_t *dst, const uint8_t *src[4],                  \
> -                                              int w, int32_t *rgb2yuv)                              \
> +                                              int w, int32_t *rgb2yuv, void *opq)                   \
>  {                                                                                                   \
>      planar_rgbf32_to_a(dst, src, w, endian, rgb2yuv);                                               \
>  }                                                                                                   \
>  static void grayf32##endian_name##ToY16_c(uint8_t *dst, const uint8_t *src,                         \
>                                            const uint8_t *unused1, const uint8_t *unused2,           \
> -                                          int width, uint32_t *unused)                              \
> +                                          int width, uint32_t *unused, void *opq)                   \
>  {                                                                                                   \
>      grayf32ToY16_c(dst, src, unused1, unused2, width, endian, unused);                              \
>  }
> diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h
> index e118b54457..9ab542933f 100644
> --- a/libswscale/swscale_internal.h
> +++ b/libswscale/swscale_internal.h
> @@ -559,26 +559,31 @@ typedef struct SwsContext {
>      yuv2packedX_fn yuv2packedX;
>      yuv2anyX_fn yuv2anyX;
>  
> +    /// Opaque data pointer passed to all input functions.
> +    void *input_opaque;
> +
>      /// Unscaled conversion of luma plane to YV12 for horizontal scaler.
>      void (*lumToYV12)(uint8_t *dst, const uint8_t *src, const uint8_t *src2, const uint8_t *src3,
> -                      int width, uint32_t *pal);
> +                      int width, uint32_t *pal, void *opq);
>      /// Unscaled conversion of alpha plane to YV12 for horizontal scaler.
>      void (*alpToYV12)(uint8_t *dst, const uint8_t *src, const uint8_t *src2, const uint8_t *src3,
> -                      int width, uint32_t *pal);
> +                      int width, uint32_t *pal, void *opq);
>      /// Unscaled conversion of chroma planes to YV12 for horizontal scaler.
>      void (*chrToYV12)(uint8_t *dstU, uint8_t *dstV,
>                        const uint8_t *src1, const uint8_t *src2, const uint8_t *src3,
> -                      int width, uint32_t *pal);
> +                      int width, uint32_t *pal, void *opq);
>  
>      /**
>       * Functions to read planar input, such as planar RGB, and convert
>       * internally to Y/UV/A.
>       */
>      /** @{ */
> -    void (*readLumPlanar)(uint8_t *dst, const uint8_t *src[4], int width, int32_t *rgb2yuv);
> +    void (*readLumPlanar)(uint8_t *dst, const uint8_t *src[4], int width, int32_t *rgb2yuv,
> +                          void *opq);
>      void (*readChrPlanar)(uint8_t *dstU, uint8_t *dstV, const uint8_t *src[4],
> -                          int width, int32_t *rgb2yuv);
> -    void (*readAlpPlanar)(uint8_t *dst, const uint8_t *src[4], int width, int32_t *rgb2yuv);
> +                          int width, int32_t *rgb2yuv, void *opq);
> +    void (*readAlpPlanar)(uint8_t *dst, const uint8_t *src[4], int width, int32_t *rgb2yuv,
> +                          void *opq);
>      /** @} */
>  
>      /**
> diff --git a/libswscale/x86/swscale.c b/libswscale/x86/swscale.c
> index 628f12137c..270798ba3d 100644
> --- a/libswscale/x86/swscale.c
> +++ b/libswscale/x86/swscale.c
> @@ -299,13 +299,13 @@ VSCALE_FUNCS(avx, avx);
>  #define INPUT_Y_FUNC(fmt, opt) \
>  void ff_ ## fmt ## ToY_  ## opt(uint8_t *dst, const uint8_t *src, \
>                                  const uint8_t *unused1, const uint8_t *unused2, \
> -                                int w, uint32_t *unused)
> +                                int w, uint32_t *unused, void *opq)
>  #define INPUT_UV_FUNC(fmt, opt) \
>  void ff_ ## fmt ## ToUV_ ## opt(uint8_t *dstU, uint8_t *dstV, \
>                                  const uint8_t *unused0, \
>                                  const uint8_t *src1, \
>                                  const uint8_t *src2, \
> -                                int w, uint32_t *unused)
> +                                int w, uint32_t *unused, void *opq)
>  #define INPUT_FUNC(fmt, opt) \
>      INPUT_Y_FUNC(fmt, opt); \
>      INPUT_UV_FUNC(fmt, opt)
> @@ -373,15 +373,18 @@ YUV2GBRP_DECL(avx2);
>  
>  #define INPUT_PLANAR_RGB_Y_FN_DECL(fmt, opt)                               \
>  void ff_planar_##fmt##_to_y_##opt(uint8_t *dst,                            \
> -                           const uint8_t *src[4], int w, int32_t *rgb2yuv)
> +                           const uint8_t *src[4], int w, int32_t *rgb2yuv, \
> +                           void *opq)
>  
>  #define INPUT_PLANAR_RGB_UV_FN_DECL(fmt, opt)                              \
>  void ff_planar_##fmt##_to_uv_##opt(uint8_t *dstU, uint8_t *dstV,           \
> -                           const uint8_t *src[4], int w, int32_t *rgb2yuv)
> +                           const uint8_t *src[4], int w, int32_t *rgb2yuv, \
> +                           void *opq)
>  
>  #define INPUT_PLANAR_RGB_A_FN_DECL(fmt, opt)                               \
>  void ff_planar_##fmt##_to_a_##opt(uint8_t *dst,                            \
> -                           const uint8_t *src[4], int w, int32_t *rgb2yuv)
> +                           const uint8_t *src[4], int w, int32_t *rgb2yuv, \
> +                           void *opq)
>  
>  
>  #define INPUT_PLANAR_RGBXX_A_DECL(fmt, opt) \

Don't you need to update the assembly, too? (Do we support anything x86
where the callee has to clean up the stack?)

- Andreas


More information about the ffmpeg-devel mailing list