diff options
Diffstat (limited to 'abs/extra/community/gstreamer0.10-base/videoscale-fix-negotiation.patch')
-rw-r--r-- | abs/extra/community/gstreamer0.10-base/videoscale-fix-negotiation.patch | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/abs/extra/community/gstreamer0.10-base/videoscale-fix-negotiation.patch b/abs/extra/community/gstreamer0.10-base/videoscale-fix-negotiation.patch new file mode 100644 index 0000000..6e34d41 --- /dev/null +++ b/abs/extra/community/gstreamer0.10-base/videoscale-fix-negotiation.patch @@ -0,0 +1,171 @@ +From 63d1316c0fd4ce22cf4a53f4aa7cb1ca16a07aa8 Mon Sep 17 00:00:00 2001 +From: Tim-Philipp Müller <tim.muller@collabora.co.uk> +Date: Sun, 26 Feb 2012 18:19:57 +0000 +Subject: videoscale: fix negotiation after addition of new formats and methods + +Now that we no longer support all methods for all formats, we +need to cater for that in the transform function: we can't +transform formats not supported by the currently-selected +mehod. + +make check, folks. It's da bomb. +--- +diff --git a/gst/videoscale/gstvideoscale.c b/gst/videoscale/gstvideoscale.c +index 9f072a3..60dd5ff 100644 +--- a/gst/videoscale/gstvideoscale.c ++++ b/gst/videoscale/gstvideoscale.c +@@ -424,10 +424,118 @@ gst_video_scale_get_property (GObject * object, guint prop_id, GValue * value, + } + } + ++#define NEAREST (1 << GST_VIDEO_SCALE_NEAREST) ++#define BILINEAR (1 << GST_VIDEO_SCALE_BILINEAR) ++#define FOURTAP (1 << GST_VIDEO_SCALE_4TAP) ++#define LANCZOS (1 << GST_VIDEO_SCALE_LANCZOS) ++ ++/* or we could just do lookups via table[format] if we could be bothered.. */ ++static const struct ++{ ++ GstVideoFormat format; ++ guint8 methods; ++} formats_methods_table[] = { ++ { ++ GST_VIDEO_FORMAT_RGBx, NEAREST | BILINEAR | FOURTAP | LANCZOS}, { ++ GST_VIDEO_FORMAT_xRGB, NEAREST | BILINEAR | FOURTAP | LANCZOS}, { ++ GST_VIDEO_FORMAT_BGRx, NEAREST | BILINEAR | FOURTAP | LANCZOS}, { ++ GST_VIDEO_FORMAT_xBGR, NEAREST | BILINEAR | FOURTAP | LANCZOS}, { ++ GST_VIDEO_FORMAT_RGBA, NEAREST | BILINEAR | FOURTAP | LANCZOS}, { ++ GST_VIDEO_FORMAT_ARGB, NEAREST | BILINEAR | FOURTAP | LANCZOS}, { ++ GST_VIDEO_FORMAT_BGRA, NEAREST | BILINEAR | FOURTAP | LANCZOS}, { ++ GST_VIDEO_FORMAT_ABGR, NEAREST | BILINEAR | FOURTAP | LANCZOS}, { ++ GST_VIDEO_FORMAT_AYUV, NEAREST | BILINEAR | FOURTAP | LANCZOS}, { ++ GST_VIDEO_FORMAT_ARGB64, NEAREST | BILINEAR | FOURTAP | LANCZOS}, { ++ GST_VIDEO_FORMAT_AYUV64, NEAREST | BILINEAR | FOURTAP | LANCZOS}, { ++ GST_VIDEO_FORMAT_RGB, NEAREST | BILINEAR | FOURTAP}, { ++ GST_VIDEO_FORMAT_BGR, NEAREST | BILINEAR | FOURTAP}, { ++ GST_VIDEO_FORMAT_v308, NEAREST | BILINEAR | FOURTAP}, { ++ GST_VIDEO_FORMAT_YUY2, NEAREST | BILINEAR | FOURTAP}, { ++ GST_VIDEO_FORMAT_YVYU, NEAREST | BILINEAR | FOURTAP}, { ++ GST_VIDEO_FORMAT_UYVY, NEAREST | BILINEAR | FOURTAP}, { ++ GST_VIDEO_FORMAT_Y800, NEAREST | BILINEAR | FOURTAP}, { ++ GST_VIDEO_FORMAT_GRAY8, NEAREST | BILINEAR | FOURTAP}, { ++ GST_VIDEO_FORMAT_GRAY16_LE, NEAREST | BILINEAR | FOURTAP}, { ++ GST_VIDEO_FORMAT_GRAY16_BE, NEAREST | BILINEAR | FOURTAP}, { ++ GST_VIDEO_FORMAT_Y16, NEAREST | BILINEAR | FOURTAP}, { ++ GST_VIDEO_FORMAT_I420, NEAREST | BILINEAR | FOURTAP | LANCZOS}, { ++ GST_VIDEO_FORMAT_YV12, NEAREST | BILINEAR | FOURTAP | LANCZOS}, { ++ GST_VIDEO_FORMAT_Y444, NEAREST | BILINEAR | FOURTAP | LANCZOS}, { ++ GST_VIDEO_FORMAT_Y42B, NEAREST | BILINEAR | FOURTAP | LANCZOS}, { ++ GST_VIDEO_FORMAT_Y41B, NEAREST | BILINEAR | FOURTAP | LANCZOS}, { ++ GST_VIDEO_FORMAT_NV12, NEAREST | BILINEAR}, { ++ GST_VIDEO_FORMAT_RGB16, NEAREST | BILINEAR | FOURTAP}, { ++ GST_VIDEO_FORMAT_RGB15, NEAREST | BILINEAR | FOURTAP} ++}; ++ ++static gboolean ++gst_video_scale_format_supported_for_method (GstVideoFormat format, ++ GstVideoScaleMethod method) ++{ ++ int i; ++ ++ for (i = 0; i < G_N_ELEMENTS (formats_methods_table); ++i) { ++ if (formats_methods_table[i].format == format) ++ return ((formats_methods_table[i].methods & (1 << method)) != 0); ++ } ++ return FALSE; ++} ++ ++static gboolean ++gst_video_scale_transform_supported (GstVideoScale * videoscale, ++ GstVideoScaleMethod method, GstStructure * structure) ++{ ++ const GValue *val; ++ GstVideoFormat fmt; ++ gboolean supported = TRUE; ++ GstStructure *s; ++ GstCaps *c; ++ ++ /* we support these methods for all formats */ ++ if (method == GST_VIDEO_SCALE_NEAREST || method == GST_VIDEO_SCALE_BILINEAR) ++ return TRUE; ++ ++ /* we need fixed caps if we want to use gst_video_parse_caps() */ ++ s = gst_structure_new (gst_structure_get_name (structure), ++ "width", G_TYPE_INT, 1, "height", G_TYPE_INT, 1, NULL); ++ ++ if ((val = gst_structure_get_value (structure, "format"))) { ++ gst_structure_set_value (s, "format", val); ++ } else { ++ if ((val = gst_structure_get_value (structure, "endianness"))) ++ gst_structure_set_value (s, "endianness", val); ++ if ((val = gst_structure_get_value (structure, "red_mask"))) ++ gst_structure_set_value (s, "red_mask", val); ++ if ((val = gst_structure_get_value (structure, "blue_mask"))) ++ gst_structure_set_value (s, "blue_mask", val); ++ if ((val = gst_structure_get_value (structure, "green_mask"))) ++ gst_structure_set_value (s, "green_mask", val); ++ if ((val = gst_structure_get_value (structure, "alpha_mask"))) ++ gst_structure_set_value (s, "alpha_mask", val); ++ if ((val = gst_structure_get_value (structure, "depth"))) ++ gst_structure_set_value (s, "depth", val); ++ if ((val = gst_structure_get_value (structure, "bpp"))) ++ gst_structure_set_value (s, "bpp", val); ++ } ++ c = gst_caps_new_full (s, NULL); ++ if (!gst_video_format_parse_caps (c, &fmt, NULL, NULL)) { ++ GST_ERROR_OBJECT (videoscale, "couldn't parse %" GST_PTR_FORMAT, c); ++ } else if (!gst_video_scale_format_supported_for_method (fmt, method)) { ++ supported = FALSE; ++ } ++ GST_LOG_OBJECT (videoscale, "method %d %ssupported for format %d", ++ method, (supported) ? "" : "not ", fmt); ++ gst_caps_unref (c); ++ ++ return supported; ++} ++ + static GstCaps * + gst_video_scale_transform_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * caps) + { ++ GstVideoScale *videoscale = GST_VIDEO_SCALE (trans); ++ GstVideoScaleMethod method; + GstCaps *ret; + GstStructure *structure; + +@@ -441,6 +549,13 @@ gst_video_scale_transform_caps (GstBaseTransform * trans, + ret = gst_caps_copy (caps); + structure = gst_structure_copy (gst_caps_get_structure (ret, 0)); + ++ GST_OBJECT_LOCK (videoscale); ++ method = videoscale->method; ++ GST_OBJECT_UNLOCK (videoscale); ++ ++ if (!gst_video_scale_transform_supported (videoscale, method, structure)) ++ goto format_not_supported; ++ + gst_structure_set (structure, + "width", GST_TYPE_INT_RANGE, 1, G_MAXINT, + "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL); +@@ -452,9 +567,19 @@ gst_video_scale_transform_caps (GstBaseTransform * trans, + } + gst_caps_append_structure (ret, structure); + ++done: ++ + GST_DEBUG_OBJECT (trans, "returning caps: %" GST_PTR_FORMAT, ret); + + return ret; ++ ++format_not_supported: ++ { ++ gst_structure_free (structure); ++ gst_caps_unref (ret); ++ ret = gst_caps_new_empty (); ++ goto done; ++ } + } + + static gboolean +-- +cgit v0.9.0.2-2-gbebe |