mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-22 00:06:36 +00:00
ext/libpng/: Fix byte-order, use proper fixed caps. Fixes #164197.
Original commit message from CVS: Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> * ext/libpng/gstpngdec.c: (gst_pngdec_init), (gst_pngdec_chain): * ext/libpng/gstpngenc.c: Fix byte-order, use proper fixed caps. Fixes #164197.
This commit is contained in:
parent
5ab3df2846
commit
840c55ebd1
3 changed files with 52 additions and 73 deletions
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,11 @@
|
|||
2005-02-08 Gergely Nagy <algernon@bonehunter.rulez.org>
|
||||
|
||||
Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net>
|
||||
|
||||
* ext/libpng/gstpngdec.c: (gst_pngdec_init), (gst_pngdec_chain):
|
||||
* ext/libpng/gstpngenc.c:
|
||||
Fix byte-order, use proper fixed caps. Fixes #164197.
|
||||
|
||||
2005-02-08 Jan Schmidt <thaytan@mad.scientist.com>
|
||||
|
||||
* configure.ac:
|
||||
|
@ -37,7 +45,7 @@
|
|||
(gst_mpeg_parse_get_rate), (gst_mpeg_parse_convert_src),
|
||||
(gst_mpeg_parse_handle_src_query),
|
||||
(gst_mpeg_parse_handle_src_event):
|
||||
Use audio/x-dvd-lpcm for LPCM output.
|
||||
Use audio/x-dvd-lpcm for LPCM output.
|
||||
Add DTS output.
|
||||
|
||||
2005-02-08 Gergely Nagy <algernon@bonehunter.rulez.org>
|
||||
|
|
|
@ -47,8 +47,6 @@ static void gst_pngdec_init (GstPngDec * pngdec);
|
|||
|
||||
static void gst_pngdec_chain (GstPad * pad, GstData * _data);
|
||||
|
||||
static GstCaps *gst_pngdec_src_getcaps (GstPad * pad);
|
||||
|
||||
static GstElementClass *parent_class = NULL;
|
||||
|
||||
|
||||
|
@ -93,7 +91,7 @@ static GstStaticPadTemplate gst_pngdec_src_pad_template =
|
|||
GST_STATIC_PAD_TEMPLATE ("src",
|
||||
GST_PAD_SRC,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_RGB)
|
||||
GST_STATIC_CAPS (GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_BGR)
|
||||
);
|
||||
|
||||
static GstStaticPadTemplate gst_pngdec_sink_pad_template =
|
||||
|
@ -129,7 +127,6 @@ gst_pngdec_class_init (GstPngDecClass * klass)
|
|||
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
|
||||
}
|
||||
|
||||
|
||||
static GstPadLinkReturn
|
||||
gst_pngdec_sinklink (GstPad * pad, const GstCaps * caps)
|
||||
{
|
||||
|
@ -158,7 +155,7 @@ gst_pngdec_init (GstPngDec * pngdec)
|
|||
gst_pad_set_chain_function (pngdec->sinkpad, gst_pngdec_chain);
|
||||
gst_pad_set_link_function (pngdec->sinkpad, gst_pngdec_sinklink);
|
||||
|
||||
gst_pad_set_getcaps_function (pngdec->srcpad, gst_pngdec_src_getcaps);
|
||||
gst_pad_use_explicit_caps (pngdec->srcpad);
|
||||
|
||||
pngdec->png = NULL;
|
||||
pngdec->info = NULL;
|
||||
|
@ -169,71 +166,6 @@ gst_pngdec_init (GstPngDec * pngdec)
|
|||
pngdec->fps = -1;
|
||||
}
|
||||
|
||||
static GstCaps *
|
||||
gst_pngdec_src_getcaps (GstPad * pad)
|
||||
{
|
||||
GstPngDec *pngdec;
|
||||
GstCaps *caps;
|
||||
gint i;
|
||||
GstPadTemplate *templ;
|
||||
GstCaps *inter;
|
||||
|
||||
pngdec = GST_PNGDEC (gst_pad_get_parent (pad));
|
||||
templ = gst_static_pad_template_get (&gst_pngdec_src_pad_template);
|
||||
caps = gst_caps_copy (gst_pad_template_get_caps (templ));
|
||||
|
||||
if (pngdec->color_type != -1) {
|
||||
GstCaps *to_inter = NULL;
|
||||
|
||||
if (pngdec->info && pngdec->info->bit_depth != 8) {
|
||||
GST_ELEMENT_ERROR (pngdec, STREAM, NOT_IMPLEMENTED, (NULL),
|
||||
("pngdec only supports 8 bit images for now"));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
switch (pngdec->color_type) {
|
||||
case PNG_COLOR_TYPE_RGB:
|
||||
to_inter = gst_caps_new_simple ("video/x-raw-rgb",
|
||||
"bpp", G_TYPE_INT, 24, NULL);
|
||||
break;
|
||||
case PNG_COLOR_TYPE_RGB_ALPHA:
|
||||
to_inter = gst_caps_new_simple ("video/x-raw-rgb",
|
||||
"bpp", G_TYPE_INT, 32, NULL);
|
||||
break;
|
||||
case PNG_COLOR_TYPE_GRAY:
|
||||
case PNG_COLOR_TYPE_PALETTE:
|
||||
case PNG_COLOR_TYPE_GRAY_ALPHA:
|
||||
default:
|
||||
GST_ELEMENT_ERROR (pngdec, STREAM, NOT_IMPLEMENTED, (NULL),
|
||||
("pngdec does not support grayscale or paletted data yet"));
|
||||
break;
|
||||
}
|
||||
inter = gst_caps_intersect (caps, to_inter);
|
||||
gst_caps_free (caps);
|
||||
gst_caps_free (to_inter);
|
||||
caps = inter;
|
||||
}
|
||||
|
||||
for (i = 0; i < gst_caps_get_size (caps); i++) {
|
||||
GstStructure *structure = gst_caps_get_structure (caps, i);
|
||||
|
||||
if (pngdec->width != -1) {
|
||||
gst_structure_set (structure, "width", G_TYPE_INT, pngdec->width, NULL);
|
||||
}
|
||||
|
||||
if (pngdec->height != -1) {
|
||||
gst_structure_set (structure, "height", G_TYPE_INT, pngdec->height, NULL);
|
||||
}
|
||||
|
||||
if (pngdec->fps != -1) {
|
||||
gst_structure_set (structure,
|
||||
"framerate", G_TYPE_DOUBLE, pngdec->fps, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
return caps;
|
||||
}
|
||||
|
||||
static void
|
||||
user_read_data (png_structp png_ptr, png_bytep data, png_size_t length)
|
||||
{
|
||||
|
@ -316,14 +248,53 @@ gst_pngdec_chain (GstPad * pad, GstData * _data)
|
|||
png_get_IHDR (pngdec->png, pngdec->info, &width, &height,
|
||||
&depth, &color, NULL, NULL, NULL);
|
||||
|
||||
if (pngdec->info->bit_depth != 8) {
|
||||
gst_buffer_unref (buf);
|
||||
png_destroy_read_struct (&pngdec->png, &pngdec->info, &pngdec->endinfo);
|
||||
GST_ELEMENT_ERROR (pngdec, STREAM, NOT_IMPLEMENTED, (NULL),
|
||||
("pngdec only supports 8 bit images for now"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (pngdec->width != width ||
|
||||
pngdec->height != height ||
|
||||
pngdec->color_type != pngdec->info->color_type) {
|
||||
GstCaps *caps, *templ, *res;
|
||||
gboolean ret;
|
||||
gint bpp;
|
||||
|
||||
pngdec->width = width;
|
||||
pngdec->height = height;
|
||||
pngdec->color_type = pngdec->info->color_type;
|
||||
|
||||
if (GST_PAD_LINK_FAILED (gst_pad_renegotiate (pngdec->srcpad))) {
|
||||
templ = gst_caps_copy (gst_pad_template_get_caps
|
||||
(gst_static_pad_template_get (&gst_pngdec_src_pad_template)));
|
||||
|
||||
switch (pngdec->color_type) {
|
||||
case PNG_COLOR_TYPE_RGB:
|
||||
bpp = 24;
|
||||
break;
|
||||
case PNG_COLOR_TYPE_RGB_ALPHA:
|
||||
bpp = 32;
|
||||
break;
|
||||
default:
|
||||
GST_ELEMENT_ERROR (pngdec, STREAM, NOT_IMPLEMENTED, (NULL),
|
||||
("pngdec does not support grayscale or paletted data yet"));
|
||||
return;
|
||||
}
|
||||
|
||||
caps = gst_caps_new_simple ("video/x-raw-rgb",
|
||||
"width", G_TYPE_INT, width,
|
||||
"height", G_TYPE_INT, height,
|
||||
"bpp", G_TYPE_INT, bpp, "framerate", G_TYPE_DOUBLE, pngdec->fps, NULL);
|
||||
|
||||
res = gst_caps_intersect (templ, caps);
|
||||
gst_caps_free (caps);
|
||||
gst_caps_free (templ);
|
||||
ret = gst_pad_set_explicit_caps (pngdec->srcpad, res);
|
||||
gst_caps_free (res);
|
||||
|
||||
if (!ret) {
|
||||
gst_buffer_unref (buf);
|
||||
png_destroy_read_struct (&pngdec->png, &pngdec->info, &pngdec->endinfo);
|
||||
GST_ELEMENT_ERROR (pngdec, CORE, NEGOTIATION, (NULL), (NULL));
|
||||
|
|
|
@ -76,7 +76,7 @@ static GstStaticPadTemplate pngenc_sink_template =
|
|||
GST_STATIC_PAD_TEMPLATE ("sink",
|
||||
GST_PAD_SINK,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_RGB)
|
||||
GST_STATIC_CAPS (GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_BGR)
|
||||
);
|
||||
|
||||
static GstElementClass *parent_class = NULL;
|
||||
|
|
Loading…
Reference in a new issue