From 7b51b8020c0a3099260034f59f1404bca96e9cf7 Mon Sep 17 00:00:00 2001 From: Carl Eugen Hoyos Date: Tue, 22 May 2018 02:21:04 +0200 Subject: [PATCH] lavc/j2kenc: Support AV_PIX_FMT_PAL8. --- libavcodec/j2kenc.c | 40 ++++++++++++++++++++++++++++++++++++---- libavcodec/version.h | 2 +- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/libavcodec/j2kenc.c b/libavcodec/j2kenc.c index 3e542af3c6..e91d932bb7 100644 --- a/libavcodec/j2kenc.c +++ b/libavcodec/j2kenc.c @@ -71,6 +71,7 @@ #include "libavutil/common.h" #include "libavutil/pixdesc.h" #include "libavutil/opt.h" +#include "libavutil/intreadwrite.h" #define NMSEDEC_BITS 7 #define NMSEDEC_FRACBITS (NMSEDEC_BITS-1) @@ -1054,14 +1055,38 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, bytestream_put_byte(&s->buf, 1); bytestream_put_byte(&s->buf, 0); bytestream_put_byte(&s->buf, 0); - if (s->ncomponents == 1) { - bytestream_put_be32(&s->buf, 17); - } else if (avctx->pix_fmt == AV_PIX_FMT_RGB24) { + if (avctx->pix_fmt == AV_PIX_FMT_RGB24 || avctx->pix_fmt == AV_PIX_FMT_PAL8) { bytestream_put_be32(&s->buf, 16); + } else if (s->ncomponents == 1) { + bytestream_put_be32(&s->buf, 17); } else { bytestream_put_be32(&s->buf, 18); } update_size(chunkstart, s->buf); + if (avctx->pix_fmt == AV_PIX_FMT_PAL8) { + int i; + uint8_t *palette = pict->data[1]; + chunkstart = s->buf; + bytestream_put_be32(&s->buf, 0); + bytestream_put_buffer(&s->buf, "pclr", 4); + bytestream_put_be16(&s->buf, AVPALETTE_COUNT); + bytestream_put_byte(&s->buf, 3); // colour channels + bytestream_put_be24(&s->buf, 0x070707); //colour depths + for (i = 0; i < AVPALETTE_COUNT; i++) { + bytestream_put_be24(&s->buf, HAVE_BIGENDIAN ? AV_RB24(palette + 1) : AV_RL24(palette)); + palette += 4; + } + update_size(chunkstart, s->buf); + chunkstart = s->buf; + bytestream_put_be32(&s->buf, 0); + bytestream_put_buffer(&s->buf, "cmap", 4); + for (i = 0; i < 3; i++) { + bytestream_put_be16(&s->buf, 0); // component + bytestream_put_byte(&s->buf, 1); // palette mapping + bytestream_put_byte(&s->buf, i); // index + } + update_size(chunkstart, s->buf); + } update_size(jp2hstart, s->buf); jp2cstart = s->buf; @@ -1124,6 +1149,12 @@ FF_DISABLE_DEPRECATION_WARNINGS FF_ENABLE_DEPRECATION_WARNINGS #endif + if (avctx->pix_fmt == AV_PIX_FMT_PAL8 && (s->pred != FF_DWT97_INT || s->format != CODEC_JP2)) { + av_log(s->avctx, AV_LOG_WARNING, "Forcing lossless jp2 for pal8\n"); + s->pred = FF_DWT97_INT; + s->format = CODEC_JP2; + } + // defaults: // TODO: implement setting non-standard precinct size memset(codsty->log2_prec_widths , 15, sizeof(codsty->log2_prec_widths )); @@ -1154,7 +1185,7 @@ FF_ENABLE_DEPRECATION_WARNINGS if (avctx->pix_fmt == AV_PIX_FMT_RGB24){ s->ncomponents = 3; - } else if (avctx->pix_fmt == AV_PIX_FMT_GRAY8){ + } else if (avctx->pix_fmt == AV_PIX_FMT_GRAY8 || avctx->pix_fmt == AV_PIX_FMT_PAL8){ s->ncomponents = 1; } else{ // planar YUV s->planar = 1; @@ -1223,6 +1254,7 @@ AVCodec ff_jpeg2000_encoder = { AV_PIX_FMT_RGB24, AV_PIX_FMT_YUV444P, AV_PIX_FMT_GRAY8, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV411P, + AV_PIX_FMT_PAL8, AV_PIX_FMT_NONE }, .priv_class = &j2k_class, diff --git a/libavcodec/version.h b/libavcodec/version.h index da893dacf1..2e45d39a56 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -29,7 +29,7 @@ #define LIBAVCODEC_VERSION_MAJOR 58 #define LIBAVCODEC_VERSION_MINOR 19 -#define LIBAVCODEC_VERSION_MICRO 102 +#define LIBAVCODEC_VERSION_MICRO 103 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \