X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fj2kenc.c;h=38643c9a28c150a80781e06b49581eac167bcaed;hb=c63c303a1f2b58677d480505ec93a90f77dd25b5;hp=3e542af3c66b6a989e636cf6ecaea12039fdd610;hpb=b14761d1f8372dfe558193b8b754b9f1a858077d;p=ffmpeg diff --git a/libavcodec/j2kenc.c b/libavcodec/j2kenc.c index 3e542af3c66..38643c9a28c 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) @@ -520,13 +521,13 @@ static void init_luts(void) mask = ~((1<> (NMSEDEC_BITS-2)&2) + 1; - lut_nmsedec_ref[i] = FFMAX((-2*i + (1<i_data[(comp->coord[0][1] - comp->coord[0][0]) * y + x] << NMSEDEC_FRACBITS; + *ptr++ = comp->i_data[(comp->coord[0][1] - comp->coord[0][0]) * y + x] * (1 << NMSEDEC_FRACBITS); } } } else{ @@ -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,