Anton Khirnov
1c18530e93
lavfi/avfilter: process options for filters without a private class
...
It still makes sense to apply AVFilterContext-level options to such
filters.
2023-01-10 11:52:02 +01:00
Anton Khirnov
d234b4b193
lavfi/avfilter: simplify process_options()
...
This function currently treats AVFilterContext options and
filter-private options differently: the former are immediately applied,
while the latter are stored in a dictionary to be applied later.
There is no good reason for having two branches - storing all options in
the dictionary is simpler and achieves the same effect (since it is
later applied with av_opt_set_dict()).
This will also be useful in future commits.
2023-01-10 11:52:02 +01:00
Anton Khirnov
b6ba764552
lavfi/avfilter: export a multikey dict from process_options()
...
This way the function does not need to be able to match keys to
AVOptions, which will be useful in future commits.
2023-01-10 11:52:02 +01:00
Anton Khirnov
bd7c07c26a
lavfi/avfilter: avoid a redundant av_opt_set_dict2() call
...
Current code first sets AVFilterContext-level options, then aplies the
leftover on the filter's private data. This is unnecessary, applying the
options to AVFilterContext with the AV_OPT_SEARCH_CHILDREN flag
accomplishes the same effect.
2023-01-10 11:52:02 +01:00
Anton Khirnov
a7b1b4bc23
lavfi: remove AVFilter.init_dict()
...
Nothing uses it anymore.
All options on all filters can now be set with normal AVOptions
mechanisms, such as av_opt_set*().
2023-01-10 11:52:02 +01:00
Anton Khirnov
018a8b9dc3
lavfi/vf_scale: allow passing options to swscale directly
...
Avoid using the dictionary mechanism, which is non-introspectable. As
this is the only user of AVFilter.init_dict(), this callback can now be
removed.
2023-01-10 11:52:02 +01:00
Paul B Mahol
5d3f0226ad
avfilter/avf_avectorscope: add anti-aliased line drawing mode
2023-01-09 18:07:05 +01:00
Clément Bœsch
6e05622216
avfilter/paletteuse: use explicit key indexes in set_frame_lut
2023-01-03 17:29:13 +01:00
Clément Bœsch
68275043a0
avfilter/paletteuse: add atkinson dithering
...
Atkinson according to
https://bisqwit.iki.fi/jutut/kuvat/ordered_dither/error_diffusion.txt :
* 1 1 / 8
1 1 1
1
2023-01-03 17:29:13 +01:00
Clément Bœsch
c973e8ae79
avfilter/paletteuse: add burkes dithering
...
Burkes according to
https://bisqwit.iki.fi/jutut/kuvat/ordered_dither/error_diffusion.txt :
* 8 4
2 4 8 4 2 / 32
2023-01-03 17:29:13 +01:00
Clément Bœsch
9973343bf9
avfilter/paletteuse: add sierra3 dithering
...
Sierra3 according to
https://bisqwit.iki.fi/jutut/kuvat/ordered_dither/error_diffusion.txt :
* 5 3
2 4 5 4 2
2 3 2 / 32
2023-01-03 17:29:13 +01:00
Clément Bœsch
11926c4bd4
avfilter/palette{gen,use}: misc for-loop cosmetics
2023-01-03 17:18:56 +01:00
Clément Bœsch
1340fe7caf
avfilter/paletteuse: move r,g,b computation in a more local scope
2023-01-03 17:18:55 +01:00
Clément Bœsch
1ae1b707e2
avfilter/paletteuse: remove mean error tool
...
This belongs in another filter.
2023-01-03 17:18:55 +01:00
Clément Bœsch
8789a9e05b
avfilter/paletteuse: remove alternative search methods
...
This is a maintenance pain more than anything. It appears to make the
code slightly faster as a side effect.
2023-01-03 17:18:55 +01:00
Clément Bœsch
0f7942afa6
avfilter/paletteuse: switch to recursive method
...
It appears faster than the iterative method on my machine (1.06x
faster), so I'm guessing compilers improved over time (the iterative
version was slightly faster in the past).
2023-01-03 17:18:55 +01:00
Clément Bœsch
6c7b54e962
avfilter/paletteuse: use lowbias32 for color hashing
...
Impact is more negligible than previous commit but still faster (1.02x).
2023-01-03 17:18:55 +01:00
Clément Bœsch
c9084cd0e2
avfilter/palettegen: use lowbias32 for color hashing
...
1.12x faster overall in palettegen on my machine.
2023-01-03 17:18:55 +01:00
Clément Bœsch
3cafbdc083
avfilter/palette: add lowbias32 hashing
2023-01-03 17:18:55 +01:00
Clément Bœsch
051926868c
avfilter/palette{gen,use}: update Copyright after recent changes
2023-01-03 17:18:55 +01:00
Clément Bœsch
3a4a6c7815
avfilter/palettegen: use libc qsort
...
Now that the sort function is deterministic, we can rely on the libc
sorting function.
2023-01-03 17:18:55 +01:00
Clément Bœsch
8057e1a618
avfilter/palettegen: make refs order deterministic
...
Currently, in case of equality on the first color channel, the order of
the ref colors is defined by the hashing function. This commit makes the
sorting deterministic and improve the hierarchical ordering.
2023-01-03 17:18:55 +01:00
Clément Bœsch
2441e53c0a
avfilter/palettegen: add a warning about supporting only sRGB
2023-01-03 17:18:55 +01:00
Clément Bœsch
9026d92c13
avfilter/palettegen: base box split decision on a perceptual model
...
Similar to the change in paletteuse, we rely on a perceptual model to
decide how and where to split the box.
2023-01-03 17:18:55 +01:00
Clément Bœsch
724f52b906
avfilter/palettegen: switch to signed arithmetic
...
This prevents mixed sign arithmetic (typically because we have signed
color channel differences), which has nasty side effects in C.
2023-01-03 17:18:55 +01:00
Clément Bœsch
67ce6ad9a2
avfilter/palettegen: rename local variable box_weight to weight
...
This variable is used only for the running weight (used to reach the
target median). The places where we actually need the box weight are
changed to use box->weight.
2023-01-03 17:18:55 +01:00
Clément Bœsch
61d334d8c3
avfilter/palettegen: misc cosmetics
2023-01-03 17:18:55 +01:00
Clément Bœsch
efb0a6f6ce
avfilter/palettegen: compute average color within compute_box_stats()
2023-01-03 17:18:55 +01:00
Clément Bœsch
dafd43b78d
avfilter/palettegen: change cut score from ∑e² to max e²
...
This is following the results from personal research¹.
¹: https://github.com/ubitux/research/tree/main/color-quantization#results
2023-01-03 17:18:55 +01:00
Clément Bœsch
187f5e7f90
avfilter/palettegen: rename variance to cut_score
...
"Variance" wasn't exactly the correct word; "cut score" is more
agnostic, which will be useful when changing the algorithm in the next
commit.
2023-01-03 17:18:55 +01:00
Clément Bœsch
e49fc1a6ef
avfilter/palettegen: always compute the box variance
...
The variance computation is simple enough now (since we can use the axis
squared errors) that it doesn't need to have a complex lazy computation
logic.
2023-01-03 17:18:55 +01:00
Clément Bœsch
9e5f494d26
avfilter/palettegen: use box->major_axis without intermediate variable
2023-01-03 17:18:55 +01:00
Clément Bœsch
86bced7c65
avfilter/palettegen: define the best axis to cut using the squared error
...
This is following the results from personal research¹.
¹: https://github.com/ubitux/research/tree/main/color-quantization#results
2023-01-03 17:18:55 +01:00
Clément Bœsch
21f7814238
avfilter/palettegen: move box stats computation to a dedicated function
2023-01-03 17:18:55 +01:00
Clément Bœsch
a0587c0219
avfilter/paletteuse: switch to a perceptual model
...
Now the selection of the color is based on a distance built around human
perception of color instead of the unreliable sRGB triplet one.
2023-01-03 17:18:55 +01:00
Clément Bœsch
1159c36d6d
avfilter/paletteuse: remove redundant alpha condition
...
This is redundant with a != 0xff below.
2023-01-03 17:18:55 +01:00
Clément Bœsch
4c061bc837
avfilter/paletteuse: remove unused alpha split dimension
...
The equalities in the w{r,g,b} range checks make sure longest is never
0. Even if the alpha ended up being selected in get_next_color() it
would cause underread memory accesses in its caller (colormap_insert).
2023-01-03 17:18:55 +01:00
Clément Bœsch
71ed92e9c4
avfilter/paletteuse: name target color arg consistently in colormap functions
2023-01-03 17:18:55 +01:00
Clément Bœsch
755c427f7a
avfilter/paletteuse: switch from u8[4] to u32 for color code
...
This change simplifies the code quite a bit and make it consistent with
how it's done in palettegen.
2023-01-03 17:18:55 +01:00
Clément Bœsch
31c5f26a46
avfilter/palette{gen,use}: add palette utils
...
These color management helpers will be shared by palettegen and
paletteuse in the following commits.
Note that it probably makes sense to share at least the sRGB/linear
functions with other filters at some point.
More information on OkLab can be found here: https://bottosson.github.io/posts/oklab/
For the arithmetic integer version, see:
http://blog.pkh.me/p/38-porting-oklab-colorspace-to-integer-arithmetic.html
and https://github.com/ubitux/oklab-int
2023-01-03 17:18:55 +01:00
Clément Bœsch
7bc054e63c
avfilter/palette{gen,use}: simplify a few alpha masks
2023-01-03 17:18:55 +01:00
Clément Bœsch
320fbf5f24
avfilter/palette{gen,use}: revert support palettes with alpha
...
This reverts commit dea673d0d5
.
This change cannot work for several reasons, the most obvious ones are:
- the alpha is being part of the scoring of the color difference, even
though we can not interpret the alpha as part of the perception of the
color (we don't even know if it's premultiplied or postmultiplied)
- the colors are averaged with their alpha value which simply cannot
work
The command proposed in the original thread of the patch actually
produces a completely broken file:
ffmpeg -y -loglevel verbose -i fate-suite/apng/o_sample.png -filter_complex "split[split1][split2];[split1]palettegen=max_colors=254:use_alpha=1[pal1];[split2][pal1]paletteuse=use_alpha=1" -frames:v 1 out.png
We can see that many color pixels are off, but more importantly some
colors have a random alpha value: https://imgur.com/eFQ2UK7
I don't see any easy fix for this unfortunately, the approach appears to
be flawed by design.
2023-01-03 17:18:55 +01:00
Clément Bœsch
cad9d7fc85
avfilter/palettegen: allow a minimum of 2 colors
2023-01-03 17:18:55 +01:00
Paul B Mahol
c94988a781
avfilter/af_afade: add options to control unity/silence gains
2023-01-03 10:25:06 +01:00
Paul B Mahol
3879555cd5
avfilter/afir_template: make IR transitions artifacts free
2023-01-02 15:33:57 +01:00
Paul B Mahol
eeb280f351
avfilter/af_afir: fix prev_selir variable change in private filter context
2022-12-25 20:39:54 +01:00
Paul B Mahol
eaba6bfc51
avfilter/afir_template: reduce memset overhead a little
2022-12-25 20:39:54 +01:00
Paul B Mahol
8906145cdf
avfilter/af_afir: increase max partition size
2022-12-25 20:39:54 +01:00
Paul B Mahol
64ddf04460
avfilter/af_afir: reduce memory usage
2022-12-25 20:39:54 +01:00
Paul B Mahol
9498bc7c32
avfilter/af_afir: make dry/wet runtime options
2022-12-22 17:09:15 +01:00