summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorCarl Eugen Hoyos <ceffmpeg@gmail.com>2018-05-22 02:21:04 +0200
committerCarl Eugen Hoyos <ceffmpeg@gmail.com>2018-05-25 20:09:22 +0200
commit7b51b8020c0a3099260034f59f1404bca96e9cf7 (patch)
tree2cab74b22a47b207b0425f38ab655ec6e55d816e /libavcodec
parent42b43513333275afbecfb8b57fac96f59264ab6d (diff)
lavc/j2kenc: Support AV_PIX_FMT_PAL8.
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/j2kenc.c40
-rw-r--r--libavcodec/version.h2
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, \