diff mbox

[FFmpeg-devel] lavc/j2kenc: Support AV_PIX_FMT_PAL8

Message ID CAB0OVGq4i5Os5H-yiOmAvRcxR-v+hwEEjO0h2AZTbefxVSf30g@mail.gmail.com
State Accepted
Headers show

Commit Message

Carl Eugen Hoyos May 22, 2018, 12:23 a.m. UTC
Hi!

Attached patch allows pal8 encoding into j2k, tested with libopenjpeg,
kakadu and jasper.

Please comment, Carl Eugen

Comments

Michael Niedermayer May 23, 2018, 11:16 p.m. UTC | #1
On Tue, May 22, 2018 at 02:23:50AM +0200, Carl Eugen Hoyos wrote:
> Hi!
> 
> Attached patch allows pal8 encoding into j2k, tested with libopenjpeg,
> kakadu and jasper.
> 
> Please comment, Carl Eugen

>  j2kenc.c  |   40 ++++++++++++++++++++++++++++++++++++----
>  version.h |    2 +-
>  2 files changed, 37 insertions(+), 5 deletions(-)
> ad57c6c2d2497b10b9a8a71642ba45740a0d1501  0001-lavc-j2kenc-Support-AV_PIX_FMT_PAL8.patch
> From ffc9968279ecbf8b0b6659e9a07539edb9787e44 Mon Sep 17 00:00:00 2001
> From: Carl Eugen Hoyos <ceffmpeg@gmail.com>
> Date: Tue, 22 May 2018 02:21:04 +0200
> Subject: [PATCH] lavc/j2kenc: Support AV_PIX_FMT_PAL8.

should be ok but please wait a day or 2 so others can comment too

thx

[...]
Carl Eugen Hoyos May 25, 2018, 6:12 p.m. UTC | #2
2018-05-24 1:16 GMT+02:00, Michael Niedermayer <michael@niedermayer.cc>:
> On Tue, May 22, 2018 at 02:23:50AM +0200, Carl Eugen Hoyos wrote:
>> Hi!
>>
>> Attached patch allows pal8 encoding into j2k, tested with libopenjpeg,
>> kakadu and jasper.
>>
>> Please comment, Carl Eugen
>
>>  j2kenc.c  |   40 ++++++++++++++++++++++++++++++++++++----
>>  version.h |    2 +-
>>  2 files changed, 37 insertions(+), 5 deletions(-)
>> ad57c6c2d2497b10b9a8a71642ba45740a0d1501
>> 0001-lavc-j2kenc-Support-AV_PIX_FMT_PAL8.patch
>> From ffc9968279ecbf8b0b6659e9a07539edb9787e44 Mon Sep 17 00:00:00 2001
>> From: Carl Eugen Hoyos <ceffmpeg@gmail.com>
>> Date: Tue, 22 May 2018 02:21:04 +0200
>> Subject: [PATCH] lavc/j2kenc: Support AV_PIX_FMT_PAL8.
>
> should be ok but please wait a day or 2 so others can comment too

Patch applied.

Thank you, Carl Eugen
diff mbox

Patch

From ffc9968279ecbf8b0b6659e9a07539edb9787e44 Mon Sep 17 00:00:00 2001
From: Carl Eugen Hoyos <ceffmpeg@gmail.com>
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 3e542af..e91d932 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 da893da..2e45d39 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, \
-- 
1.7.10.4