[FFmpeg-devel] [PATCH 2/3] lavc/libopenjpegenc: add layerrates parameter to allow different compression rates per layer
Jean First
jeanfirst at gmail.com
Wed Jan 28 16:41:25 CET 2015
syntax is: 20,10,2
this adds 3 layers, the first with a 20x, the second with 10x and
a third with 2x compression.
Layers define the progression by image quality within the code stream and,
although not defined by the JPEG 2000 standard, in general codecs try to
build layers in such a way that the image quality will increase monotonically
with each layer.
Signed-off-by: Jean First <jeanfirst at gmail.com>
---
it remove the numlayers parameter, but i'm not sure it ever worked. Unfortunately
the j2k_dump provided by openjpeg won't show the individual rates per layer - I
also tried the files provided in http://samples.ffmpeg.org/jpeg2000/fdis_j2kp4files.zip
and the rates shown are always 0.0
TODO: Write the libopenjpegenc documentation
libavcodec/libopenjpegenc.c | 21 ++++++++++++++++++---
1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/libavcodec/libopenjpegenc.c b/libavcodec/libopenjpegenc.c
index bbf6190..b9a8bac 100644
--- a/libavcodec/libopenjpegenc.c
+++ b/libavcodec/libopenjpegenc.c
@@ -56,6 +56,8 @@ typedef struct {
int disto_alloc;
int fixed_alloc;
int fixed_quality;
+ char *layerrates;
+ float tcp_rates[100]; /** User specified rate stored in case of cinema option */
} LibOpenJPEGContext;
static void error_callback(const char *msg, void *data)
@@ -224,8 +226,21 @@ static av_cold int libopenjpeg_encode_init(AVCodecContext *avctx)
ctx->enc_params.cp_disto_alloc = ctx->disto_alloc;
ctx->enc_params.cp_fixed_alloc = ctx->fixed_alloc;
ctx->enc_params.cp_fixed_quality = ctx->fixed_quality;
- ctx->enc_params.tcp_numlayers = ctx->numlayers;
- ctx->enc_params.tcp_rates[0] = FFMAX(avctx->compression_level, 0) * 2;
+ ctx->enc_params.tcp_numlayers = 0;
+
+ char *s = ctx->layerrates;
+ while (sscanf(s, "%f", &ctx->tcp_rates[ctx->enc_params.tcp_numlayers]) == 1) {
+ ctx->enc_params.tcp_numlayers++;
+ while (*s && *s != ',')
+ s++;
+ if (!*s)
+ break;
+ s++;
+ }
+ if (ctx->enc_params.tcp_numlayers < 1){
+ ctx->enc_params.tcp_numlayers = 1;
+ ctx->tcp_rates[0] = FFMAX(avctx->compression_level, 0) * 2;
+ }
if (ctx->cinema_mode > 0) {
cinema_parameters(&ctx->enc_params);
@@ -629,7 +644,7 @@ static const AVOption options[] = {
{ "pcrl", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PCRL }, 0, 0, VE, "prog_order" },
{ "cprl", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CPRL }, 0, 0, VE, "prog_order" },
{ "numresolution", NULL, OFFSET(numresolution), AV_OPT_TYPE_INT, { .i64 = 6 }, 1, INT_MAX, VE },
- { "numlayers", NULL, OFFSET(numlayers), AV_OPT_TYPE_INT, { .i64 = 1 }, 1, 10, VE },
+ { "layerrates", "Layer compression rates", OFFSET(layerrates), AV_OPT_TYPE_STRING, { .str = "auto" }, 0, 0, VE },
{ "disto_alloc", NULL, OFFSET(disto_alloc), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, VE },
{ "fixed_alloc", NULL, OFFSET(fixed_alloc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
{ "fixed_quality", NULL, OFFSET(fixed_quality), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
--
2.2.2
More information about the ffmpeg-devel
mailing list