diff options
author | Joan Pau Beltran <joanpau.beltran@socib.cat> | 2016-10-11 18:48:06 +0200 |
---|---|---|
committer | Nicolas Dufresne <nicolas.dufresne@collabora.com> | 2016-10-14 09:45:15 -0400 |
commit | 32b356b2c5d5d3f667551f960921b510e3d0fc10 (patch) | |
tree | 6f6b32a8f65a10b9a9d5812b6f424e752d7886a0 | |
parent | 312c8c9f7cd6c5f8c673fbe09995b0b2887343cc (diff) | |
download | gstreamer-plugins-bad-32b356b2c5d5d3f667551f960921b510e3d0fc10.tar.gz |
bayer: fix _transform_caps method to preserve fields in given caps
https://bugzilla.gnome.org/show_bug.cgi?id=758717
-rw-r--r-- | gst/bayer/gstbayer2rgb.c | 55 | ||||
-rw-r--r-- | gst/bayer/gstrgb2bayer.c | 52 |
2 files changed, 47 insertions, 60 deletions
diff --git a/gst/bayer/gstbayer2rgb.c b/gst/bayer/gstbayer2rgb.c index 0b6f23218..bf723b107 100644 --- a/gst/bayer/gstbayer2rgb.c +++ b/gst/bayer/gstbayer2rgb.c @@ -286,42 +286,35 @@ static GstCaps * gst_bayer2rgb_transform_caps (GstBaseTransform * base, GstPadDirection direction, GstCaps * caps, GstCaps * filter) { + GstBayer2RGB *bayer2rgb; + GstCaps *res_caps, *tmp_caps; GstStructure *structure; - GstCaps *newcaps; - GstStructure *newstruct; + guint i, caps_size; - GST_DEBUG_OBJECT (base, "transforming caps from %" GST_PTR_FORMAT, caps); + bayer2rgb = GST_BAYER2RGB (base); - structure = gst_caps_get_structure (caps, 0); - - if (direction == GST_PAD_SRC) { - newcaps = gst_caps_from_string ("video/x-bayer," - "format=(string){bggr,grbg,gbrg,rggb}"); - } else { - newcaps = gst_caps_new_empty_simple ("video/x-raw"); + res_caps = gst_caps_copy (caps); + caps_size = gst_caps_get_size (res_caps); + for (i = 0; i < caps_size; i++) { + structure = gst_caps_get_structure (res_caps, i); + if (direction == GST_PAD_SINK) { + gst_structure_set_name (structure, "video/x-raw"); + gst_structure_remove_field (structure, "format"); + } else { + gst_structure_set_name (structure, "video/x-bayer"); + gst_structure_remove_fields (structure, "format", "colorimetry", + "chroma-site", NULL); + } } - newstruct = gst_caps_get_structure (newcaps, 0); - - gst_structure_set_value (newstruct, "width", - gst_structure_get_value (structure, "width")); - gst_structure_set_value (newstruct, "height", - gst_structure_get_value (structure, "height")); - gst_structure_set_value (newstruct, "framerate", - gst_structure_get_value (structure, "framerate")); - - if (filter != NULL) { - GstCaps *icaps; - - GST_DEBUG_OBJECT (base, " filter %" GST_PTR_FORMAT, filter); - - icaps = gst_caps_intersect_full (filter, newcaps, GST_CAPS_INTERSECT_FIRST); - gst_caps_unref (newcaps); - newcaps = icaps; + if (filter) { + tmp_caps = res_caps; + res_caps = + gst_caps_intersect_full (filter, tmp_caps, GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (tmp_caps); } - - GST_DEBUG_OBJECT (base, " into %" GST_PTR_FORMAT, newcaps); - - return newcaps; + GST_DEBUG_OBJECT (bayer2rgb, "transformed %" GST_PTR_FORMAT " into %" + GST_PTR_FORMAT, caps, res_caps); + return res_caps; } static gboolean diff --git a/gst/bayer/gstrgb2bayer.c b/gst/bayer/gstrgb2bayer.c index 9ef5c893a..21e78119f 100644 --- a/gst/bayer/gstrgb2bayer.c +++ b/gst/bayer/gstrgb2bayer.c @@ -126,41 +126,35 @@ static GstCaps * gst_rgb2bayer_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter) { + GstRGB2Bayer *rgb2bayer; + GstCaps *res_caps, *tmp_caps; GstStructure *structure; - GstStructure *new_structure; - GstCaps *newcaps; - const GValue *value; + guint i, caps_size; - GST_DEBUG_OBJECT (trans, "transforming caps (from) %" GST_PTR_FORMAT, caps); + rgb2bayer = GST_RGB_2_BAYER (trans); - structure = gst_caps_get_structure (caps, 0); - - if (direction == GST_PAD_SRC) { - newcaps = gst_caps_new_empty_simple ("video/x-raw"); - } else { - newcaps = gst_caps_new_empty_simple ("video/x-bayer"); + res_caps = gst_caps_copy (caps); + caps_size = gst_caps_get_size (res_caps); + for (i = 0; i < caps_size; i++) { + structure = gst_caps_get_structure (res_caps, i); + if (direction == GST_PAD_SRC) { + gst_structure_set_name (structure, "video/x-raw"); + gst_structure_remove_field (structure, "format"); + } else { + gst_structure_set_name (structure, "video/x-bayer"); + gst_structure_remove_fields (structure, "format", "colorimetry", + "chroma-site", NULL); + } } - new_structure = gst_caps_get_structure (newcaps, 0); - - value = gst_structure_get_value (structure, "width"); - gst_structure_set_value (new_structure, "width", value); - - value = gst_structure_get_value (structure, "height"); - gst_structure_set_value (new_structure, "height", value); - - value = gst_structure_get_value (structure, "framerate"); - gst_structure_set_value (new_structure, "framerate", value); - - GST_DEBUG_OBJECT (trans, "transforming caps (into) %" GST_PTR_FORMAT, - newcaps); - if (filter) { - GstCaps *tmpcaps = newcaps; - newcaps = gst_caps_intersect (newcaps, filter); - gst_caps_unref (tmpcaps); + tmp_caps = res_caps; + res_caps = + gst_caps_intersect_full (filter, tmp_caps, GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (tmp_caps); } - - return newcaps; + GST_DEBUG_OBJECT (rgb2bayer, "transformed %" GST_PTR_FORMAT " into %" + GST_PTR_FORMAT, caps, res_caps); + return res_caps; } static gboolean |