Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJérémy Tran <tran.jeremy.av@gmail.com>2012-08-31 03:56:58 +0400
committerStefano Sabatini <stefasab@gmail.com>2012-08-31 20:09:30 +0400
commit54ca7e39dae120fefe96d30e965a304b63a1b491 (patch)
tree0e4721500d9cbfed3412f5126e41ec1e087793f9 /libavfilter/vf_hue.c
parentfa838a0c0f42246623c4501c6b197e16ee9713b4 (diff)
lavfi/hue: add process_command callback
This allows dynamic reconfiguration of the filter. The callback uses some code that was in the init function. Hence this code has been moved in its own function. Signed-off-by: Stefano Sabatini <stefasab@gmail.com>
Diffstat (limited to 'libavfilter/vf_hue.c')
-rw-r--r--libavfilter/vf_hue.c45
1 files changed, 41 insertions, 4 deletions
diff --git a/libavfilter/vf_hue.c b/libavfilter/vf_hue.c
index cf1fe5f82a..dd36d8eb75 100644
--- a/libavfilter/vf_hue.c
+++ b/libavfilter/vf_hue.c
@@ -63,19 +63,19 @@ static const AVOption hue_options[] = {
AVFILTER_DEFINE_CLASS(hue);
-static av_cold int init(AVFilterContext *ctx, const char *args)
+static inline int set_options(AVFilterContext *ctx, const char *args)
{
HueContext *hue = ctx->priv;
int n, ret;
char c1 = 0, c2 = 0;
char *equal;
- hue->class = &hue_class;
- av_opt_set_defaults(hue);
-
if (args) {
/* named options syntax */
if (equal = strchr(args, '=')) {
+ hue->hue = -FLT_MAX;
+ hue->hue_deg = -FLT_MAX;
+
if ((ret = av_set_options_string(hue, args, "=", ":")) < 0)
return ret;
if (hue->hue != -FLT_MAX && hue->hue_deg != -FLT_MAX) {
@@ -103,6 +103,20 @@ static av_cold int init(AVFilterContext *ctx, const char *args)
}
}
+ return 0;
+}
+
+static av_cold int init(AVFilterContext *ctx, const char *args)
+{
+ HueContext *hue = ctx->priv;
+ int ret;
+
+ hue->class = &hue_class;
+ av_opt_set_defaults(hue);
+
+ if ((ret = set_options(ctx, args)) < 0)
+ return ret;
+
if (hue->saturation == -FLT_MAX)
hue->hue = SAT_DEFAULT_VAL;
if (hue->hue == -FLT_MAX)
@@ -223,6 +237,28 @@ static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
return ff_draw_slice(inlink->dst->outputs[0], y, h, slice_dir);
}
+static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
+ char *res, int res_len, int flags)
+{
+ HueContext *hue = ctx->priv;
+ int ret;
+
+ if (!strcmp(cmd, "reinit")) {
+ if ((ret = set_options(ctx, args)) < 0)
+ return ret;
+
+ if (hue->hue_deg != -FLT_MAX)
+ /* Convert angle from degrees to radians */
+ hue->hue = hue->hue_deg * M_PI / 180;
+
+ hue->hue_sin = rint(sin(hue->hue) * (1 << 16) * hue->saturation);
+ hue->hue_cos = rint(cos(hue->hue) * (1 << 16) * hue->saturation);
+ } else
+ return AVERROR(ENOSYS);
+
+ return 0;
+}
+
AVFilter avfilter_vf_hue = {
.name = "hue",
.description = NULL_IF_CONFIG_SMALL("Adjust the hue and saturation of the input video."),
@@ -232,6 +268,7 @@ AVFilter avfilter_vf_hue = {
.init = init,
.uninit = uninit,
.query_formats = query_formats,
+ .process_command = process_command,
.inputs = (const AVFilterPad[]) {
{