pngenc: add support for 8- and 16-bit gray images
authorAndrej Gelenberg <andrej.gelenberg@udo.edu>
Tue, 13 Mar 2012 22:08:38 +0000 (23:08 +0100)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Wed, 14 Mar 2012 13:43:49 +0000 (13:43 +0000)
Add support for direct encoding of 8- and 16-bit big endian gray images.

https://bugzilla.gnome.org/show_bug.cgi?id=672025

ext/libpng/gstpngenc.c
ext/libpng/gstpngenc.h

index 30986cd..b30d04f 100644 (file)
@@ -66,7 +66,7 @@ static GstStaticPadTemplate pngenc_sink_template =
     GST_PAD_SINK,
     GST_PAD_ALWAYS,
     GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_RGB ";"
-        GST_VIDEO_CAPS_GRAY8)
+        GST_VIDEO_CAPS_GRAY8 ";" GST_VIDEO_CAPS_GRAY16 ("BIG_ENDIAN"))
     );
 
 /* static GstElementClass *parent_class = NULL; */
@@ -167,6 +167,7 @@ gst_pngenc_setcaps (GstPad * pad, GstCaps * caps)
       pngenc->png_color_type = PNG_COLOR_TYPE_RGB;
       break;
     case GST_VIDEO_FORMAT_GRAY8:
+    case GST_VIDEO_FORMAT_GRAY16_BE:
       pngenc->png_color_type = PNG_COLOR_TYPE_GRAY;
       break;
     default:
@@ -174,6 +175,15 @@ gst_pngenc_setcaps (GstPad * pad, GstCaps * caps)
       goto done;
   }
 
+  switch (format) {
+    case GST_VIDEO_FORMAT_GRAY16_BE:
+      pngenc->depth = 16;
+      break;
+    default:                   /* GST_VIDEO_FORMAT_RGB and GST_VIDEO_FORMAT_GRAY8 */
+      pngenc->depth = 8;
+      break;
+  }
+
   if (G_UNLIKELY (pngenc->width < 16 || pngenc->width > 1000000 ||
           pngenc->height < 16 || pngenc->height > 1000000)) {
     ret = FALSE;
@@ -321,7 +331,7 @@ gst_pngenc_chain (GstPad * pad, GstBuffer * buf)
       pngenc->png_info_ptr,
       pngenc->width,
       pngenc->height,
-      8,
+      pngenc->depth,
       pngenc->png_color_type,
       PNG_INTERLACE_NONE,
       PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
index 792a7c9..1c521ca 100644 (file)
@@ -50,6 +50,7 @@ struct _GstPngEnc
   png_infop png_info_ptr;
 
   gint png_color_type;
+  gint depth;
   gint width;
   gint height;
   gint stride;