avcodec: add XBM encoder
authorPaul B Mahol <onemda@gmail.com>
Sat, 17 Mar 2012 17:43:58 +0000 (17:43 +0000)
committerJustin Ruggles <justin.ruggles@gmail.com>
Sat, 17 Mar 2012 19:45:04 +0000 (15:45 -0400)
Signed-off-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Justin Ruggles <justin.ruggles@gmail.com>
Changelog
doc/general.texi
libavcodec/Makefile
libavcodec/allcodecs.c
libavcodec/avcodec.h
libavcodec/version.h
libavcodec/xbmenc.c [new file with mode: 0644]
libavformat/img2.c
libavformat/img2enc.c

index 8703955..58ba986 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -12,6 +12,7 @@ version <next>:
 - remove libpostproc
 - ID3v2 attached pictures reading and writing
 - WMA Lossless decoder
+- XBM encoder
 
 
 version 0.8:
index d3b3177..88949c6 100644 (file)
@@ -381,6 +381,8 @@ following image formats are supported:
     @tab YUV, JPEG and some extension is not supported yet.
 @item Truevision Targa  @tab X @tab X
     @tab Targa (.TGA) image format
+@item XBM  @tab X @tab
+    @tab X BitMap image format
 @item XWD  @tab X @tab X
     @tab X Window Dump image format
 @end multitable
index 0f1c728..95ed39a 100644 (file)
@@ -440,6 +440,7 @@ OBJS-$(CONFIG_WS_SND1_DECODER)         += ws-snd1.o
 OBJS-$(CONFIG_XAN_DPCM_DECODER)        += dpcm.o
 OBJS-$(CONFIG_XAN_WC3_DECODER)         += xan.o
 OBJS-$(CONFIG_XAN_WC4_DECODER)         += xxan.o
+OBJS-$(CONFIG_XBM_ENCODER)             += xbmenc.o
 OBJS-$(CONFIG_XL_DECODER)              += xl.o
 OBJS-$(CONFIG_XSUB_DECODER)            += xsubdec.o
 OBJS-$(CONFIG_XSUB_ENCODER)            += xsubenc.o
index 166f1fd..615946a 100644 (file)
@@ -230,6 +230,7 @@ void avcodec_register_all(void)
     REGISTER_DECODER (WNV1, wnv1);
     REGISTER_DECODER (XAN_WC3, xan_wc3);
     REGISTER_DECODER (XAN_WC4, xan_wc4);
+    REGISTER_ENCODER (XBM, xbm);
     REGISTER_DECODER (XL, xl);
     REGISTER_ENCDEC  (XWD, xwd);
     REGISTER_DECODER (YOP, yop);
index 7074b58..9f4aaa9 100644 (file)
@@ -245,6 +245,7 @@ enum CodecID {
     CODEC_ID_V410,
     CODEC_ID_XWD,
     CODEC_ID_CDXL,
+    CODEC_ID_XBM,
 
     /* various PCM "codecs" */
     CODEC_ID_FIRST_AUDIO = 0x10000,     ///< A dummy id pointing at the start of audio codecs
index 2398cca..4573568 100644 (file)
@@ -21,7 +21,7 @@
 #define AVCODEC_VERSION_H
 
 #define LIBAVCODEC_VERSION_MAJOR 54
-#define LIBAVCODEC_VERSION_MINOR  8
+#define LIBAVCODEC_VERSION_MINOR  9
 #define LIBAVCODEC_VERSION_MICRO  0
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
diff --git a/libavcodec/xbmenc.c b/libavcodec/xbmenc.c
new file mode 100644 (file)
index 0000000..2df6ae0
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * XBM image format
+ *
+ * Copyright (c) 2012 Paul B Mahol
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "avcodec.h"
+#include "internal.h"
+
+static av_cold int xbm_encode_init(AVCodecContext *avctx)
+{
+    avctx->coded_frame = avcodec_alloc_frame();
+    if (!avctx->coded_frame)
+        return AVERROR(ENOMEM);
+    avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I;
+
+    return 0;
+}
+
+static int xbm_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
+                            const AVFrame *p, int *got_packet)
+{
+    int i, j, ret, size, linesize;
+    uint8_t *ptr, *buf;
+
+    linesize = (avctx->width + 7) / 8;
+    size     = avctx->height * (linesize * 7 + 2) + 110;
+    if ((ret = ff_alloc_packet(pkt, size)) < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Error getting output packet.\n");
+        return ret;
+    }
+
+    buf = pkt->data;
+    ptr = p->data[0];
+
+    buf += snprintf(buf, 32, "#define image_width %u\n", avctx->width);
+    buf += snprintf(buf, 33, "#define image_height %u\n", avctx->height);
+    buf += snprintf(buf, 40, "static unsigned char image_bits[] = {\n");
+    for (i = 0; i < avctx->height; i++) {
+        for (j = 0; j < linesize; j++)
+            buf += snprintf(buf, 7, " 0x%02X,", av_reverse[*ptr++]);
+        ptr += p->linesize[0] - linesize;
+        buf += snprintf(buf, 2, "\n");
+    }
+    buf += snprintf(buf, 5, " };\n");
+
+    pkt->size   = buf - pkt->data;
+    pkt->flags |= AV_PKT_FLAG_KEY;
+    *got_packet = 1;
+    return 0;
+}
+
+static av_cold int xbm_encode_close(AVCodecContext *avctx)
+{
+    av_freep(&avctx->coded_frame);
+
+    return 0;
+}
+
+AVCodec ff_xbm_encoder = {
+    .name         = "xbm",
+    .type         = AVMEDIA_TYPE_VIDEO,
+    .id           = CODEC_ID_XBM,
+    .init         = xbm_encode_init,
+    .encode2      = xbm_encode_frame,
+    .close        = xbm_encode_close,
+    .pix_fmts     = (const enum PixelFormat[]) { PIX_FMT_MONOWHITE,
+                                                 PIX_FMT_NONE },
+    .long_name    = NULL_IF_CONFIG_SMALL("XBM (X BitMap) image"),
+};
index 6915e43..b1495ff 100644 (file)
@@ -64,6 +64,7 @@ static const IdStrMap img_tags[] = {
     { CODEC_ID_JPEG2000  , "jpc"},
     { CODEC_ID_DPX       , "dpx"},
     { CODEC_ID_PICTOR    , "pic"},
+    { CODEC_ID_XBM       , "xbm"},
     { CODEC_ID_XWD       , "xwd"},
     { CODEC_ID_NONE      , NULL}
 };
index 8fbe37e..c825c2b 100644 (file)
@@ -130,7 +130,7 @@ AVOutputFormat ff_image2_muxer = {
     .long_name      = NULL_IF_CONFIG_SMALL("image2 sequence"),
     .extensions     = "bmp,dpx,jpeg,jpg,ljpg,pam,pbm,pcx,pgm,pgmyuv,png,"
                       "ppm,sgi,tga,tif,tiff,jp2,xwd,sun,ras,rs,im1,im8,im24,"
-                      "sunras",
+                      "sunras,xbm",
     .priv_data_size = sizeof(VideoMuxData),
     .video_codec    = CODEC_ID_MJPEG,
     .write_header   = write_header,