summaryrefslogtreecommitdiff
path: root/libavfilter
diff options
context:
space:
mode:
authorJérémy Tran <tran.jeremy.av@gmail.com>2012-08-16 09:15:58 +0200
committerStefano Sabatini <stefasab@gmail.com>2012-08-16 15:01:05 +0200
commit191b77eb01addf008440531f8cab193b3c2c5a15 (patch)
tree96c831484aa3b398ded8b9a98ef8053bf2eabad1 /libavfilter
parent6efce3a894d497e045ba85555efaa4abfd685ba3 (diff)
lavfi/hue: add named options support
Old syntax has been kept for compatibility reasons. Signed-off-by: Stefano Sabatini <stefasab@gmail.com>
Diffstat (limited to 'libavfilter')
-rw-r--r--libavfilter/version.h2
-rw-r--r--libavfilter/vf_hue.c63
2 files changed, 57 insertions, 8 deletions
diff --git a/libavfilter/version.h b/libavfilter/version.h
index 85a839fe9e..b2ef3112d5 100644
--- a/libavfilter/version.h
+++ b/libavfilter/version.h
@@ -30,7 +30,7 @@
#define LIBAVFILTER_VERSION_MAJOR 3
#define LIBAVFILTER_VERSION_MINOR 9
-#define LIBAVFILTER_VERSION_MICRO 101
+#define LIBAVFILTER_VERSION_MICRO 102
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
LIBAVFILTER_VERSION_MINOR, \
diff --git a/libavfilter/vf_hue.c b/libavfilter/vf_hue.c
index 16fa4f4a7f..0bc4d92c34 100644
--- a/libavfilter/vf_hue.c
+++ b/libavfilter/vf_hue.c
@@ -25,7 +25,9 @@
* Ported from MPlayer libmpcodecs/vf_hue.c.
*/
+#include <float.h>
#include "libavutil/imgutils.h"
+#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"
#include "avfilter.h"
@@ -33,8 +35,13 @@
#include "internal.h"
#include "video.h"
+#define HUE_DEFAULT_VAL 0
+#define SAT_DEFAULT_VAL 1
+
typedef struct {
- float hue;
+ const AVClass *class;
+ float hue_deg; /* hue expressed in degrees */
+ float hue; /* hue expressed in radians */
float saturation;
int hsub;
int vsub;
@@ -42,13 +49,44 @@ typedef struct {
int32_t hue_cos;
} HueContext;
+#define OFFSET(x) offsetof(HueContext, x)
+static const AVOption hue_options[] = {
+ { "h", "set the hue angle degrees", OFFSET(hue_deg), AV_OPT_TYPE_FLOAT,
+ { -FLT_MAX }, -FLT_MAX, FLT_MAX, AV_OPT_FLAG_VIDEO_PARAM },
+ { "H", "set the hue angle radians", OFFSET(hue), AV_OPT_TYPE_FLOAT,
+ { -FLT_MAX }, -FLT_MAX, FLT_MAX, AV_OPT_FLAG_VIDEO_PARAM },
+ { "s", "set the saturation value", OFFSET(saturation), AV_OPT_TYPE_FLOAT,
+ { SAT_DEFAULT_VAL }, -10, 10, AV_OPT_FLAG_VIDEO_PARAM },
+ { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(hue);
+
static av_cold int init(AVFilterContext *ctx, const char *args)
{
HueContext *hue = ctx->priv;
- float h = 0, s = 1;
- int n;
+ float h = HUE_DEFAULT_VAL, s = SAT_DEFAULT_VAL;
+ int n, ret;
char c1 = 0, c2 = 0;
+ char *equal;
+
+ hue->class = &hue_class;
+ /* named options syntax */
+ if (equal = strchr(args, '=')) {
+ av_opt_set_defaults(hue);
+ if ((ret = av_set_options_string(hue, args, "=", ":")) < 0)
+ return ret;
+ if (hue->hue != -FLT_MAX && hue->hue_deg != -FLT_MAX) {
+ av_log(ctx, AV_LOG_ERROR,
+ "H and h options are incompatible and cannot be specified "
+ "at the same time\n");
+ return AVERROR(EINVAL);
+ }
+ if (hue->hue == -FLT_MAX)
+ hue->hue = HUE_DEFAULT_VAL;
+ /* compatibility syntax */
+ } else {
if (args) {
n = sscanf(args, "%f%c%f%c", &h, &c1, &s, &c2);
if (n != 0 && n != 1 && (n != 3 || c1 != ':')) {
@@ -57,7 +95,6 @@ static av_cold int init(AVFilterContext *ctx, const char *args)
"must be in the form 'hue[:saturation]'\n", args);
return AVERROR(EINVAL);
}
- }
if (s < -10 || s > 10) {
av_log(ctx, AV_LOG_ERROR,
@@ -65,14 +102,25 @@ static av_cold int init(AVFilterContext *ctx, const char *args)
"must be included between range -10 and +10\n", s);
return AVERROR(EINVAL);
}
-
- /* Convert angle from degree to radian */
- hue->hue = h * M_PI / 180;
+ }
+ hue->hue_deg = h;
hue->saturation = s;
+ }
+
+ if (hue->hue_deg != -FLT_MAX)
+ /* Convert angle from degrees to radians */
+ hue->hue = hue->hue_deg * M_PI / 180;
return 0;
}
+static av_cold void uninit(AVFilterContext *ctx)
+{
+ HueContext *hue = ctx->priv;
+
+ av_opt_free(hue);
+}
+
static int query_formats(AVFilterContext *ctx)
{
static const enum PixelFormat pix_fmts[] = {
@@ -180,6 +228,7 @@ AVFilter avfilter_vf_hue = {
.priv_size = sizeof(HueContext),
.init = init,
+ .uninit = uninit,
.query_formats = query_formats,
.inputs = (const AVFilterPad[]) {