| @@ -86,6 +86,7 @@ typedef struct PaletteUseContext { | |||||
| uint32_t palette[AVPALETTE_COUNT]; | uint32_t palette[AVPALETTE_COUNT]; | ||||
| int palette_loaded; | int palette_loaded; | ||||
| int dither; | int dither; | ||||
| int new; | |||||
| set_frame_func set_frame; | set_frame_func set_frame; | ||||
| int bayer_scale; | int bayer_scale; | ||||
| int ordered_dither[8*8]; | int ordered_dither[8*8]; | ||||
| @@ -122,6 +123,7 @@ static const AVOption paletteuse_options[] = { | |||||
| { "bruteforce", "brute-force into the palette", 0, AV_OPT_TYPE_CONST, {.i64=COLOR_SEARCH_BRUTEFORCE}, INT_MIN, INT_MAX, FLAGS, "search" }, | { "bruteforce", "brute-force into the palette", 0, AV_OPT_TYPE_CONST, {.i64=COLOR_SEARCH_BRUTEFORCE}, INT_MIN, INT_MAX, FLAGS, "search" }, | ||||
| { "mean_err", "compute and print mean error", OFFSET(calc_mean_err), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS }, | { "mean_err", "compute and print mean error", OFFSET(calc_mean_err), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS }, | ||||
| { "debug_accuracy", "test color search accuracy", OFFSET(debug_accuracy), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS }, | { "debug_accuracy", "test color search accuracy", OFFSET(debug_accuracy), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS }, | ||||
| { "new", "take new palette for each output frame", OFFSET(new), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS }, | |||||
| { NULL } | { NULL } | ||||
| }; | }; | ||||
| @@ -928,6 +930,14 @@ static void load_palette(PaletteUseContext *s, const AVFrame *palette_frame) | |||||
| const uint32_t *p = (const uint32_t *)palette_frame->data[0]; | const uint32_t *p = (const uint32_t *)palette_frame->data[0]; | ||||
| const int p_linesize = palette_frame->linesize[0] >> 2; | const int p_linesize = palette_frame->linesize[0] >> 2; | ||||
| if (s->new) { | |||||
| memset(s->palette, 0, sizeof(s->palette)); | |||||
| memset(s->map, 0, sizeof(s->map)); | |||||
| for (i = 0; i < CACHE_SIZE; i++) | |||||
| av_freep(&s->cache[i].entries); | |||||
| memset(s->cache, 0, sizeof(s->cache)); | |||||
| } | |||||
| i = 0; | i = 0; | ||||
| for (y = 0; y < palette_frame->height; y++) { | for (y = 0; y < palette_frame->height; y++) { | ||||
| for (x = 0; x < palette_frame->width; x++) | for (x = 0; x < palette_frame->width; x++) | ||||
| @@ -937,7 +947,8 @@ static void load_palette(PaletteUseContext *s, const AVFrame *palette_frame) | |||||
| load_colormap(s); | load_colormap(s); | ||||
| s->palette_loaded = 1; | |||||
| if (!s->new) | |||||
| s->palette_loaded = 1; | |||||
| } | } | ||||
| static AVFrame *load_apply_palette(AVFilterContext *ctx, AVFrame *main, | static AVFrame *load_apply_palette(AVFilterContext *ctx, AVFrame *main, | ||||