Commit bc63a760 authored by Andrey Utkin's avatar Andrey Utkin Committed by Michael Niedermayer

pngenc: Add 'dpi', 'dpm' options

Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent c0a30dd2
...@@ -777,6 +777,19 @@ Override the x264 configuration using a :-separated list of key=value parameters ...@@ -777,6 +777,19 @@ Override the x264 configuration using a :-separated list of key=value parameters
Encoding avpresets for common usages are provided so they can be used with the Encoding avpresets for common usages are provided so they can be used with the
general presets system (e.g. passing the @code{-pre} option). general presets system (e.g. passing the @code{-pre} option).
@section png
PNG image encoder.
@subsection Private options
@table @option
@item dpi @var{integer}
Set physical density of pixels, in dots per inch, unset by default
@item dpm @var{integer}
Set physical density of pixels, in dots per meter, unset by default
@end table
@section ProRes @section ProRes
Apple ProRes encoder. Apple ProRes encoder.
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "png.h" #include "png.h"
#include "libavutil/avassert.h" #include "libavutil/avassert.h"
#include "libavutil/opt.h"
/* TODO: /* TODO:
* - add 2, 4 and 16 bit depth support * - add 2, 4 and 16 bit depth support
...@@ -37,6 +38,7 @@ ...@@ -37,6 +38,7 @@
#define IOBUF_SIZE 4096 #define IOBUF_SIZE 4096
typedef struct PNGEncContext { typedef struct PNGEncContext {
AVClass *class;
DSPContext dsp; DSPContext dsp;
uint8_t *bytestream; uint8_t *bytestream;
...@@ -48,6 +50,8 @@ typedef struct PNGEncContext { ...@@ -48,6 +50,8 @@ typedef struct PNGEncContext {
z_stream zstream; z_stream zstream;
uint8_t buf[IOBUF_SIZE]; uint8_t buf[IOBUF_SIZE];
int dpi; ///< Physical pixel density, in dots per inch, if set
int dpm; ///< Physical pixel density, in dots per meter, if set
} PNGEncContext; } PNGEncContext;
static void png_get_interlaced_row(uint8_t *dst, int row_size, static void png_get_interlaced_row(uint8_t *dst, int row_size,
...@@ -331,9 +335,15 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, ...@@ -331,9 +335,15 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
png_write_chunk(&s->bytestream, MKTAG('I', 'H', 'D', 'R'), s->buf, 13); png_write_chunk(&s->bytestream, MKTAG('I', 'H', 'D', 'R'), s->buf, 13);
if (s->dpm) {
AV_WB32(s->buf, s->dpm);
AV_WB32(s->buf + 4, s->dpm);
s->buf[8] = 1; /* unit specifier is meter */
} else {
AV_WB32(s->buf, avctx->sample_aspect_ratio.num); AV_WB32(s->buf, avctx->sample_aspect_ratio.num);
AV_WB32(s->buf + 4, avctx->sample_aspect_ratio.den); AV_WB32(s->buf + 4, avctx->sample_aspect_ratio.den);
s->buf[8] = 0; /* unit specifier is unknown */ s->buf[8] = 0; /* unit specifier is unknown */
}
png_write_chunk(&s->bytestream, MKTAG('p', 'H', 'Y', 's'), s->buf, 9); png_write_chunk(&s->bytestream, MKTAG('p', 'H', 'Y', 's'), s->buf, 9);
/* put the palette if needed */ /* put the palette if needed */
...@@ -458,9 +468,31 @@ static av_cold int png_enc_init(AVCodecContext *avctx){ ...@@ -458,9 +468,31 @@ static av_cold int png_enc_init(AVCodecContext *avctx){
if(avctx->pix_fmt == AV_PIX_FMT_MONOBLACK) if(avctx->pix_fmt == AV_PIX_FMT_MONOBLACK)
s->filter_type = PNG_FILTER_VALUE_NONE; s->filter_type = PNG_FILTER_VALUE_NONE;
if (s->dpi && s->dpm) {
av_log(avctx, AV_LOG_ERROR, "Only one of 'dpi' or 'dpm' options should be set\n");
return AVERROR(EINVAL);
} else if (s->dpi) {
s->dpm = s->dpi * 10000 / 254;
}
return 0; return 0;
} }
#define OFFSET(x) offsetof(PNGEncContext, x)
#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
static const AVOption options[] = {
{"dpi", "Set image resolution (in dots per inch)", OFFSET(dpi), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 0x10000, VE},
{"dpm", "Set image resolution (in dots per meter)", OFFSET(dpm), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 0x10000, VE},
{ NULL }
};
static const AVClass pngenc_class = {
.class_name = "PNG encoder",
.item_name = av_default_item_name,
.option = options,
.version = LIBAVUTIL_VERSION_INT,
};
AVCodec ff_png_encoder = { AVCodec ff_png_encoder = {
.name = "png", .name = "png",
.type = AVMEDIA_TYPE_VIDEO, .type = AVMEDIA_TYPE_VIDEO,
...@@ -478,4 +510,5 @@ AVCodec ff_png_encoder = { ...@@ -478,4 +510,5 @@ AVCodec ff_png_encoder = {
AV_PIX_FMT_MONOBLACK, AV_PIX_FMT_NONE AV_PIX_FMT_MONOBLACK, AV_PIX_FMT_NONE
}, },
.long_name = NULL_IF_CONFIG_SMALL("PNG (Portable Network Graphics) image"), .long_name = NULL_IF_CONFIG_SMALL("PNG (Portable Network Graphics) image"),
.priv_class = &pngenc_class,
}; };
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment