summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'media-libs/gst-plugins-base/files/gst-0.10.32-0013-Add-support-for-RGB565-to-stridetransform.patch')
-rw-r--r--media-libs/gst-plugins-base/files/gst-0.10.32-0013-Add-support-for-RGB565-to-stridetransform.patch336
1 files changed, 336 insertions, 0 deletions
diff --git a/media-libs/gst-plugins-base/files/gst-0.10.32-0013-Add-support-for-RGB565-to-stridetransform.patch b/media-libs/gst-plugins-base/files/gst-0.10.32-0013-Add-support-for-RGB565-to-stridetransform.patch
new file mode 100644
index 0000000..d07c1b9
--- /dev/null
+++ b/media-libs/gst-plugins-base/files/gst-0.10.32-0013-Add-support-for-RGB565-to-stridetransform.patch
@@ -0,0 +1,336 @@
+From 28a5ad7c5ccfa98ffa7bb1425dc38ab16535fc26 Mon Sep 17 00:00:00 2001
+From: Castaneda Sheissa, Roberto <rsheissa@ti.com>
+Date: Sun, 3 Jan 2010 13:40:30 -0600
+Subject: [PATCH 13/24] Add support for RGB565 to stridetransform
+
+---
+ gst/stride/convert.c | 30 ++++++++++
+ gst/stride/gststridetransform.c | 120 ++++++++++++++++++++------------------
+ 2 files changed, 93 insertions(+), 57 deletions(-)
+
+diff --git a/gst/stride/convert.c b/gst/stride/convert.c
+index 0f59e78..fdb02ae 100644
+--- a/gst/stride/convert.c
++++ b/gst/stride/convert.c
+@@ -322,6 +322,35 @@ stridify_i420_yuy2 (GstStrideTransform *self, guchar *strided, guchar *unstrided
+ return GST_FLOW_OK;
+ }
+
++/** convert RGB565 to RGB565 strided **/
++static GstFlowReturn
++stridify_rgb565_rgb565 (GstStrideTransform *self, guchar *strided, guchar *unstrided)
++{
++ gint width = self->width;
++ gint height = self->height;
++ gint stride = self->out_rowstride;
++
++ g_return_val_if_fail (stride >= (width*2), GST_FLOW_ERROR);
++
++ stridemove (strided, unstrided, stride, width*2, height);
++
++ return GST_FLOW_OK;
++}
++
++/** convert RGB565 strided to RGB565 **/
++static GstFlowReturn
++unstridify_rgb565_rgb565 (GstStrideTransform *self, guchar *strided, guchar *unstrided)
++{
++ gint width = self->width;
++ gint height = self->height;
++ gint stride = self->in_rowstride;
++
++ g_return_val_if_fail (stride >= (width*2), GST_FLOW_ERROR);
++
++ stridemove (unstrided, strided, width*2, stride, height);
++ return GST_FLOW_OK;
++}
++
+
+ /* last entry has GST_VIDEO_FORMAT_UNKNOWN for in/out formats */
+ Conversion stride_conversions[] = {
+@@ -332,6 +361,7 @@ Conversion stride_conversions[] = {
+ { { GST_VIDEO_FORMAT_UYVY, GST_VIDEO_FORMAT_UYVY }, stridify_422i_422i, unstridify_422i_422i },
+ { { GST_VIDEO_FORMAT_I420, GST_VIDEO_FORMAT_NV12 }, stridify_i420_nv12, NULL },
+ { { GST_VIDEO_FORMAT_I420, GST_VIDEO_FORMAT_YUY2 }, stridify_i420_yuy2, NULL },
++ { { GST_VIDEO_FORMAT_RGB16, GST_VIDEO_FORMAT_RGB16 }, stridify_rgb565_rgb565, unstridify_rgb565_rgb565 },
+ /* add new entries before here */
+ { { GST_VIDEO_FORMAT_UNKNOWN } }
+ };
+diff --git a/gst/stride/gststridetransform.c b/gst/stride/gststridetransform.c
+index 6ab0479..c35be73 100644
+--- a/gst/stride/gststridetransform.c
++++ b/gst/stride/gststridetransform.c
+@@ -66,46 +66,47 @@ GST_ELEMENT_DETAILS ("Stride transform",
+
+
+ /* TODO: add rgb formats too! */
+-#define SUPPORTED_CAPS \
+- GST_VIDEO_CAPS_YUV_STRIDED ("{ I420, YV12, YUY2, UYVY, NV12 }", "[ 0, max ]")
++#define YUV_SUPPORTED_CAPS \
++ GST_VIDEO_CAPS_YUV_STRIDED ("{I420, YV12, YUY2, UYVY, NV12 }", "[ 0, max ]")
+
++#define RGB_SUPPORTED_CAPS \
++ GST_VIDEO_CAPS_RGB_16_STRIDED ("[ 0, max ]")
+
+-static GstStaticPadTemplate src_template =
+-GST_STATIC_PAD_TEMPLATE ("src",
++
++static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+- GST_STATIC_CAPS (SUPPORTED_CAPS)
+-);
++ GST_STATIC_CAPS (YUV_SUPPORTED_CAPS ";" RGB_SUPPORTED_CAPS)
++ );
+
+-static GstStaticPadTemplate sink_template =
+-GST_STATIC_PAD_TEMPLATE ("sink",
++static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+- GST_STATIC_CAPS (SUPPORTED_CAPS)
+-);
++ GST_STATIC_CAPS (YUV_SUPPORTED_CAPS ";" RGB_SUPPORTED_CAPS)
++ );
+
+
+ GST_DEBUG_CATEGORY (stridetransform_debug);
+ #define GST_CAT_DEFAULT stridetransform_debug
+
+ /* type functions */
+-static void gst_stride_transform_dispose (GObject *obj);
++static void gst_stride_transform_dispose (GObject * obj);
+
+ /* GstBaseTransform functions */
+-static gboolean gst_stride_transform_get_unit_size (GstBaseTransform *base,
+- GstCaps *caps, guint *size);
+-static gboolean gst_stride_transform_transform_size (GstBaseTransform *base,
++static gboolean gst_stride_transform_get_unit_size (GstBaseTransform * base,
++ GstCaps * caps, guint * size);
++static gboolean gst_stride_transform_transform_size (GstBaseTransform * base,
+ GstPadDirection direction,
+- GstCaps *caps, guint size,
+- GstCaps *othercaps, guint *othersize);
+-static GstCaps *gst_stride_transform_transform_caps (GstBaseTransform *base,
+- GstPadDirection direction, GstCaps *caps);
+-static gboolean gst_stride_transform_set_caps (GstBaseTransform *base,
+- GstCaps *incaps, GstCaps *outcaps);
+-static GstFlowReturn gst_stride_transform_transform (GstBaseTransform *base,
+- GstBuffer *inbuf, GstBuffer *outbuf);
++ GstCaps * caps, guint size, GstCaps * othercaps, guint * othersize);
++static GstCaps *gst_stride_transform_transform_caps (GstBaseTransform * base,
++ GstPadDirection direction, GstCaps * caps);
++static gboolean gst_stride_transform_set_caps (GstBaseTransform * base,
++ GstCaps * incaps, GstCaps * outcaps);
++static GstFlowReturn gst_stride_transform_transform (GstBaseTransform * base,
++ GstBuffer * inbuf, GstBuffer * outbuf);
+
+-GST_BOILERPLATE (GstStrideTransform, gst_stride_transform, GstVideoFilter, GST_TYPE_VIDEO_FILTER);
++GST_BOILERPLATE (GstStrideTransform, gst_stride_transform, GstVideoFilter,
++ GST_TYPE_VIDEO_FILTER);
+
+
+ static void
+@@ -113,7 +114,8 @@ gst_stride_transform_base_init (gpointer g_class)
+ {
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
+
+- GST_DEBUG_CATEGORY_INIT (stridetransform_debug, "stride", 0, "stride transform element");
++ GST_DEBUG_CATEGORY_INIT (stridetransform_debug, "stride", 0,
++ "stride transform element");
+
+ gst_element_class_set_details (gstelement_class, &stridetransform_details);
+
+@@ -124,7 +126,7 @@ gst_stride_transform_base_init (gpointer g_class)
+ }
+
+ static void
+-gst_stride_transform_class_init (GstStrideTransformClass *klass)
++gst_stride_transform_class_init (GstStrideTransformClass * klass)
+ {
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GstBaseTransformClass *basetransform_class = GST_BASE_TRANSFORM_CLASS (klass);
+@@ -146,14 +148,15 @@ gst_stride_transform_class_init (GstStrideTransformClass *klass)
+ }
+
+ static void
+-gst_stride_transform_init (GstStrideTransform *self, GstStrideTransformClass *klass)
++gst_stride_transform_init (GstStrideTransform * self,
++ GstStrideTransformClass * klass)
+ {
+ GST_DEBUG_OBJECT (self, "not implemented");
+ }
+
+
+ static void
+-gst_stride_transform_dispose (GObject *object)
++gst_stride_transform_dispose (GObject * object)
+ {
+ GstStrideTransform *self = GST_STRIDE_TRANSFORM (object);
+ GST_DEBUG_OBJECT (self, "not implemented");
+@@ -164,15 +167,15 @@ gst_stride_transform_dispose (GObject *object)
+ * figure out the required buffer size based on @caps
+ */
+ static gboolean
+-gst_stride_transform_get_unit_size (GstBaseTransform *base,
+- GstCaps *caps, guint *size)
++gst_stride_transform_get_unit_size (GstBaseTransform * base,
++ GstCaps * caps, guint * size)
+ {
+ GstStrideTransform *self = GST_STRIDE_TRANSFORM (base);
+ GstVideoFormat format;
+ gint width, height, rowstride;
+
+- g_return_val_if_fail (gst_video_format_parse_caps_strided (
+- caps, &format, &width, &height, &rowstride), FALSE);
++ g_return_val_if_fail (gst_video_format_parse_caps_strided (caps, &format,
++ &width, &height, &rowstride), FALSE);
+
+ *size = gst_video_format_get_size_strided (format, width, height, rowstride);
+
+@@ -188,16 +191,14 @@ gst_stride_transform_get_unit_size (GstBaseTransform *base,
+ * buffer size is a multiple of the unit size.. which doesn't hold true.
+ */
+ static gboolean
+-gst_stride_transform_transform_size (GstBaseTransform *base,
++gst_stride_transform_transform_size (GstBaseTransform * base,
+ GstPadDirection direction,
+- GstCaps *caps, guint size,
+- GstCaps *othercaps, guint *othersize)
++ GstCaps * caps, guint size, GstCaps * othercaps, guint * othersize)
+ {
+ GstStrideTransform *self = GST_STRIDE_TRANSFORM (base);
+ guint idx = (direction == GST_PAD_SINK) ? 0 : 1;
+
+- if (self->cached_caps[idx] != othercaps)
+- {
++ if (self->cached_caps[idx] != othercaps) {
+ guint sz;
+ if (!gst_stride_transform_get_unit_size (base, othercaps, &sz)) {
+ return FALSE;
+@@ -220,13 +221,15 @@ gst_stride_transform_transform_size (GstBaseTransform *base,
+ * helper to add all fields, other than rowstride to @caps, copied from @s.
+ */
+ static void
+-add_all_fields (GstCaps *caps, const gchar *name, GstStructure *s, gboolean rowstride, GstPadDirection direction)
++add_all_fields (GstCaps * caps, const gchar * name, GstStructure * s,
++ gboolean rowstride, GstPadDirection direction)
+ {
+ gint idx;
+ GstStructure *new_s = gst_structure_new (name, NULL);
+
+ if (rowstride) {
+- gst_structure_set (new_s, "rowstride", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL);
++ gst_structure_set (new_s, "rowstride", GST_TYPE_INT_RANGE, 1, G_MAXINT,
++ NULL);
+ }
+
+ idx = gst_structure_n_fields (s) - 1;
+@@ -245,15 +248,16 @@ add_all_fields (GstCaps *caps, const gchar *name, GstStructure *s, gboolean rows
+ gint from_format = (direction == GST_PAD_SRC) ? 1 : 0;
+
+ if (gst_structure_get_fourcc (s, "format", &fourcc)) {
+- GValue formats = {0};
+- GValue fourccval = {0};
++ GValue formats = { 0 };
++ GValue fourccval = { 0 };
+ gint i;
+ GstVideoFormat format = gst_video_format_from_fourcc (fourcc);
+
+ g_value_init (&formats, GST_TYPE_LIST);
+ g_value_init (&fourccval, GST_TYPE_FOURCC);
+
+- for (i=0; stride_conversions[i].format[0]!=GST_VIDEO_FORMAT_UNKNOWN; i++) {
++ for (i = 0; stride_conversions[i].format[0] != GST_VIDEO_FORMAT_UNKNOWN;
++ i++) {
+ if (stride_conversions[i].format[from_format] == format) {
+ gst_value_set_fourcc (&fourccval, gst_video_format_to_fourcc
+ (stride_conversions[i].format[to_format]));
+@@ -281,8 +285,8 @@ add_all_fields (GstCaps *caps, const gchar *name, GstStructure *s, gboolean rows
+ * identical parameters
+ */
+ static GstCaps *
+-gst_stride_transform_transform_caps (GstBaseTransform *base,
+- GstPadDirection direction, GstCaps *caps)
++gst_stride_transform_transform_caps (GstBaseTransform * base,
++ GstPadDirection direction, GstCaps * caps)
+ {
+ GstStrideTransform *self = GST_STRIDE_TRANSFORM (base);
+ GstCaps *ret;
+@@ -321,8 +325,8 @@ gst_stride_transform_transform_caps (GstBaseTransform *base,
+ * plus the requested rowstride of the @incaps and @outcaps
+ */
+ static gboolean
+-gst_stride_transform_set_caps (GstBaseTransform *base,
+- GstCaps *incaps, GstCaps *outcaps)
++gst_stride_transform_set_caps (GstBaseTransform * base,
++ GstCaps * incaps, GstCaps * outcaps)
+ {
+ GstStrideTransform *self = GST_STRIDE_TRANSFORM (base);
+ gint width, height;
+@@ -333,13 +337,13 @@ gst_stride_transform_set_caps (GstBaseTransform *base,
+ LOG_CAPS (self, outcaps);
+
+ g_return_val_if_fail (gst_video_format_parse_caps_strided (incaps,
+- &in_format, &self->width, &self->height, &self->in_rowstride), FALSE);
++ &in_format, &self->width, &self->height, &self->in_rowstride), FALSE);
+ g_return_val_if_fail (gst_video_format_parse_caps_strided (outcaps,
+- &out_format, &width, &height, &self->out_rowstride), FALSE);
++ &out_format, &width, &height, &self->out_rowstride), FALSE);
+
+ self->conversion = NULL;
+
+- for (i=0; stride_conversions[i].format[0]!=GST_VIDEO_FORMAT_UNKNOWN; i++) {
++ for (i = 0; stride_conversions[i].format[0] != GST_VIDEO_FORMAT_UNKNOWN; i++) {
+ if ((stride_conversions[i].format[0] == in_format) &&
+ (stride_conversions[i].format[1] == out_format)) {
+ GST_DEBUG_OBJECT (self, "found stride_conversion: %d", i);
+@@ -349,26 +353,27 @@ gst_stride_transform_set_caps (GstBaseTransform *base,
+ }
+
+ g_return_val_if_fail (self->conversion, FALSE);
+- g_return_val_if_fail (self->conversion->unstridify || !self->in_rowstride, FALSE);
+- g_return_val_if_fail (self->conversion->stridify || !self->out_rowstride, FALSE);
+- g_return_val_if_fail (self->width == width, FALSE);
++ g_return_val_if_fail (self->conversion->unstridify
++ || !self->in_rowstride, FALSE);
++ g_return_val_if_fail (self->conversion->stridify
++ || !self->out_rowstride, FALSE);
++ g_return_val_if_fail (self->width == width, FALSE);
+ g_return_val_if_fail (self->height == height, FALSE);
+
+ return TRUE;
+ }
+
+ static GstFlowReturn
+-gst_stride_transform_transform (GstBaseTransform *base,
+- GstBuffer *inbuf, GstBuffer *outbuf)
++gst_stride_transform_transform (GstBaseTransform * base,
++ GstBuffer * inbuf, GstBuffer * outbuf)
+ {
+ GstStrideTransform *self = GST_STRIDE_TRANSFORM (base);
+
+ GST_DEBUG_OBJECT (self, "inbuf=%p (size=%d), outbuf=%p (size=%d)",
+- inbuf, GST_BUFFER_SIZE (inbuf),
+- outbuf, GST_BUFFER_SIZE (outbuf));
++ inbuf, GST_BUFFER_SIZE (inbuf), outbuf, GST_BUFFER_SIZE (outbuf));
+
+ if (self->in_rowstride && self->out_rowstride) {
+- GST_DEBUG_OBJECT (self, "not implemented"); // TODO
++ GST_DEBUG_OBJECT (self, "not implemented"); // TODO
+ return GST_FLOW_ERROR;
+ } else if (self->in_rowstride) {
+ return self->conversion->unstridify (self,
+@@ -378,7 +383,8 @@ gst_stride_transform_transform (GstBaseTransform *base,
+ GST_BUFFER_DATA (outbuf), GST_BUFFER_DATA (inbuf));
+ }
+
+- GST_DEBUG_OBJECT (self, "this shouldn't happen! in_rowstride=%d, out_rowstride=%d",
++ GST_DEBUG_OBJECT (self,
++ "this shouldn't happen! in_rowstride=%d, out_rowstride=%d",
+ self->in_rowstride, self->out_rowstride);
+
+ return GST_FLOW_ERROR;
+--
+1.7.1
+