Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PATCH] lsws/swscale.h: introduce sws_get_gaussian_vec
@ 2023-08-26 12:23 Stefano Sabatini
  2023-08-26 15:15 ` Andreas Rheinhardt
  2023-08-26 15:15 ` Anton Khirnov
  0 siblings, 2 replies; 18+ messages in thread
From: Stefano Sabatini @ 2023-08-26 12:23 UTC (permalink / raw)
  To: FFmpeg development discussions and patches; +Cc: Stefano Sabatini

Use in place of sws_getGaussianVec.

The new function enable better log handling, and provide better naming
for the variance variable, now named standard_deviation to reflect the
meaning of the parameter.
---
 doc/APIchanges             |  3 +++
 libswscale/swscale.h       | 21 ++++++++++++++++++-
 libswscale/utils.c         | 41 +++++++++++++++++++++++++++++---------
 libswscale/version.h       |  2 +-
 libswscale/version_major.h |  4 ++++
 5 files changed, 60 insertions(+), 11 deletions(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index ad1efe708d..bad2d61027 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -2,6 +2,9 @@ The last version increases of all libraries were on 2023-02-09
 
 API changes, most recent first:
 
+2023-08-26 - xxxxxxxxxx - lsws 7.4.100 - swscale.h
+  Introduce sws_get_gaussian_vec, use in place of sws_getGaussianVec.
+
 2023-08-18 - xxxxxxxxxx - lavu 58.17.100 - channel_layout.h
   All AV_CHANNEL_LAYOUT_* macros are now compatible with C++ 17 and older.
 
diff --git a/libswscale/swscale.h b/libswscale/swscale.h
index 9d4612aaf3..f002b5c7d2 100644
--- a/libswscale/swscale.h
+++ b/libswscale/swscale.h
@@ -355,11 +355,30 @@ int sws_getColorspaceDetails(struct SwsContext *c, int **inv_table,
  */
 SwsVector *sws_allocVec(int length);
 
+#if FF_API_SWS_GET_GAUSSIAN_VEC
 /**
- * Return a normalized Gaussian curve used to filter stuff
+ * Return a normalized Gaussian curve used to filter stuff.
+ *
  * quality = 3 is high quality, lower is lower quality.
  */
 SwsVector *sws_getGaussianVec(double variance, double quality);
+#endif
+
+/**
+ * Compute and return a normalized Gaussian vector.
+ *
+ * @param vecp: pointer where the computed vector is put in case of
+ *        success
+ * @param standard_deviation the standard deviation used to generate
+ *        the Gaussian vector, must be a non-negative value
+ * @param quality the quality of the generated Gaussian vector, must
+ *        be a non-negative value. It affects the lenght of the generated
+ *        vector. A value equal to 3 corresponds to high quality.
+ *
+ * @return a negative error code on error, non negative otherwise
+ */
+int sws_get_gaussian_vec(SwsVector **vecp,
+                         double standard_deviation, double quality);
 
 /**
  * Scale all the coefficients of a by the scalar value.
diff --git a/libswscale/utils.c b/libswscale/utils.c
index 8e74c6603e..96034af1e0 100644
--- a/libswscale/utils.c
+++ b/libswscale/utils.c
@@ -2139,31 +2139,54 @@ SwsVector *sws_allocVec(int length)
     return vec;
 }
 
-SwsVector *sws_getGaussianVec(double variance, double quality)
+int sws_get_gaussian_vec(SwsVector **vecp,
+                         double standard_deviation, double quality)
 {
-    const int length = (int)(variance * quality + 0.5) | 1;
+    const int length = (int)(standard_deviation * quality + 0.5) | 1;
     int i;
     double middle  = (length - 1) * 0.5;
     SwsVector *vec;
+    const double variance = standard_deviation * standard_deviation;
 
-    if(variance < 0 || quality < 0)
-        return NULL;
+    if (standard_deviation < 0 || quality < 0) {
+        av_log(NULL, AV_LOG_ERROR,
+               "Invalid negative standard deviation %f or quality %f provided as input to the sws_get_gaussian_vec function\n",
+               standard_deviation, quality);
+        return AVERROR(EINVAL);
+    }
 
     vec = sws_allocVec(length);
-
-    if (!vec)
-        return NULL;
+    if (!vec) {
+        av_log(NULL, AV_LOG_ERROR,
+               "Could not allocate vector for the sws_get_gaussian_vec function\n");
+        return AVERROR(ENOMEM);
+    }
 
     for (i = 0; i < length; i++) {
         double dist = i - middle;
-        vec->coeff[i] = exp(-dist * dist / (2 * variance * variance)) /
-                        sqrt(2 * variance * M_PI);
+        vec->coeff[i] = exp(-dist * dist / (2 * variance)) /
+                        sqrt(2 * standard_deviation * M_PI);
     }
 
     sws_normalizeVec(vec, 1.0);
+    *vecp = vec;
 
+    return 0;
+}
+
+#if FF_API_SWS_GET_GAUSSIAN_VEC
+SwsVector *sws_getGaussianVec(double variance, double quality)
+{
+    SwsVector *vec;
+    int ret;
+
+    ret = sws_get_gaussian_vec(&vec, variance, quality);
+    if (ret < 0) {
+        return NULL;
+    }
     return vec;
 }
+#endif // FF_API_SWS_GET_GAUSSIAN_VEC
 
 /**
  * Allocate and return a vector with length coefficients, all
diff --git a/libswscale/version.h b/libswscale/version.h
index 51eb013a29..12412bd538 100644
--- a/libswscale/version.h
+++ b/libswscale/version.h
@@ -28,7 +28,7 @@
 
 #include "version_major.h"
 
-#define LIBSWSCALE_VERSION_MINOR   3
+#define LIBSWSCALE_VERSION_MINOR   4
 #define LIBSWSCALE_VERSION_MICRO 100
 
 #define LIBSWSCALE_VERSION_INT  AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \
diff --git a/libswscale/version_major.h b/libswscale/version_major.h
index 88577a2b42..aa0baef7c6 100644
--- a/libswscale/version_major.h
+++ b/libswscale/version_major.h
@@ -32,4 +32,8 @@
  * the public API and may change, break or disappear at any time.
  */
 
+#ifndef FF_API_SWS_GET_GAUSSIAN_VEC
+#define FF_API_SWS_GET_GAUSSIAN_VEC       (LIBSWSCALE_VERSION_MAJOR < 8)
+#endif
+
 #endif /* SWSCALE_VERSION_MAJOR_H */
-- 
2.34.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [FFmpeg-devel] [PATCH] lsws/swscale.h: introduce sws_get_gaussian_vec
  2023-08-26 12:23 [FFmpeg-devel] [PATCH] lsws/swscale.h: introduce sws_get_gaussian_vec Stefano Sabatini
@ 2023-08-26 15:15 ` Andreas Rheinhardt
  2023-08-31 15:32   ` Stefano Sabatini
  2023-08-26 15:15 ` Anton Khirnov
  1 sibling, 1 reply; 18+ messages in thread
From: Andreas Rheinhardt @ 2023-08-26 15:15 UTC (permalink / raw)
  To: ffmpeg-devel

Stefano Sabatini:
> Use in place of sws_getGaussianVec.
> 
> The new function enable better log handling, and provide better naming

Better log handling? Why?

> for the variance variable, now named standard_deviation to reflect the
> meaning of the parameter.
> ---
>  doc/APIchanges             |  3 +++
>  libswscale/swscale.h       | 21 ++++++++++++++++++-
>  libswscale/utils.c         | 41 +++++++++++++++++++++++++++++---------
>  libswscale/version.h       |  2 +-
>  libswscale/version_major.h |  4 ++++
>  5 files changed, 60 insertions(+), 11 deletions(-)
> 
> diff --git a/doc/APIchanges b/doc/APIchanges
> index ad1efe708d..bad2d61027 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -2,6 +2,9 @@ The last version increases of all libraries were on 2023-02-09
>  
>  API changes, most recent first:
>  
> +2023-08-26 - xxxxxxxxxx - lsws 7.4.100 - swscale.h
> +  Introduce sws_get_gaussian_vec, use in place of sws_getGaussianVec.
> +
>  2023-08-18 - xxxxxxxxxx - lavu 58.17.100 - channel_layout.h
>    All AV_CHANNEL_LAYOUT_* macros are now compatible with C++ 17 and older.
>  
> diff --git a/libswscale/swscale.h b/libswscale/swscale.h
> index 9d4612aaf3..f002b5c7d2 100644
> --- a/libswscale/swscale.h
> +++ b/libswscale/swscale.h
> @@ -355,11 +355,30 @@ int sws_getColorspaceDetails(struct SwsContext *c, int **inv_table,
>   */
>  SwsVector *sws_allocVec(int length);
>  
> +#if FF_API_SWS_GET_GAUSSIAN_VEC
>  /**
> - * Return a normalized Gaussian curve used to filter stuff
> + * Return a normalized Gaussian curve used to filter stuff.
> + *
>   * quality = 3 is high quality, lower is lower quality.
>   */
>  SwsVector *sws_getGaussianVec(double variance, double quality);

Missing attribute_deprecated as well as the @deprecated doxygen thing
refering to its replacement.

> +#endif
> +
> +/**
> + * Compute and return a normalized Gaussian vector.
> + *
> + * @param vecp: pointer where the computed vector is put in case of
> + *        success
> + * @param standard_deviation the standard deviation used to generate
> + *        the Gaussian vector, must be a non-negative value
> + * @param quality the quality of the generated Gaussian vector, must
> + *        be a non-negative value. It affects the lenght of the generated
> + *        vector. A value equal to 3 corresponds to high quality.
> + *
> + * @return a negative error code on error, non negative otherwise
> + */
> +int sws_get_gaussian_vec(SwsVector **vecp,
> +                         double standard_deviation, double quality);
>  
>  /**
>   * Scale all the coefficients of a by the scalar value.
> diff --git a/libswscale/utils.c b/libswscale/utils.c
> index 8e74c6603e..96034af1e0 100644
> --- a/libswscale/utils.c
> +++ b/libswscale/utils.c
> @@ -2139,31 +2139,54 @@ SwsVector *sws_allocVec(int length)
>      return vec;
>  }
>  
> -SwsVector *sws_getGaussianVec(double variance, double quality)
> +int sws_get_gaussian_vec(SwsVector **vecp,
> +                         double standard_deviation, double quality)
>  {
> -    const int length = (int)(variance * quality + 0.5) | 1;
> +    const int length = (int)(standard_deviation * quality + 0.5) | 1;
>      int i;
>      double middle  = (length - 1) * 0.5;
>      SwsVector *vec;
> +    const double variance = standard_deviation * standard_deviation;
>  
> -    if(variance < 0 || quality < 0)
> -        return NULL;
> +    if (standard_deviation < 0 || quality < 0) {
> +        av_log(NULL, AV_LOG_ERROR,
> +               "Invalid negative standard deviation %f or quality %f provided as input to the sws_get_gaussian_vec function\n",
> +               standard_deviation, quality);
> +        return AVERROR(EINVAL);
> +    }
>  
>      vec = sws_allocVec(length);
> -
> -    if (!vec)
> -        return NULL;
> +    if (!vec) {
> +        av_log(NULL, AV_LOG_ERROR,
> +               "Could not allocate vector for the sws_get_gaussian_vec function\n");
> +        return AVERROR(ENOMEM);
> +    }
>  
>      for (i = 0; i < length; i++) {
>          double dist = i - middle;
> -        vec->coeff[i] = exp(-dist * dist / (2 * variance * variance)) /
> -                        sqrt(2 * variance * M_PI);
> +        vec->coeff[i] = exp(-dist * dist / (2 * variance)) /
> +                        sqrt(2 * standard_deviation * M_PI);
>      }
>  
>      sws_normalizeVec(vec, 1.0);
> +    *vecp = vec;
>  
> +    return 0;
> +}
> +
> +#if FF_API_SWS_GET_GAUSSIAN_VEC
> +SwsVector *sws_getGaussianVec(double variance, double quality)
> +{
> +    SwsVector *vec;
> +    int ret;
> +
> +    ret = sws_get_gaussian_vec(&vec, variance, quality);
> +    if (ret < 0) {
> +        return NULL;
> +    }
>      return vec;
>  }
> +#endif // FF_API_SWS_GET_GAUSSIAN_VEC
>  
>  /**
>   * Allocate and return a vector with length coefficients, all
> diff --git a/libswscale/version.h b/libswscale/version.h
> index 51eb013a29..12412bd538 100644
> --- a/libswscale/version.h
> +++ b/libswscale/version.h
> @@ -28,7 +28,7 @@
>  
>  #include "version_major.h"
>  
> -#define LIBSWSCALE_VERSION_MINOR   3
> +#define LIBSWSCALE_VERSION_MINOR   4
>  #define LIBSWSCALE_VERSION_MICRO 100
>  
>  #define LIBSWSCALE_VERSION_INT  AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \
> diff --git a/libswscale/version_major.h b/libswscale/version_major.h
> index 88577a2b42..aa0baef7c6 100644
> --- a/libswscale/version_major.h
> +++ b/libswscale/version_major.h
> @@ -32,4 +32,8 @@
>   * the public API and may change, break or disappear at any time.
>   */
>  
> +#ifndef FF_API_SWS_GET_GAUSSIAN_VEC
> +#define FF_API_SWS_GET_GAUSSIAN_VEC       (LIBSWSCALE_VERSION_MAJOR < 8)
> +#endif
> +
>  #endif /* SWSCALE_VERSION_MAJOR_H */

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [FFmpeg-devel] [PATCH] lsws/swscale.h: introduce sws_get_gaussian_vec
  2023-08-26 12:23 [FFmpeg-devel] [PATCH] lsws/swscale.h: introduce sws_get_gaussian_vec Stefano Sabatini
  2023-08-26 15:15 ` Andreas Rheinhardt
@ 2023-08-26 15:15 ` Anton Khirnov
  2023-08-31 15:06   ` Stefano Sabatini
  1 sibling, 1 reply; 18+ messages in thread
From: Anton Khirnov @ 2023-08-26 15:15 UTC (permalink / raw)
  To: FFmpeg development discussions and patches; +Cc: Stefano Sabatini

Quoting Stefano Sabatini (2023-08-26 14:23:28)
> Use in place of sws_getGaussianVec.
> 
> The new function enable better log handling, and provide better naming
> for the variance variable, now named standard_deviation to reflect the
> meaning of the parameter.

Logging to NULL does not seem like an improvement to me.

Renaming a function parameter does not require an API break.

-- 
Anton Khirnov
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [FFmpeg-devel] [PATCH] lsws/swscale.h: introduce sws_get_gaussian_vec
  2023-08-26 15:15 ` Anton Khirnov
@ 2023-08-31 15:06   ` Stefano Sabatini
  2023-09-01 15:50     ` Anton Khirnov
  0 siblings, 1 reply; 18+ messages in thread
From: Stefano Sabatini @ 2023-08-31 15:06 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

On date Saturday 2023-08-26 17:15:36 +0200, Anton Khirnov wrote:
> Quoting Stefano Sabatini (2023-08-26 14:23:28)
> > Use in place of sws_getGaussianVec.
> > 
> > The new function enable better log handling, and provide better naming
> > for the variance variable, now named standard_deviation to reflect the
> > meaning of the parameter.
> 

> Logging to NULL does not seem like an improvement to me.

Adding the log_ctx.

> Renaming a function parameter does not require an API break.

The main point was improving the naming of the variable, but while at
it I'm also adding the logging context and providing a return code to
specify an error failure, and moving to snake_case convention which is
the one used by the new API additions.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [FFmpeg-devel] [PATCH] lsws/swscale.h: introduce sws_get_gaussian_vec
  2023-08-26 15:15 ` Andreas Rheinhardt
@ 2023-08-31 15:32   ` Stefano Sabatini
  2023-08-31 16:51     ` Andreas Rheinhardt
  0 siblings, 1 reply; 18+ messages in thread
From: Stefano Sabatini @ 2023-08-31 15:32 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

[-- Attachment #1: Type: text/plain, Size: 1985 bytes --]

On date Saturday 2023-08-26 17:15:27 +0200, Andreas Rheinhardt wrote:
> Stefano Sabatini:
> > Use in place of sws_getGaussianVec.
> > 
> > The new function enable better log handling, and provide better naming
> 
> Better log handling? Why?
> 
> > for the variance variable, now named standard_deviation to reflect the
> > meaning of the parameter.
> > ---
> >  doc/APIchanges             |  3 +++
> >  libswscale/swscale.h       | 21 ++++++++++++++++++-
> >  libswscale/utils.c         | 41 +++++++++++++++++++++++++++++---------
> >  libswscale/version.h       |  2 +-
> >  libswscale/version_major.h |  4 ++++
> >  5 files changed, 60 insertions(+), 11 deletions(-)
> > 
> > diff --git a/doc/APIchanges b/doc/APIchanges
> > index ad1efe708d..bad2d61027 100644
> > --- a/doc/APIchanges
> > +++ b/doc/APIchanges
> > @@ -2,6 +2,9 @@ The last version increases of all libraries were on 2023-02-09
> >  
> >  API changes, most recent first:
> >  
> > +2023-08-26 - xxxxxxxxxx - lsws 7.4.100 - swscale.h
> > +  Introduce sws_get_gaussian_vec, use in place of sws_getGaussianVec.
> > +
> >  2023-08-18 - xxxxxxxxxx - lavu 58.17.100 - channel_layout.h
> >    All AV_CHANNEL_LAYOUT_* macros are now compatible with C++ 17 and older.
> >  
> > diff --git a/libswscale/swscale.h b/libswscale/swscale.h
> > index 9d4612aaf3..f002b5c7d2 100644
> > --- a/libswscale/swscale.h
> > +++ b/libswscale/swscale.h
> > @@ -355,11 +355,30 @@ int sws_getColorspaceDetails(struct SwsContext *c, int **inv_table,
> >   */
> >  SwsVector *sws_allocVec(int length);
> >  
> > +#if FF_API_SWS_GET_GAUSSIAN_VEC
> >  /**
> > - * Return a normalized Gaussian curve used to filter stuff
> > + * Return a normalized Gaussian curve used to filter stuff.
> > + *
> >   * quality = 3 is high quality, lower is lower quality.
> >   */
> >  SwsVector *sws_getGaussianVec(double variance, double quality);
> 
> Missing attribute_deprecated as well as the @deprecated doxygen thing
> refering to its replacement.

Updated.

[-- Attachment #2: 0001-lsws-swscale.h-introduce-sws_get_gaussian_vec.patch --]
[-- Type: text/x-diff, Size: 5673 bytes --]

From 49efd5c9d711ba605bd19be67adc425dc52aeeb1 Mon Sep 17 00:00:00 2001
From: Stefano Sabatini <stefasab@gmail.com>
Date: Sat, 26 Aug 2023 14:20:35 +0200
Subject: [PATCH 1/4] lsws/swscale.h: introduce sws_get_gaussian_vec

Use in place of sws_getGaussianVec.

The new function enable better error handling, and provide better naming
for the variance variable, now named standard_deviation to reflect the
meaning of the parameter.
---
 doc/APIchanges             |  3 +++
 libswscale/swscale.h       | 25 ++++++++++++++++++++++-
 libswscale/utils.c         | 42 ++++++++++++++++++++++++++++++--------
 libswscale/version.h       |  2 +-
 libswscale/version_major.h |  4 ++++
 5 files changed, 65 insertions(+), 11 deletions(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index ad1efe708d..bad2d61027 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -2,6 +2,9 @@ The last version increases of all libraries were on 2023-02-09
 
 API changes, most recent first:
 
+2023-08-26 - xxxxxxxxxx - lsws 7.4.100 - swscale.h
+  Introduce sws_get_gaussian_vec, use in place of sws_getGaussianVec.
+
 2023-08-18 - xxxxxxxxxx - lavu 58.17.100 - channel_layout.h
   All AV_CHANNEL_LAYOUT_* macros are now compatible with C++ 17 and older.
 
diff --git a/libswscale/swscale.h b/libswscale/swscale.h
index 9d4612aaf3..febcb97bfd 100644
--- a/libswscale/swscale.h
+++ b/libswscale/swscale.h
@@ -355,11 +355,34 @@ int sws_getColorspaceDetails(struct SwsContext *c, int **inv_table,
  */
 SwsVector *sws_allocVec(int length);
 
+#if FF_API_SWS_GET_GAUSSIAN_VEC
 /**
- * Return a normalized Gaussian curve used to filter stuff
+ * Return a normalized Gaussian curve used to filter stuff.
+ *
  * quality = 3 is high quality, lower is lower quality.
+ * @deprecated use sws_get_gaussian_vector()
  */
+attribute_deprecated
 SwsVector *sws_getGaussianVec(double variance, double quality);
+#endif
+
+/**
+ * Compute and return a normalized Gaussian vector.
+ *
+ * @param vecp: pointer where the computed vector is put in case of
+ *        success
+ * @param log_ctx context used for logging, can be NULL
+ * @param standard_deviation the standard deviation used to generate
+ *        the Gaussian vector, must be a non-negative value
+ * @param quality the quality of the generated Gaussian vector, must
+ *        be a non-negative value. It affects the lenght of the generated
+ *        vector. A value equal to 3 corresponds to high quality.
+ *
+ * @return a negative error code on error, non negative otherwise
+ */
+int sws_get_gaussian_vec(SwsVector **vecp,
+                         AVClass *log_ctx,
+                         double standard_deviation, double quality);
 
 /**
  * Scale all the coefficients of a by the scalar value.
diff --git a/libswscale/utils.c b/libswscale/utils.c
index 8e74c6603e..e56df87d9f 100644
--- a/libswscale/utils.c
+++ b/libswscale/utils.c
@@ -2139,31 +2139,55 @@ SwsVector *sws_allocVec(int length)
     return vec;
 }
 
-SwsVector *sws_getGaussianVec(double variance, double quality)
+int sws_get_gaussian_vec(SwsVector **vecp,
+                         AVClass *log_ctx,
+                         double standard_deviation, double quality)
 {
-    const int length = (int)(variance * quality + 0.5) | 1;
+    const int length = (int)(standard_deviation * quality + 0.5) | 1;
     int i;
     double middle  = (length - 1) * 0.5;
     SwsVector *vec;
+    const double variance = standard_deviation * standard_deviation;
 
-    if(variance < 0 || quality < 0)
-        return NULL;
+    if (standard_deviation < 0 || quality < 0) {
+        av_log(NULL, AV_LOG_ERROR,
+               "Invalid negative standard deviation %f or quality %f provided as input to the sws_get_gaussian_vec function\n",
+               standard_deviation, quality);
+        return AVERROR(EINVAL);
+    }
 
     vec = sws_allocVec(length);
-
-    if (!vec)
-        return NULL;
+    if (!vec) {
+        av_log(log_ctx, AV_LOG_ERROR,
+               "Could not allocate vector for the sws_get_gaussian_vec function\n");
+        return AVERROR(ENOMEM);
+    }
 
     for (i = 0; i < length; i++) {
         double dist = i - middle;
-        vec->coeff[i] = exp(-dist * dist / (2 * variance * variance)) /
-                        sqrt(2 * variance * M_PI);
+        vec->coeff[i] = exp(-dist * dist / (2 * variance)) /
+                        sqrt(2 * standard_deviation * M_PI);
     }
 
     sws_normalizeVec(vec, 1.0);
+    *vecp = vec;
 
+    return 0;
+}
+
+#if FF_API_SWS_GET_GAUSSIAN_VEC
+SwsVector *sws_getGaussianVec(double variance, double quality)
+{
+    SwsVector *vec;
+    int ret;
+
+    ret = sws_get_gaussian_vec(&vec, NULL, variance, quality);
+    if (ret < 0) {
+        return NULL;
+    }
     return vec;
 }
+#endif // FF_API_SWS_GET_GAUSSIAN_VEC
 
 /**
  * Allocate and return a vector with length coefficients, all
diff --git a/libswscale/version.h b/libswscale/version.h
index 51eb013a29..12412bd538 100644
--- a/libswscale/version.h
+++ b/libswscale/version.h
@@ -28,7 +28,7 @@
 
 #include "version_major.h"
 
-#define LIBSWSCALE_VERSION_MINOR   3
+#define LIBSWSCALE_VERSION_MINOR   4
 #define LIBSWSCALE_VERSION_MICRO 100
 
 #define LIBSWSCALE_VERSION_INT  AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \
diff --git a/libswscale/version_major.h b/libswscale/version_major.h
index 88577a2b42..aa0baef7c6 100644
--- a/libswscale/version_major.h
+++ b/libswscale/version_major.h
@@ -32,4 +32,8 @@
  * the public API and may change, break or disappear at any time.
  */
 
+#ifndef FF_API_SWS_GET_GAUSSIAN_VEC
+#define FF_API_SWS_GET_GAUSSIAN_VEC       (LIBSWSCALE_VERSION_MAJOR < 8)
+#endif
+
 #endif /* SWSCALE_VERSION_MAJOR_H */
-- 
2.34.1


[-- Attachment #3: Type: text/plain, Size: 251 bytes --]

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [FFmpeg-devel] [PATCH] lsws/swscale.h: introduce sws_get_gaussian_vec
  2023-08-31 15:32   ` Stefano Sabatini
@ 2023-08-31 16:51     ` Andreas Rheinhardt
  2023-08-31 17:16       ` Stefano Sabatini
  0 siblings, 1 reply; 18+ messages in thread
From: Andreas Rheinhardt @ 2023-08-31 16:51 UTC (permalink / raw)
  To: ffmpeg-devel

Stefano Sabatini:
> +int sws_get_gaussian_vec(SwsVector **vecp,
> +                         AVClass *log_ctx,
> +                         double standard_deviation, double quality);
>  

Seriously? A pointer to an AVClass as log_ctx? It is actually AVClass**
(the logcontext must have a pointer to an AVClass as its first member),
but we always use NULL.

Apart from that: I am not really convinced that the improvement is worth
the hassle.

> 
> +    if (standard_deviation < 0 || quality < 0) {
> +        av_log(NULL, AV_LOG_ERROR,
> +               "Invalid negative standard deviation %f or quality %f provided as input to the sws_get_gaussian_vec function\n",
> +               standard_deviation, quality);

Here you are not even using the logctx.

- Andreas

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [FFmpeg-devel] [PATCH] lsws/swscale.h: introduce sws_get_gaussian_vec
  2023-08-31 16:51     ` Andreas Rheinhardt
@ 2023-08-31 17:16       ` Stefano Sabatini
  2023-09-01 16:54         ` Michael Niedermayer
  0 siblings, 1 reply; 18+ messages in thread
From: Stefano Sabatini @ 2023-08-31 17:16 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

[-- Attachment #1: Type: text/plain, Size: 716 bytes --]

On date Thursday 2023-08-31 18:51:52 +0200, Andreas Rheinhardt wrote:
> Stefano Sabatini:
> > +int sws_get_gaussian_vec(SwsVector **vecp,
> > +                         AVClass *log_ctx,
> > +                         double standard_deviation, double quality);
> >  
> 
> Seriously? A pointer to an AVClass as log_ctx? It is actually AVClass**
> (the logcontext must have a pointer to an AVClass as its first member),
> but we always use NULL.

Sorry, sloppy editing on my side.

> Apart from that: I am not really convinced that the improvement is worth
> the hassle.

This is not a high-profile function (probably it's never used outside
lavfi) and provides an opportunity to move the API to the correct
direction.

[-- Attachment #2: 0001-lsws-swscale.h-introduce-sws_get_gaussian_vec.patch --]
[-- Type: text/x-diff, Size: 5795 bytes --]

From 69c33f62e15de3d199d54187d38c0856418f0981 Mon Sep 17 00:00:00 2001
From: Stefano Sabatini <stefasab@gmail.com>
Date: Sat, 26 Aug 2023 14:20:35 +0200
Subject: [PATCH 1/2] lsws/swscale.h: introduce sws_get_gaussian_vec

Use in place of sws_getGaussianVec.

The new function enable better error handling, and provide better naming
for the variance variable, now named standard_deviation to reflect the
meaning of the parameter.
---
 doc/APIchanges             |  3 +++
 libswscale/swscale.h       | 27 +++++++++++++++++++++++-
 libswscale/utils.c         | 42 ++++++++++++++++++++++++++++++--------
 libswscale/version.h       |  2 +-
 libswscale/version_major.h |  4 ++++
 5 files changed, 67 insertions(+), 11 deletions(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index ad1efe708d..bad2d61027 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -2,6 +2,9 @@ The last version increases of all libraries were on 2023-02-09
 
 API changes, most recent first:
 
+2023-08-26 - xxxxxxxxxx - lsws 7.4.100 - swscale.h
+  Introduce sws_get_gaussian_vec, use in place of sws_getGaussianVec.
+
 2023-08-18 - xxxxxxxxxx - lavu 58.17.100 - channel_layout.h
   All AV_CHANNEL_LAYOUT_* macros are now compatible with C++ 17 and older.
 
diff --git a/libswscale/swscale.h b/libswscale/swscale.h
index 9d4612aaf3..55f2fc4a48 100644
--- a/libswscale/swscale.h
+++ b/libswscale/swscale.h
@@ -355,11 +355,36 @@ int sws_getColorspaceDetails(struct SwsContext *c, int **inv_table,
  */
 SwsVector *sws_allocVec(int length);
 
+#if FF_API_SWS_GET_GAUSSIAN_VEC
 /**
- * Return a normalized Gaussian curve used to filter stuff
+ * Return a normalized Gaussian curve used to filter stuff.
+ *
  * quality = 3 is high quality, lower is lower quality.
+ * @deprecated use sws_get_gaussian_vector()
  */
+attribute_deprecated
 SwsVector *sws_getGaussianVec(double variance, double quality);
+#endif
+
+/**
+ * Compute and return a normalized Gaussian vector.
+ *
+ * @param vecp: pointer where the computed vector is put in case of
+ *        success
+ * @param standard_deviation the standard deviation used to generate
+ *        the Gaussian vector, must be a non-negative value
+ * @param quality the quality of the generated Gaussian vector, must
+ *        be a non-negative value. It affects the lenght of the generated
+ *        vector. A value equal to 3 corresponds to high quality.
+ * @param log_ctx a pointer to an arbitrary struct of which the first
+ *        field is a pointer to an AVClass struct (used for av_log)
+ *        used for logging, can be NULL
+ *
+ * @return a negative error code on error, non negative otherwise
+ */
+int sws_get_gaussian_vec(SwsVector **vecp,
+                         double standard_deviation, double quality,
+                         void *log_ctx);
 
 /**
  * Scale all the coefficients of a by the scalar value.
diff --git a/libswscale/utils.c b/libswscale/utils.c
index 8e74c6603e..fd9b2d33d0 100644
--- a/libswscale/utils.c
+++ b/libswscale/utils.c
@@ -2139,31 +2139,55 @@ SwsVector *sws_allocVec(int length)
     return vec;
 }
 
-SwsVector *sws_getGaussianVec(double variance, double quality)
+int sws_get_gaussian_vec(SwsVector **vecp,
+                         double standard_deviation, double quality,
+                         void *log_ctx)
 {
-    const int length = (int)(variance * quality + 0.5) | 1;
+    const int length = (int)(standard_deviation * quality + 0.5) | 1;
     int i;
     double middle  = (length - 1) * 0.5;
     SwsVector *vec;
+    const double variance = standard_deviation * standard_deviation;
 
-    if(variance < 0 || quality < 0)
-        return NULL;
+    if (standard_deviation < 0 || quality < 0) {
+        av_log(log_ctx, AV_LOG_ERROR,
+               "Invalid negative standard deviation %f or quality %f provided as input to the sws_get_gaussian_vec function\n",
+               standard_deviation, quality);
+        return AVERROR(EINVAL);
+    }
 
     vec = sws_allocVec(length);
-
-    if (!vec)
-        return NULL;
+    if (!vec) {
+        av_log(log_ctx, AV_LOG_ERROR,
+               "Could not allocate vector for the sws_get_gaussian_vec function\n");
+        return AVERROR(ENOMEM);
+    }
 
     for (i = 0; i < length; i++) {
         double dist = i - middle;
-        vec->coeff[i] = exp(-dist * dist / (2 * variance * variance)) /
-                        sqrt(2 * variance * M_PI);
+        vec->coeff[i] = exp(-dist * dist / (2 * variance)) /
+                        sqrt(2 * standard_deviation * M_PI);
     }
 
     sws_normalizeVec(vec, 1.0);
+    *vecp = vec;
 
+    return 0;
+}
+
+#if FF_API_SWS_GET_GAUSSIAN_VEC
+SwsVector *sws_getGaussianVec(double variance, double quality)
+{
+    SwsVector *vec;
+    int ret;
+
+    ret = sws_get_gaussian_vec(&vec, variance, quality, NULL);
+    if (ret < 0) {
+        return NULL;
+    }
     return vec;
 }
+#endif // FF_API_SWS_GET_GAUSSIAN_VEC
 
 /**
  * Allocate and return a vector with length coefficients, all
diff --git a/libswscale/version.h b/libswscale/version.h
index 51eb013a29..12412bd538 100644
--- a/libswscale/version.h
+++ b/libswscale/version.h
@@ -28,7 +28,7 @@
 
 #include "version_major.h"
 
-#define LIBSWSCALE_VERSION_MINOR   3
+#define LIBSWSCALE_VERSION_MINOR   4
 #define LIBSWSCALE_VERSION_MICRO 100
 
 #define LIBSWSCALE_VERSION_INT  AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \
diff --git a/libswscale/version_major.h b/libswscale/version_major.h
index 88577a2b42..aa0baef7c6 100644
--- a/libswscale/version_major.h
+++ b/libswscale/version_major.h
@@ -32,4 +32,8 @@
  * the public API and may change, break or disappear at any time.
  */
 
+#ifndef FF_API_SWS_GET_GAUSSIAN_VEC
+#define FF_API_SWS_GET_GAUSSIAN_VEC       (LIBSWSCALE_VERSION_MAJOR < 8)
+#endif
+
 #endif /* SWSCALE_VERSION_MAJOR_H */
-- 
2.34.1


[-- Attachment #3: Type: text/plain, Size: 251 bytes --]

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [FFmpeg-devel] [PATCH] lsws/swscale.h: introduce sws_get_gaussian_vec
  2023-08-31 15:06   ` Stefano Sabatini
@ 2023-09-01 15:50     ` Anton Khirnov
  2023-09-01 18:28       ` Stefano Sabatini
  0 siblings, 1 reply; 18+ messages in thread
From: Anton Khirnov @ 2023-09-01 15:50 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

Quoting Stefano Sabatini (2023-08-31 17:06:06)
> On date Saturday 2023-08-26 17:15:36 +0200, Anton Khirnov wrote:
> > Quoting Stefano Sabatini (2023-08-26 14:23:28)
> > > Use in place of sws_getGaussianVec.
> > > 
> > > The new function enable better log handling, and provide better naming
> > > for the variance variable, now named standard_deviation to reflect the
> > > meaning of the parameter.
> > 
> 
> > Logging to NULL does not seem like an improvement to me.
> 
> Adding the log_ctx.
> 
> > Renaming a function parameter does not require an API break.
> 
> The main point was improving the naming of the variable, but while at
> it I'm also adding the logging context and providing a return code to
> specify an error failure, and moving to snake_case convention which is
> the one used by the new API additions.

As I already said above - function parameter names in a prototype are
purely cosmetic and have no effect on anything besides doxygen. You can
change them at will and even remove them entirely without breaking API
or ABI.

The other reasons do not strike me as strong enough to warrant an API
break.

-- 
Anton Khirnov
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [FFmpeg-devel] [PATCH] lsws/swscale.h: introduce sws_get_gaussian_vec
  2023-08-31 17:16       ` Stefano Sabatini
@ 2023-09-01 16:54         ` Michael Niedermayer
  2023-09-01 18:38           ` Stefano Sabatini
  0 siblings, 1 reply; 18+ messages in thread
From: Michael Niedermayer @ 2023-09-01 16:54 UTC (permalink / raw)
  To: FFmpeg development discussions and patches


[-- Attachment #1.1: Type: text/plain, Size: 5369 bytes --]

On Thu, Aug 31, 2023 at 07:16:20PM +0200, Stefano Sabatini wrote:
> On date Thursday 2023-08-31 18:51:52 +0200, Andreas Rheinhardt wrote:
> > Stefano Sabatini:
> > > +int sws_get_gaussian_vec(SwsVector **vecp,
> > > +                         AVClass *log_ctx,
> > > +                         double standard_deviation, double quality);
> > >  
> > 
> > Seriously? A pointer to an AVClass as log_ctx? It is actually AVClass**
> > (the logcontext must have a pointer to an AVClass as its first member),
> > but we always use NULL.
> 
> Sorry, sloppy editing on my side.
> 
> > Apart from that: I am not really convinced that the improvement is worth
> > the hassle.
> 
> This is not a high-profile function (probably it's never used outside
> lavfi) and provides an opportunity to move the API to the correct
> direction.

>  doc/APIchanges             |    3 +++
>  libswscale/swscale.h       |   27 ++++++++++++++++++++++++++-
>  libswscale/utils.c         |   42 +++++++++++++++++++++++++++++++++---------
>  libswscale/version.h       |    2 +-
>  libswscale/version_major.h |    4 ++++
>  5 files changed, 67 insertions(+), 11 deletions(-)
> b91b721cea2752b28a51aaeab2a464b2699dfb49  0001-lsws-swscale.h-introduce-sws_get_gaussian_vec.patch
> From 69c33f62e15de3d199d54187d38c0856418f0981 Mon Sep 17 00:00:00 2001
> From: Stefano Sabatini <stefasab@gmail.com>
> Date: Sat, 26 Aug 2023 14:20:35 +0200
> Subject: [PATCH 1/2] lsws/swscale.h: introduce sws_get_gaussian_vec
> 
> Use in place of sws_getGaussianVec.
> 
> The new function enable better error handling, and provide better naming
> for the variance variable, now named standard_deviation to reflect the
> meaning of the parameter.
> ---
>  doc/APIchanges             |  3 +++
>  libswscale/swscale.h       | 27 +++++++++++++++++++++++-
>  libswscale/utils.c         | 42 ++++++++++++++++++++++++++++++--------
>  libswscale/version.h       |  2 +-
>  libswscale/version_major.h |  4 ++++
>  5 files changed, 67 insertions(+), 11 deletions(-)
> 
> diff --git a/doc/APIchanges b/doc/APIchanges
> index ad1efe708d..bad2d61027 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -2,6 +2,9 @@ The last version increases of all libraries were on 2023-02-09
>  
>  API changes, most recent first:
>  
> +2023-08-26 - xxxxxxxxxx - lsws 7.4.100 - swscale.h
> +  Introduce sws_get_gaussian_vec, use in place of sws_getGaussianVec.
> +
>  2023-08-18 - xxxxxxxxxx - lavu 58.17.100 - channel_layout.h
>    All AV_CHANNEL_LAYOUT_* macros are now compatible with C++ 17 and older.
>  
> diff --git a/libswscale/swscale.h b/libswscale/swscale.h
> index 9d4612aaf3..55f2fc4a48 100644
> --- a/libswscale/swscale.h
> +++ b/libswscale/swscale.h
> @@ -355,11 +355,36 @@ int sws_getColorspaceDetails(struct SwsContext *c, int **inv_table,
>   */
>  SwsVector *sws_allocVec(int length);
>  
> +#if FF_API_SWS_GET_GAUSSIAN_VEC
>  /**
> - * Return a normalized Gaussian curve used to filter stuff
> + * Return a normalized Gaussian curve used to filter stuff.
> + *
>   * quality = 3 is high quality, lower is lower quality.
> + * @deprecated use sws_get_gaussian_vector()
>   */
> +attribute_deprecated
>  SwsVector *sws_getGaussianVec(double variance, double quality);
> +#endif
> +
> +/**
> + * Compute and return a normalized Gaussian vector.
> + *
> + * @param vecp: pointer where the computed vector is put in case of
> + *        success
> + * @param standard_deviation the standard deviation used to generate
> + *        the Gaussian vector, must be a non-negative value
> + * @param quality the quality of the generated Gaussian vector, must
> + *        be a non-negative value. It affects the lenght of the generated
> + *        vector. A value equal to 3 corresponds to high quality.
> + * @param log_ctx a pointer to an arbitrary struct of which the first
> + *        field is a pointer to an AVClass struct (used for av_log)
> + *        used for logging, can be NULL
> + *
> + * @return a negative error code on error, non negative otherwise
> + */
> +int sws_get_gaussian_vec(SwsVector **vecp,
> +                         double standard_deviation, double quality,
> +                         void *log_ctx);

which of the two do you consider better?

First, here the central part we return is the vector

SwsVector *gaus_vec = sws_getGaussianVec(NULL, 1, 2);
SwsVector *temp_vec = sws_ConvolveVec(NULL, in_vec, gaus_vec);
sws_averageVec(temp_vec, temp_vec, in_vec);

av_free(gaus_vec);
return temp_vec; // Error checking here happens by temp_vec being NULL in all cases of error

vs.

Second, here the central part we return is the error code

SwsVector *gaus_vec = NULL;
SwsVector *temp_vec = NULL;
int err = sws_getGaussianVec(&gaus_vec, 1, 2);
if (err<0)
    goto fail;

err = sws_ConvolveVec(&temp_vec, in_vec, gaus_vec);
if (err<0)
    goto fail;

err = sws_averageVec(&temp_vec, temp_vec, in_vec);
if (err<0)
    goto fail;

*ret_argument = temp_vec
return 0;
fail:
    av_free(gaus_vec)
    av_free(temp_vec)
return ret;

thx

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Complexity theory is the science of finding the exact solution to an
approximation. Benchmarking OTOH is finding an approximation of the exact

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

[-- Attachment #2: Type: text/plain, Size: 251 bytes --]

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [FFmpeg-devel] [PATCH] lsws/swscale.h: introduce sws_get_gaussian_vec
  2023-09-01 15:50     ` Anton Khirnov
@ 2023-09-01 18:28       ` Stefano Sabatini
  2023-09-05 11:19         ` Anton Khirnov
  0 siblings, 1 reply; 18+ messages in thread
From: Stefano Sabatini @ 2023-09-01 18:28 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

On date Friday 2023-09-01 17:50:56 +0200, Anton Khirnov wrote:
> Quoting Stefano Sabatini (2023-08-31 17:06:06)
> > On date Saturday 2023-08-26 17:15:36 +0200, Anton Khirnov wrote:
> > > Quoting Stefano Sabatini (2023-08-26 14:23:28)
> > > > Use in place of sws_getGaussianVec.
> > > > 
> > > > The new function enable better log handling, and provide better naming
> > > > for the variance variable, now named standard_deviation to reflect the
> > > > meaning of the parameter.
> > > 
> > 
> > > Logging to NULL does not seem like an improvement to me.
> > 
> > Adding the log_ctx.
> > 
> > > Renaming a function parameter does not require an API break.
> > 
> > The main point was improving the naming of the variable, but while at
> > it I'm also adding the logging context and providing a return code to
> > specify an error failure, and moving to snake_case convention which is
> > the one used by the new API additions.
> 
> As I already said above - function parameter names in a prototype are
> purely cosmetic and have no effect on anything besides doxygen. You can
> change them at will and even remove them entirely without breaking API
> or ABI.
> 

> The other reasons do not strike me as strong enough to warrant an API
> break.

I disagree on this: the function is probably only used internally and
by libavfilter, and the migration is trivial enough so should cause no
disruption anyway.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [FFmpeg-devel] [PATCH] lsws/swscale.h: introduce sws_get_gaussian_vec
  2023-09-01 16:54         ` Michael Niedermayer
@ 2023-09-01 18:38           ` Stefano Sabatini
  2023-09-02 20:07             ` Michael Niedermayer
  0 siblings, 1 reply; 18+ messages in thread
From: Stefano Sabatini @ 2023-09-01 18:38 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

On date Friday 2023-09-01 18:54:40 +0200, Michael Niedermayer wrote:
> On Thu, Aug 31, 2023 at 07:16:20PM +0200, Stefano Sabatini wrote:
[...]
> > +/**
> > + * Compute and return a normalized Gaussian vector.
> > + *
> > + * @param vecp: pointer where the computed vector is put in case of
> > + *        success
> > + * @param standard_deviation the standard deviation used to generate
> > + *        the Gaussian vector, must be a non-negative value
> > + * @param quality the quality of the generated Gaussian vector, must
> > + *        be a non-negative value. It affects the lenght of the generated
> > + *        vector. A value equal to 3 corresponds to high quality.
> > + * @param log_ctx a pointer to an arbitrary struct of which the first
> > + *        field is a pointer to an AVClass struct (used for av_log)
> > + *        used for logging, can be NULL
> > + *
> > + * @return a negative error code on error, non negative otherwise
> > + */
> > +int sws_get_gaussian_vec(SwsVector **vecp,
> > +                         double standard_deviation, double quality,
> > +                         void *log_ctx);
> 
> which of the two do you consider better?
> 
> First, here the central part we return is the vector
> 
> SwsVector *gaus_vec = sws_getGaussianVec(NULL, 1, 2);
> SwsVector *temp_vec = sws_ConvolveVec(NULL, in_vec, gaus_vec);
> sws_averageVec(temp_vec, temp_vec, in_vec);
> 
> av_free(gaus_vec);
> return temp_vec; // Error checking here happens by temp_vec being NULL in all cases of error
> 
> vs.
> 
> Second, here the central part we return is the error code
> 
> SwsVector *gaus_vec = NULL;
> SwsVector *temp_vec = NULL;
> int err = sws_getGaussianVec(&gaus_vec, 1, 2);
> if (err<0)
>     goto fail;
> 
> err = sws_ConvolveVec(&temp_vec, in_vec, gaus_vec);
> if (err<0)
>     goto fail;
> 
> err = sws_averageVec(&temp_vec, temp_vec, in_vec);
> if (err<0)
>     goto fail;

The latter pattern enables differentiation between error codes (ENOMEM
or EINVAL) and provides feedback in the log message. With the former
you only know if it fails, but you don't know why (relevant in case
e.g. we make the parameter tunable by a filter and we don't want to
add additional validation and logging at the filter level).
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [FFmpeg-devel] [PATCH] lsws/swscale.h: introduce sws_get_gaussian_vec
  2023-09-01 18:38           ` Stefano Sabatini
@ 2023-09-02 20:07             ` Michael Niedermayer
  2023-09-03  0:25               ` Stefano Sabatini
  0 siblings, 1 reply; 18+ messages in thread
From: Michael Niedermayer @ 2023-09-02 20:07 UTC (permalink / raw)
  To: FFmpeg development discussions and patches


[-- Attachment #1.1: Type: text/plain, Size: 3163 bytes --]

On Fri, Sep 01, 2023 at 08:38:26PM +0200, Stefano Sabatini wrote:
> On date Friday 2023-09-01 18:54:40 +0200, Michael Niedermayer wrote:
> > On Thu, Aug 31, 2023 at 07:16:20PM +0200, Stefano Sabatini wrote:
> [...]
> > > +/**
> > > + * Compute and return a normalized Gaussian vector.
> > > + *
> > > + * @param vecp: pointer where the computed vector is put in case of
> > > + *        success
> > > + * @param standard_deviation the standard deviation used to generate
> > > + *        the Gaussian vector, must be a non-negative value
> > > + * @param quality the quality of the generated Gaussian vector, must
> > > + *        be a non-negative value. It affects the lenght of the generated
> > > + *        vector. A value equal to 3 corresponds to high quality.
> > > + * @param log_ctx a pointer to an arbitrary struct of which the first
> > > + *        field is a pointer to an AVClass struct (used for av_log)
> > > + *        used for logging, can be NULL
> > > + *
> > > + * @return a negative error code on error, non negative otherwise
> > > + */
> > > +int sws_get_gaussian_vec(SwsVector **vecp,
> > > +                         double standard_deviation, double quality,
> > > +                         void *log_ctx);
> > 
> > which of the two do you consider better?
> > 
> > First, here the central part we return is the vector
> > 
> > SwsVector *gaus_vec = sws_getGaussianVec(NULL, 1, 2);
> > SwsVector *temp_vec = sws_ConvolveVec(NULL, in_vec, gaus_vec);
> > sws_averageVec(temp_vec, temp_vec, in_vec);
> > 
> > av_free(gaus_vec);
> > return temp_vec; // Error checking here happens by temp_vec being NULL in all cases of error
> > 
> > vs.
> > 
> > Second, here the central part we return is the error code
> > 
> > SwsVector *gaus_vec = NULL;
> > SwsVector *temp_vec = NULL;
> > int err = sws_getGaussianVec(&gaus_vec, 1, 2);
> > if (err<0)
> >     goto fail;
> > 
> > err = sws_ConvolveVec(&temp_vec, in_vec, gaus_vec);
> > if (err<0)
> >     goto fail;
> > 
> > err = sws_averageVec(&temp_vec, temp_vec, in_vec);
> > if (err<0)
> >     goto fail;
> 
> The latter pattern enables differentiation between error codes (ENOMEM
> or EINVAL) and provides feedback in the log message. With the former
> you only know if it fails, but you don't know why (relevant in case
> e.g. we make the parameter tunable by a filter and we don't want to
> add additional validation and logging at the filter level).

can the API be designed so that optionally the user could choose to
only check the error code after several steps ?
(this would avoid the need for 1 check per call where the fine grained
 information is not needed)
I mean similar to the concept of NAN in floating point so that a failure
can be propagated and only at the end checked.

thx

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

"You are 36 times more likely to die in a bathtub than at the hands of a
terrorist. Also, you are 2.5 times more likely to become a president and
2 times more likely to become an astronaut, than to die in a terrorist
attack." -- Thoughty2


[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

[-- Attachment #2: Type: text/plain, Size: 251 bytes --]

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [FFmpeg-devel] [PATCH] lsws/swscale.h: introduce sws_get_gaussian_vec
  2023-09-02 20:07             ` Michael Niedermayer
@ 2023-09-03  0:25               ` Stefano Sabatini
  2023-09-03 16:34                 ` Michael Niedermayer
  0 siblings, 1 reply; 18+ messages in thread
From: Stefano Sabatini @ 2023-09-03  0:25 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

On date Saturday 2023-09-02 22:07:53 +0200, Michael Niedermayer wrote:
> On Fri, Sep 01, 2023 at 08:38:26PM +0200, Stefano Sabatini wrote:
> > On date Friday 2023-09-01 18:54:40 +0200, Michael Niedermayer wrote:
> > > On Thu, Aug 31, 2023 at 07:16:20PM +0200, Stefano Sabatini wrote:
> > [...]
> > > > +/**
> > > > + * Compute and return a normalized Gaussian vector.
> > > > + *
> > > > + * @param vecp: pointer where the computed vector is put in case of
> > > > + *        success
> > > > + * @param standard_deviation the standard deviation used to generate
> > > > + *        the Gaussian vector, must be a non-negative value
> > > > + * @param quality the quality of the generated Gaussian vector, must
> > > > + *        be a non-negative value. It affects the lenght of the generated
> > > > + *        vector. A value equal to 3 corresponds to high quality.
> > > > + * @param log_ctx a pointer to an arbitrary struct of which the first
> > > > + *        field is a pointer to an AVClass struct (used for av_log)
> > > > + *        used for logging, can be NULL
> > > > + *
> > > > + * @return a negative error code on error, non negative otherwise
> > > > + */
> > > > +int sws_get_gaussian_vec(SwsVector **vecp,
> > > > +                         double standard_deviation, double quality,
> > > > +                         void *log_ctx);
> > > 
> > > which of the two do you consider better?
> > > 
> > > First, here the central part we return is the vector
> > > 
> > > SwsVector *gaus_vec = sws_getGaussianVec(NULL, 1, 2);
> > > SwsVector *temp_vec = sws_ConvolveVec(NULL, in_vec, gaus_vec);
> > > sws_averageVec(temp_vec, temp_vec, in_vec);
> > > 
> > > av_free(gaus_vec);
> > > return temp_vec; // Error checking here happens by temp_vec being NULL in all cases of error
> > > 
> > > vs.
> > > 
> > > Second, here the central part we return is the error code
> > > 
> > > SwsVector *gaus_vec = NULL;
> > > SwsVector *temp_vec = NULL;
> > > int err = sws_getGaussianVec(&gaus_vec, 1, 2);
> > > if (err<0)
> > >     goto fail;
> > > 
> > > err = sws_ConvolveVec(&temp_vec, in_vec, gaus_vec);
> > > if (err<0)
> > >     goto fail;
> > > 
> > > err = sws_averageVec(&temp_vec, temp_vec, in_vec);
> > > if (err<0)
> > >     goto fail;
> > 
> > The latter pattern enables differentiation between error codes (ENOMEM
> > or EINVAL) and provides feedback in the log message. With the former
> > you only know if it fails, but you don't know why (relevant in case
> > e.g. we make the parameter tunable by a filter and we don't want to
> > add additional validation and logging at the filter level).
> 

> can the API be designed so that optionally the user could choose to
> only check the error code after several steps ?
> (this would avoid the need for 1 check per call where the fine grained
>  information is not needed)
> I mean similar to the concept of NAN in floating point so that a failure
> can be propagated and only at the end checked.

Well, with the new approach you can do:

SwsVector *gaus_vec, *temp_vec, *avg_vec;

sws_get_gaussian_vec(&gaus_vec, 1, 2);
sws_get_convolution_vec(&temp_vec, in_vec, gaus_vec);
sws_get_average_vec(&avg_vec, temp_vec, in_vec);
 
av_free(gaus_vec);
av_free(temp_vec);
return avg_vec; // Error checking here happens by avg_vec being NULL in all cases of error

If you want to disable the log we could add a log_ctx_offset parameter.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [FFmpeg-devel] [PATCH] lsws/swscale.h: introduce sws_get_gaussian_vec
  2023-09-03  0:25               ` Stefano Sabatini
@ 2023-09-03 16:34                 ` Michael Niedermayer
  0 siblings, 0 replies; 18+ messages in thread
From: Michael Niedermayer @ 2023-09-03 16:34 UTC (permalink / raw)
  To: FFmpeg development discussions and patches


[-- Attachment #1.1: Type: text/plain, Size: 4282 bytes --]

On Sun, Sep 03, 2023 at 02:25:07AM +0200, Stefano Sabatini wrote:
> On date Saturday 2023-09-02 22:07:53 +0200, Michael Niedermayer wrote:
> > On Fri, Sep 01, 2023 at 08:38:26PM +0200, Stefano Sabatini wrote:
> > > On date Friday 2023-09-01 18:54:40 +0200, Michael Niedermayer wrote:
> > > > On Thu, Aug 31, 2023 at 07:16:20PM +0200, Stefano Sabatini wrote:
> > > [...]
> > > > > +/**
> > > > > + * Compute and return a normalized Gaussian vector.
> > > > > + *
> > > > > + * @param vecp: pointer where the computed vector is put in case of
> > > > > + *        success
> > > > > + * @param standard_deviation the standard deviation used to generate
> > > > > + *        the Gaussian vector, must be a non-negative value
> > > > > + * @param quality the quality of the generated Gaussian vector, must
> > > > > + *        be a non-negative value. It affects the lenght of the generated
> > > > > + *        vector. A value equal to 3 corresponds to high quality.
> > > > > + * @param log_ctx a pointer to an arbitrary struct of which the first
> > > > > + *        field is a pointer to an AVClass struct (used for av_log)
> > > > > + *        used for logging, can be NULL
> > > > > + *
> > > > > + * @return a negative error code on error, non negative otherwise
> > > > > + */
> > > > > +int sws_get_gaussian_vec(SwsVector **vecp,
> > > > > +                         double standard_deviation, double quality,
> > > > > +                         void *log_ctx);
> > > > 
> > > > which of the two do you consider better?
> > > > 
> > > > First, here the central part we return is the vector
> > > > 
> > > > SwsVector *gaus_vec = sws_getGaussianVec(NULL, 1, 2);
> > > > SwsVector *temp_vec = sws_ConvolveVec(NULL, in_vec, gaus_vec);
> > > > sws_averageVec(temp_vec, temp_vec, in_vec);
> > > > 
> > > > av_free(gaus_vec);
> > > > return temp_vec; // Error checking here happens by temp_vec being NULL in all cases of error
> > > > 
> > > > vs.
> > > > 
> > > > Second, here the central part we return is the error code
> > > > 
> > > > SwsVector *gaus_vec = NULL;
> > > > SwsVector *temp_vec = NULL;
> > > > int err = sws_getGaussianVec(&gaus_vec, 1, 2);
> > > > if (err<0)
> > > >     goto fail;
> > > > 
> > > > err = sws_ConvolveVec(&temp_vec, in_vec, gaus_vec);
> > > > if (err<0)
> > > >     goto fail;
> > > > 
> > > > err = sws_averageVec(&temp_vec, temp_vec, in_vec);
> > > > if (err<0)
> > > >     goto fail;
> > > 
> > > The latter pattern enables differentiation between error codes (ENOMEM
> > > or EINVAL) and provides feedback in the log message. With the former
> > > you only know if it fails, but you don't know why (relevant in case
> > > e.g. we make the parameter tunable by a filter and we don't want to
> > > add additional validation and logging at the filter level).
> > 
> 
> > can the API be designed so that optionally the user could choose to
> > only check the error code after several steps ?
> > (this would avoid the need for 1 check per call where the fine grained
> >  information is not needed)
> > I mean similar to the concept of NAN in floating point so that a failure
> > can be propagated and only at the end checked.
> 
> Well, with the new approach you can do:
> 
> SwsVector *gaus_vec, *temp_vec, *avg_vec;
> 
> sws_get_gaussian_vec(&gaus_vec, 1, 2);
> sws_get_convolution_vec(&temp_vec, in_vec, gaus_vec);
> sws_get_average_vec(&avg_vec, temp_vec, in_vec);
>  
> av_free(gaus_vec);
> av_free(temp_vec);
> return avg_vec; // Error checking here happens by avg_vec being NULL in all cases of error

ok

> 
> If you want to disable the log we could add a log_ctx_offset parameter.

as long as theres a pointer to a log context that should be enough.
A log context can modify the log level

passing a seperate and mandatory level offset per call would be a bit ugly

thx

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Any man who breaks a law that conscience tells him is unjust and willingly 
accepts the penalty by staying in jail in order to arouse the conscience of 
the community on the injustice of the law is at that moment expressing the 
very highest respect for law. - Martin Luther King Jr

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

[-- Attachment #2: Type: text/plain, Size: 251 bytes --]

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [FFmpeg-devel] [PATCH] lsws/swscale.h: introduce sws_get_gaussian_vec
  2023-09-01 18:28       ` Stefano Sabatini
@ 2023-09-05 11:19         ` Anton Khirnov
  2023-09-05 22:59           ` Stefano Sabatini
  0 siblings, 1 reply; 18+ messages in thread
From: Anton Khirnov @ 2023-09-05 11:19 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

Quoting Stefano Sabatini (2023-09-01 20:28:33)
> On date Friday 2023-09-01 17:50:56 +0200, Anton Khirnov wrote:
> > Quoting Stefano Sabatini (2023-08-31 17:06:06)
> > > On date Saturday 2023-08-26 17:15:36 +0200, Anton Khirnov wrote:
> > > > Quoting Stefano Sabatini (2023-08-26 14:23:28)
> > > > > Use in place of sws_getGaussianVec.
> > > > > 
> > > > > The new function enable better log handling, and provide better naming
> > > > > for the variance variable, now named standard_deviation to reflect the
> > > > > meaning of the parameter.
> > > > 
> > > 
> > > > Logging to NULL does not seem like an improvement to me.
> > > 
> > > Adding the log_ctx.
> > > 
> > > > Renaming a function parameter does not require an API break.
> > > 
> > > The main point was improving the naming of the variable, but while at
> > > it I'm also adding the logging context and providing a return code to
> > > specify an error failure, and moving to snake_case convention which is
> > > the one used by the new API additions.
> > 
> > As I already said above - function parameter names in a prototype are
> > purely cosmetic and have no effect on anything besides doxygen. You can
> > change them at will and even remove them entirely without breaking API
> > or ABI.
> > 
> 
> > The other reasons do not strike me as strong enough to warrant an API
> > break.
> 
> I disagree on this: the function is probably only used internally and
> by libavfilter, and the migration is trivial enough so should cause no
> disruption anyway.

The migration is not trivial for someone who is not familiar with the
code (such as a distro package maintainer), since the new function has a
different signature. I really do not think we should break APIs for
frivolous reasons, which includes cosmetic ones.

-- 
Anton Khirnov
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [FFmpeg-devel] [PATCH] lsws/swscale.h: introduce sws_get_gaussian_vec
  2023-09-05 11:19         ` Anton Khirnov
@ 2023-09-05 22:59           ` Stefano Sabatini
  2023-09-06 11:13             ` Anton Khirnov
  0 siblings, 1 reply; 18+ messages in thread
From: Stefano Sabatini @ 2023-09-05 22:59 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

On date Tuesday 2023-09-05 13:19:00 +0200, Anton Khirnov wrote:
> Quoting Stefano Sabatini (2023-09-01 20:28:33)
> > On date Friday 2023-09-01 17:50:56 +0200, Anton Khirnov wrote:
> > > Quoting Stefano Sabatini (2023-08-31 17:06:06)
> > > > On date Saturday 2023-08-26 17:15:36 +0200, Anton Khirnov wrote:
> > > > > Quoting Stefano Sabatini (2023-08-26 14:23:28)
> > > > > > Use in place of sws_getGaussianVec.
> > > > > > 
> > > > > > The new function enable better log handling, and provide better naming
> > > > > > for the variance variable, now named standard_deviation to reflect the
> > > > > > meaning of the parameter.
> > > > > 
> > > > 
> > > > > Logging to NULL does not seem like an improvement to me.
> > > > 
> > > > Adding the log_ctx.
> > > > 
> > > > > Renaming a function parameter does not require an API break.
> > > > 
> > > > The main point was improving the naming of the variable, but while at
> > > > it I'm also adding the logging context and providing a return code to
> > > > specify an error failure, and moving to snake_case convention which is
> > > > the one used by the new API additions.
> > > 
> > > As I already said above - function parameter names in a prototype are
> > > purely cosmetic and have no effect on anything besides doxygen. You can
> > > change them at will and even remove them entirely without breaking API
> > > or ABI.
> > > 
> > 
> > > The other reasons do not strike me as strong enough to warrant an API
> > > break.
> > 

> > I disagree on this: the function is probably only used internally and
> > by libavfilter, and the migration is trivial enough so should cause no
> > disruption anyway.
> 

> The migration is not trivial for someone who is not familiar with the
> code (such as a distro package maintainer), since the new function has a
> different signature. I really do not think we should break APIs for
> frivolous reasons, which includes cosmetic ones.

Following this logic every API change should be considered not trivial
for someone not familiar with the code, and therefore should not be
committed. Also there is no evidence that external components are
using this function.

Besides the naming change, there are ergonomic and functional changes
making the behavior of the code more correct.

(Also probably it would be worth moving the naming of all the
remaining functions to snake_case to provide a consistent API - and
reduce the cognitive overload on the API user).
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [FFmpeg-devel] [PATCH] lsws/swscale.h: introduce sws_get_gaussian_vec
  2023-09-05 22:59           ` Stefano Sabatini
@ 2023-09-06 11:13             ` Anton Khirnov
  2023-11-04 21:38               ` Stefano Sabatini
  0 siblings, 1 reply; 18+ messages in thread
From: Anton Khirnov @ 2023-09-06 11:13 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

Quoting Stefano Sabatini (2023-09-06 00:59:44)
> > > > As I already said above - function parameter names in a prototype are
> > > > purely cosmetic and have no effect on anything besides doxygen. You can
> > > > change them at will and even remove them entirely without breaking API
> > > > or ABI.
> > > > 
> > > 
> > > > The other reasons do not strike me as strong enough to warrant an API
> > > > break.
> > > 
> 
> > > I disagree on this: the function is probably only used internally and
> > > by libavfilter, and the migration is trivial enough so should cause no
> > > disruption anyway.
> > 
> 
> > The migration is not trivial for someone who is not familiar with the
> > code (such as a distro package maintainer), since the new function has a
> > different signature. I really do not think we should break APIs for
> > frivolous reasons, which includes cosmetic ones.
> 
> Following this logic every API change should be considered not trivial
> for someone not familiar with the code,

A simple rename is a trivial API change. Almost everything else is not.

> and therefore should not be committed.

Yes, the baseline for every API change is that it is undesirable and you
must supply sufficiently strong arguments to overcome that.

> Also there is no evidence that external components are using this
> function.
>
> Besides the naming change, there are ergonomic and functional changes
> making the behavior of the code more correct.

I do not see the code being made more correct, but Michael observed in
this thread that it becomes longer and more convoluted.

I am not convinced that adding logging to this function is an
improvement. You have to pass an extra parameter to every call, making
the code longer and less readable. We do not need a dedicated error
message for every malloc.

-- 
Anton Khirnov
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [FFmpeg-devel] [PATCH] lsws/swscale.h: introduce sws_get_gaussian_vec
  2023-09-06 11:13             ` Anton Khirnov
@ 2023-11-04 21:38               ` Stefano Sabatini
  0 siblings, 0 replies; 18+ messages in thread
From: Stefano Sabatini @ 2023-11-04 21:38 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

On date Wednesday 2023-09-06 13:13:25 +0200, Anton Khirnov wrote:
> Quoting Stefano Sabatini (2023-09-06 00:59:44)
[...]
> A simple rename is a trivial API change. Almost everything else is not.
> 
> > and therefore should not be committed.
> 
> Yes, the baseline for every API change is that it is undesirable and you
> must supply sufficiently strong arguments to overcome that.
> 
> > Also there is no evidence that external components are using this
> > function.
> >

> > Besides the naming change, there are ergonomic and functional changes
> > making the behavior of the code more correct.
> 

> I do not see the code being made more correct, but Michael observed in
> this thread that it becomes longer and more convoluted.

It is a different construct, not necessarily more convoluted. Also
keep in mind this is needed in order to achive two goals:

1. return a proper error code since we can have two types of failures
here (memalloc or invalid argument)

2. log the invalid argument reason so that the failure reason is in
the log, without having to repeat the validation logic in the caller

> I am not convinced that adding logging to this function is an
> improvement. You have to pass an extra parameter to every call, making
> the code longer and less readable. We do not need a dedicated error
> message for every malloc.

See above, in this case we can have ENOMEM/EINVAL and it should be
possible to distinguish between the two.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2023-11-04 21:38 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-26 12:23 [FFmpeg-devel] [PATCH] lsws/swscale.h: introduce sws_get_gaussian_vec Stefano Sabatini
2023-08-26 15:15 ` Andreas Rheinhardt
2023-08-31 15:32   ` Stefano Sabatini
2023-08-31 16:51     ` Andreas Rheinhardt
2023-08-31 17:16       ` Stefano Sabatini
2023-09-01 16:54         ` Michael Niedermayer
2023-09-01 18:38           ` Stefano Sabatini
2023-09-02 20:07             ` Michael Niedermayer
2023-09-03  0:25               ` Stefano Sabatini
2023-09-03 16:34                 ` Michael Niedermayer
2023-08-26 15:15 ` Anton Khirnov
2023-08-31 15:06   ` Stefano Sabatini
2023-09-01 15:50     ` Anton Khirnov
2023-09-01 18:28       ` Stefano Sabatini
2023-09-05 11:19         ` Anton Khirnov
2023-09-05 22:59           ` Stefano Sabatini
2023-09-06 11:13             ` Anton Khirnov
2023-11-04 21:38               ` Stefano Sabatini

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git