From 541bfba85d544ff31dc6bc48977928f51c143d0f Mon Sep 17 00:00:00 2001 From: Carl Eugen Hoyos Date: Tue, 8 May 2012 11:02:12 +0200 Subject: Write palettised targa. Fixes ticket #1190. Reviewed-by: Paul B Mahol --- libavcodec/targaenc.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'libavcodec/targaenc.c') diff --git a/libavcodec/targaenc.c b/libavcodec/targaenc.c index 833b563e79..a6879e359d 100644 --- a/libavcodec/targaenc.c +++ b/libavcodec/targaenc.c @@ -78,7 +78,7 @@ static int targa_encode_normal(uint8_t *outbuf, const AVFrame *pic, int bpp, int static int targa_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *p, int *got_packet) { - int bpp, picsize, datasize = -1, ret; + int bpp, picsize, datasize = -1, ret, i; uint8_t *out; if(avctx->width > 0xffff || avctx->height > 0xffff) { @@ -96,8 +96,20 @@ static int targa_encode_frame(AVCodecContext *avctx, AVPacket *pkt, /* image descriptor byte: origin is always top-left, bits 0-3 specify alpha */ pkt->data[17] = 0x20 | (avctx->pix_fmt == PIX_FMT_BGRA ? 8 : 0); + out = pkt->data + 18; /* skip past the header we write */ + avctx->bits_per_coded_sample = av_get_bits_per_pixel(&av_pix_fmt_descriptors[avctx->pix_fmt]); switch(avctx->pix_fmt) { + case PIX_FMT_PAL8: + pkt->data[1] = 1; /* palette present */ + pkt->data[2] = TGA_PAL; /* uncompressed palettised image */ + pkt->data[6] = 1; /* palette contains 256 entries */ + pkt->data[7] = 24; /* palette contains 24 bit entries */ + pkt->data[16] = 8; /* bpp */ + for (i = 0; i < 256; i++) + AV_WL24(pkt->data + 18 + 3 * i, *(uint32_t *)(p->data[1] + i * 4)); + out += 256 * 3; /* skip past the palette we just output */ + break; case PIX_FMT_GRAY8: pkt->data[2] = TGA_BW; /* uncompressed grayscale image */ avctx->bits_per_coded_sample = 0x28; @@ -123,8 +135,6 @@ static int targa_encode_frame(AVCodecContext *avctx, AVPacket *pkt, } bpp = pkt->data[16] >> 3; - out = pkt->data + 18; /* skip past the header we just output */ - /* try RLE compression */ if (avctx->coder_type != FF_CODER_TYPE_RAW) datasize = targa_encode_rle(out, picsize, p, bpp, avctx->width, avctx->height); @@ -170,7 +180,7 @@ AVCodec ff_targa_encoder = { .init = targa_encode_init, .encode2 = targa_encode_frame, .pix_fmts = (const enum PixelFormat[]){ - PIX_FMT_BGR24, PIX_FMT_BGRA, PIX_FMT_RGB555LE, PIX_FMT_GRAY8, + PIX_FMT_BGR24, PIX_FMT_BGRA, PIX_FMT_RGB555LE, PIX_FMT_GRAY8, PIX_FMT_PAL8, PIX_FMT_NONE }, .long_name= NULL_IF_CONFIG_SMALL("Truevision Targa image"), -- cgit v1.2.3