From 9e6b9d8a982eb07a05fd059a92f1d6b2f01460a0 Mon Sep 17 00:00:00 2001 From: wm4 Date: Mon, 5 Sep 2016 21:04:55 +0200 Subject: vo_image: move to global options This is a bit "special", because the config tree wants unique m_sub_options pointers in the whole thing. --- DOCS/man/vo.rst | 22 ++++++++++++---------- options/options.c | 10 ++++++++-- video/image_writer.c | 24 ++++++++++-------------- video/image_writer.h | 4 +++- video/out/vo_image.c | 49 +++++++++++++++++++++++++++++++++++++++---------- 5 files changed, 72 insertions(+), 37 deletions(-) diff --git a/DOCS/man/vo.rst b/DOCS/man/vo.rst index b521f51f00..f9d02ec98b 100644 --- a/DOCS/man/vo.rst +++ b/DOCS/man/vo.rst @@ -381,7 +381,9 @@ Available video output drivers are: Output each frame into an image file in the current directory. Each file takes the frame number padded with leading zeros as name. - ``format=`` + The following global options are supported by this video output: + + ``--vo-image-format=`` Select the image file format. jpg @@ -399,24 +401,24 @@ Available video output drivers are: tga Truevision TGA. - ``png-compression=<0-9>`` + ``--vo-image-png-compression=<0-9>`` PNG compression factor (speed vs. file size tradeoff) (default: 7) - ``png-filter=<0-5>`` + ``--vo-image-png-filter=<0-5>`` Filter applied prior to PNG compression (0 = none; 1 = sub; 2 = up; 3 = average; 4 = Paeth; 5 = mixed) (default: 5) - ``jpeg-quality=<0-100>`` + ``--vo-image-jpeg-quality=<0-100>`` JPEG quality factor (default: 90) - ``(no-)jpeg-progressive`` + ``--vo-image-jpeg-progressive=`` Specify standard or progressive JPEG (default: no). - ``(no-)jpeg-baseline`` + ``--vo-image-jpeg-baseline=`` Specify use of JPEG baseline or not (default: yes). - ``jpeg-optimize=<0-100>`` + ``--vo-image-jpeg-optimize=<0-100>`` JPEG optimization factor (default: 100) - ``jpeg-smooth=<0-100>`` + ``--vo-image-jpeg-smooth=<0-100>`` smooth factor (default: 0) - ``jpeg-dpi=<1->`` + ``--vo-image-jpeg-dpi=<1->`` JPEG DPI (default: 72) - ``outdir=`` + ``--vo-image-outdir=`` Specify the directory to save the image files to (default: ``./``). ``wayland`` (Wayland only) diff --git a/options/options.c b/options/options.c index e5de82d8a3..e2bd3d8d95 100644 --- a/options/options.c +++ b/options/options.c @@ -40,6 +40,7 @@ #include "stream/stream.h" #include "video/csputils.h" #include "video/hwdec.h" +#include "video/image_writer.h" #include "sub/osd.h" #include "audio/filter/af.h" #include "audio/decode/dec_audio.h" @@ -72,7 +73,6 @@ extern const struct m_sub_options vd_lavc_conf; extern const struct m_sub_options ad_lavc_conf; extern const struct m_sub_options input_config; extern const struct m_sub_options encode_config; -extern const struct m_sub_options image_writer_conf; extern const struct m_sub_options gl_video_conf; extern const struct m_sub_options ao_alsa_conf; @@ -99,6 +99,12 @@ const struct m_opt_choice_alternatives mp_hwdec_names[] = { {0} }; +static const struct m_sub_options screenshot_conf = { + .opts = image_writer_opts, + .size = sizeof(struct image_writer_opts), + .defaults = &image_writer_opts_defaults, +}; + #define OPT_BASE_STRUCT struct mp_vo_opts static const m_option_t mp_vo_opt_list[] = { @@ -632,7 +638,7 @@ const m_option_t mp_opts[] = { OPT_STRING("input-file", input_file, M_OPT_FILE | M_OPT_GLOBAL), OPT_STRING("input-ipc-server", ipc_path, M_OPT_FILE | M_OPT_FIXED), - OPT_SUBSTRUCT("screenshot", screenshot_image_opts, image_writer_conf, 0), + OPT_SUBSTRUCT("screenshot", screenshot_image_opts, screenshot_conf, 0), OPT_STRING("screenshot-template", screenshot_template, 0), OPT_STRING("screenshot-directory", screenshot_directory, 0), diff --git a/video/image_writer.c b/video/image_writer.c index 6b2f0f9a92..8a5980c98e 100644 --- a/video/image_writer.c +++ b/video/image_writer.c @@ -54,20 +54,16 @@ const struct image_writer_opts image_writer_opts_defaults = { #define OPT_BASE_STRUCT struct image_writer_opts -const struct m_sub_options image_writer_conf = { - .opts = (const m_option_t[]) { - OPT_INTRANGE("jpeg-quality", jpeg_quality, 0, 0, 100), - OPT_INTRANGE("jpeg-smooth", jpeg_smooth, 0, 0, 100), - OPT_FLAG("jpeg-source-chroma", jpeg_source_chroma, 0), - OPT_INTRANGE("png-compression", png_compression, 0, 0, 9), - OPT_INTRANGE("png-filter", png_filter, 0, 0, 5), - OPT_STRING("format", format, 0), - OPT_FLAG("high-bit-depth", high_bit_depth, 0), - OPT_FLAG("tag-colorspace", tag_csp, 0), - {0}, - }, - .size = sizeof(struct image_writer_opts), - .defaults = &image_writer_opts_defaults, +const struct m_option image_writer_opts[] = { + OPT_INTRANGE("jpeg-quality", jpeg_quality, 0, 0, 100), + OPT_INTRANGE("jpeg-smooth", jpeg_smooth, 0, 0, 100), + OPT_FLAG("jpeg-source-chroma", jpeg_source_chroma, 0), + OPT_INTRANGE("png-compression", png_compression, 0, 0, 9), + OPT_INTRANGE("png-filter", png_filter, 0, 0, 5), + OPT_STRING("format", format, 0), + OPT_FLAG("high-bit-depth", high_bit_depth, 0), + OPT_FLAG("tag-colorspace", tag_csp, 0), + {0}, }; struct image_writer_ctx { diff --git a/video/image_writer.h b/video/image_writer.h index ce8438aed6..8b7414b62a 100644 --- a/video/image_writer.h +++ b/video/image_writer.h @@ -15,6 +15,8 @@ * with mpv. If not, see . */ +#include "options/m_option.h" + struct mp_image; struct mp_log; @@ -35,7 +37,7 @@ struct image_writer_opts { extern const struct image_writer_opts image_writer_opts_defaults; -extern const struct m_sub_options image_writer_conf; +extern const struct m_option image_writer_opts[]; // Return the file extension that will be used, e.g. "png". const char *image_writer_file_ext(const struct image_writer_opts *opts); diff --git a/video/out/vo_image.c b/video/out/vo_image.c index a848c69289..f799a97fe9 100644 --- a/video/out/vo_image.c +++ b/video/out/vo_image.c @@ -27,6 +27,7 @@ #include "config.h" #include "misc/bstr.h" #include "osdep/io.h" +#include "options/m_config.h" #include "options/path.h" #include "mpv_talloc.h" #include "common/common.h" @@ -40,9 +41,30 @@ #include "sub/osd.h" #include "options/m_option.h" -struct priv { +static const struct m_sub_options image_writer_conf = { + .opts = image_writer_opts, + .size = sizeof(struct image_writer_opts), + .defaults = &image_writer_opts_defaults, +}; + +struct vo_image_opts { struct image_writer_opts *opts; char *outdir; +}; + +#define OPT_BASE_STRUCT struct vo_image_opts + +static const struct m_sub_options vo_image_conf = { + .opts = (const struct m_option[]) { + OPT_SUBSTRUCT("vo-image", opts, image_writer_conf, 0), + OPT_STRING("vo-image-outdir", outdir, 0), + {0}, + }, + .size = sizeof(struct vo_image_opts), +}; + +struct priv { + struct vo_image_opts *opts; struct mp_image *current; int frame; @@ -92,13 +114,13 @@ static void flip_page(struct vo *vo) void *t = talloc_new(NULL); char *filename = talloc_asprintf(t, "%08d.%s", p->frame, - image_writer_file_ext(p->opts)); + image_writer_file_ext(p->opts->opts)); - if (p->outdir && strlen(p->outdir)) - filename = mp_path_join(t, p->outdir, filename); + if (p->opts->outdir && strlen(p->opts->outdir)) + filename = mp_path_join(t, p->opts->outdir, filename); MP_INFO(vo, "Saving %s\n", filename); - write_image(p->current, p->opts, filename, vo->log); + write_image(p->current, p->opts->opts, filename, vo->log); talloc_free(t); mp_image_unrefp(&p->current); @@ -121,7 +143,8 @@ static void uninit(struct vo *vo) static int preinit(struct vo *vo) { struct priv *p = vo->priv; - if (p->outdir && !checked_mkdir(vo, p->outdir)) + p->opts = mp_get_config_group(vo, vo->global, &vo_image_conf); + if (p->opts->outdir && !checked_mkdir(vo, p->opts->outdir)) return -1; return 0; } @@ -131,8 +154,6 @@ static int control(struct vo *vo, uint32_t request, void *data) return VO_NOTIMPL; } -#define OPT_BASE_STRUCT struct priv - const struct vo_driver video_out_image = { .description = "Write video frames to image files", @@ -140,8 +161,15 @@ const struct vo_driver video_out_image = .untimed = true, .priv_size = sizeof(struct priv), .options = (const struct m_option[]) { - OPT_SUBSTRUCT("", opts, image_writer_conf, 0), - OPT_STRING("outdir", outdir, 0), + OPT_SUBOPT_LEGACY("jpeg-quality", "vo-image-jpeg-quality"), + OPT_SUBOPT_LEGACY("jpeg-smooth", "vo-image-jpeg-smooth"), + OPT_SUBOPT_LEGACY("jpeg-source-chroma", "vo-image-jpeg-source-chroma"), + OPT_SUBOPT_LEGACY("png-compression", "vo-image-png-compression"), + OPT_SUBOPT_LEGACY("png-filter", "vo-image-png-filter"), + OPT_SUBOPT_LEGACY("format", "vo-image-format"), + OPT_SUBOPT_LEGACY("high-bit-depth", "vo-image-high-bit-depth"), + OPT_SUBOPT_LEGACY("tag-colorspace", "vo-image-tag-colorspace"), + OPT_SUBOPT_LEGACY("outdir", "vo-image-outdir"), {0}, }, .preinit = preinit, @@ -151,4 +179,5 @@ const struct vo_driver video_out_image = .draw_image = draw_image, .flip_page = flip_page, .uninit = uninit, + .global_opts = &vo_image_conf, }; -- cgit v1.2.3