summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Herkt <lachs0r@srsfckn.biz>2013-06-15 15:14:06 +0200
committerMartin Herkt <lachs0r@srsfckn.biz>2013-06-15 15:48:52 +0200
commit9b5a98676d18156d56fabae52dbc1d918e4401d4 (patch)
tree20ae40f29e87dd2238b9757b22c0d543fada22e1
parent3c12148668ac70366ec48af2c61777db744eba66 (diff)
downloadmpv-9b5a98676d18156d56fabae52dbc1d918e4401d4.tar.bz2
mpv-9b5a98676d18156d56fabae52dbc1d918e4401d4.tar.xz
image_writer: Add PNG filter option (default "mixed")
The use of filters prior to PNG compression can greatly improve compression ratio, with "mixed" (ImageMagick calls it "adaptive") typically achieving the best results.
-rw-r--r--DOCS/man/en/options.rst6
-rw-r--r--DOCS/man/en/vo.rst3
-rw-r--r--video/image_writer.c6
-rw-r--r--video/image_writer.h1
4 files changed, 15 insertions, 1 deletions
diff --git a/DOCS/man/en/options.rst b/DOCS/man/en/options.rst
index f8a999758e..516d485c7e 100644
--- a/DOCS/man/en/options.rst
+++ b/DOCS/man/en/options.rst
@@ -1791,6 +1791,12 @@
to write a screenshot. Too high compression might occupy enough CPU time to
interrupt playback. The default is 7.
+--screenshot-png-filter=<0-5>
+ Set the filter applied prior to PNG compression. 0 is none, 1 is "sub", 2 is
+ "up", 3 is "average", 4 is "Paeth", and 5 is "mixed". This affects the level
+ of compression that can be achieved. For most images, "mixed" achieves the
+ best compression ratio, hence it is the default.
+
--screenshot-template=<template>
Specify the filename template used to save screenshots. The template
specifies the filename without file extension, and can contain format
diff --git a/DOCS/man/en/vo.rst b/DOCS/man/en/vo.rst
index 251e71ce03..079e146f8a 100644
--- a/DOCS/man/en/vo.rst
+++ b/DOCS/man/en/vo.rst
@@ -708,6 +708,9 @@ image
png-compression=<0-9>
PNG compression factor (speed vs. file size tradeoff) (default: 7)
+ 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>
JPEG quality factor (default: 90)
[no-]jpeg-progressive
diff --git a/video/image_writer.c b/video/image_writer.c
index a65024124e..1791c01a38 100644
--- a/video/image_writer.c
+++ b/video/image_writer.c
@@ -46,6 +46,7 @@
const struct image_writer_opts image_writer_opts_defaults = {
.format = "jpg",
.png_compression = 7,
+ .png_filter = 5,
.jpeg_quality = 90,
.jpeg_optimize = 100,
.jpeg_smooth = 0,
@@ -65,6 +66,7 @@ const struct m_sub_options image_writer_conf = {
OPT_FLAG("jpeg-progressive", jpeg_progressive, 0),
OPT_FLAG("jpeg-baseline", jpeg_baseline, 0),
OPT_INTRANGE("png-compression", png_compression, 0, 0, 9),
+ OPT_INTRANGE("png-filter", png_filter, 0, 0, 5),
OPT_STRING("format", format, 0),
{0},
},
@@ -105,8 +107,10 @@ static int write_lavc(struct image_writer_ctx *ctx, mp_image_t *image, FILE *fp)
avctx->width = image->w;
avctx->height = image->h;
avctx->pix_fmt = imgfmt2pixfmt(image->imgfmt);
- if (ctx->writer->lavc_codec == AV_CODEC_ID_PNG)
+ if (ctx->writer->lavc_codec == AV_CODEC_ID_PNG) {
avctx->compression_level = ctx->opts->png_compression;
+ avctx->prediction_method = ctx->opts->png_filter;
+ }
if (avcodec_open2(avctx, codec, NULL) < 0) {
print_open_fail:
diff --git a/video/image_writer.h b/video/image_writer.h
index e73b526c7e..4f5942edb5 100644
--- a/video/image_writer.h
+++ b/video/image_writer.h
@@ -21,6 +21,7 @@ struct mp_csp_details;
struct image_writer_opts {
char *format;
int png_compression;
+ int png_filter;
int jpeg_quality;
int jpeg_optimize;
int jpeg_smooth;