[FFmpeg-devel] [PATCH]lavfi/palettegen: Allow setting the background colour
James Almer
jamrial at gmail.com
Sun Oct 29 03:32:43 EEST 2017
On 10/28/2017 8:47 PM, Carl Eugen Hoyos wrote:
> 2017-10-28 23:50 GMT+02:00 Clément Bœsch <u at pkh.me>:
>> On Sat, Oct 28, 2017 at 10:57:32PM +0200, Carl Eugen Hoyos wrote:
>>> 2017-10-17 23:42 GMT+02:00 Carl Eugen Hoyos <ceffmpeg at gmail.com>:
>>>
>>>> Attached patch is useful in combination with the transparency patch
>>>> for paletteuse.
>>>
>>>> + { "background", "set a background color for transparency", OFFSET(background), AV_OPT_TYPE_COLOR, {.str="white"}, CHAR_MIN, CHAR_MAX, FLAGS },
>>>
>>> Locally changed to "lime" to make sure fate stays unchanged.
>>>
>>
>> Please use "transparency_color" as option name (and field struct).
>
> I liked "background";-(
>
>> Also, the correct type in the structure is uint8_t[4]
>>
>> And ideally, you would also document the option in doc/filters.texi
>>
>> You can apply any time with these changes.
>
> Done, thank you!
>
> Carl Eugen
> diff --git a/libavfilter/vf_palettegen.c b/libavfilter/vf_palettegen.c
> index 03de317..2a04ae5 100644 (file)
> --- a/libavfilter/vf_palettegen.c
> +++ b/libavfilter/vf_palettegen.c
> @@ -27,6 +27,7 @@
> #include "libavutil/internal.h"
> #include "libavutil/opt.h"
> #include "libavutil/qsort.h"
> +#include "libavutil/intreadwrite.h"
> #include "avfilter.h"
> #include "internal.h"
>
> @@ -74,6 +75,7 @@ typedef struct PaletteGenContext {
> struct range_box boxes[256]; // define the segmentation of the colorspace (the final palette)
> int nb_boxes; // number of boxes (increase will segmenting them)
> int palette_pushed; // if the palette frame is pushed into the outlink or not
> + uint8_t[4] transparency_color; // background color for transparency
This broke compilation. It should be, if anything
uint8_t transparency_color[4];
> } PaletteGenContext;
>
> #define OFFSET(x) offsetof(PaletteGenContext, x)
> @@ -81,6 +83,7 @@ typedef struct PaletteGenContext {
> static const AVOption palettegen_options[] = {
> { "max_colors", "set the maximum number of colors to use in the palette", OFFSET(max_colors), AV_OPT_TYPE_INT, {.i64=256}, 4, 256, FLAGS },
> { "reserve_transparent", "reserve a palette entry for transparency", OFFSET(reserve_transparent), AV_OPT_TYPE_BOOL, {.i64=1}, 0, 1, FLAGS },
> + { "transparency_color", "set a background color for transparency", OFFSET(transparency_color), AV_OPT_TYPE_COLOR, {.str="lime"}, CHAR_MIN, CHAR_MAX, FLAGS },
> { "stats_mode", "set statistics mode", OFFSET(stats_mode), AV_OPT_TYPE_INT, {.i64=STATS_MODE_ALL_FRAMES}, 0, NB_STATS_MODE-1, FLAGS, "mode" },
> { "full", "compute full frame histograms", 0, AV_OPT_TYPE_CONST, {.i64=STATS_MODE_ALL_FRAMES}, INT_MIN, INT_MAX, FLAGS, "mode" },
> { "diff", "compute histograms only for the part that differs from previous frame", 0, AV_OPT_TYPE_CONST, {.i64=STATS_MODE_DIFF_FRAMES}, INT_MIN, INT_MAX, FLAGS, "mode" },
> @@ -250,7 +253,7 @@ static void write_palette(AVFilterContext *ctx, AVFrame *out)
>
> if (s->reserve_transparent) {
> av_assert0(s->nb_boxes < 256);
> - pal[out->width - pal_linesize - 1] = 0x0000ff00; // add a green transparent color
> + pal[out->width - pal_linesize - 1] = AV_RB32(&s->transparency_color) >> 8;
> }
> }
More information about the ffmpeg-devel
mailing list