summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'media-libs/gst-plugins-base/files/gst-0.10.32-0003-stridetransform-implement-caps-negotiation-and-relat.patch')
-rw-r--r--media-libs/gst-plugins-base/files/gst-0.10.32-0003-stridetransform-implement-caps-negotiation-and-relat.patch379
1 files changed, 379 insertions, 0 deletions
diff --git a/media-libs/gst-plugins-base/files/gst-0.10.32-0003-stridetransform-implement-caps-negotiation-and-relat.patch b/media-libs/gst-plugins-base/files/gst-0.10.32-0003-stridetransform-implement-caps-negotiation-and-relat.patch
new file mode 100644
index 0000000..faf97a1
--- /dev/null
+++ b/media-libs/gst-plugins-base/files/gst-0.10.32-0003-stridetransform-implement-caps-negotiation-and-relat.patch
@@ -0,0 +1,379 @@
+From c235770f9e1c73dc75d6873166bc1ef69770a6c1 Mon Sep 17 00:00:00 2001
+From: Rob Clark <rob@ti.com>
+Date: Fri, 31 Jul 2009 16:31:42 -0500
+Subject: [PATCH 03/24] stridetransform: implement caps negotiation and related parts
+
+now all that is left is to implement the actual transform functions
+---
+ gst-libs/gst/video/video.h | 10 ++
+ gst/stride/gststridetransform.c | 190 ++++++++++++++++++++++++++++++---------
+ gst/stride/gststridetransform.h | 38 ++++++++
+ 3 files changed, 196 insertions(+), 42 deletions(-)
+
+diff --git a/gst-libs/gst/video/video.h b/gst-libs/gst/video/video.h
+index a6a2293..5bac21f 100644
+--- a/gst-libs/gst/video/video.h
++++ b/gst-libs/gst/video/video.h
+@@ -356,6 +356,16 @@ typedef enum {
+ "height = " GST_VIDEO_SIZE_RANGE ", " \
+ "framerate = " GST_VIDEO_FPS_RANGE
+
++
++#define GST_VIDEO_CAPS_YUV_STRIDED(fourcc, rowstride) \
++ GST_VIDEO_CAPS_YUV(fourcc) "; " \
++ "video/x-raw-yuv-strided, " \
++ "format = (fourcc) " fourcc ", " \
++ "rowstride = (int) " rowstride ", " \
++ "width = " GST_VIDEO_SIZE_RANGE ", " \
++ "height = " GST_VIDEO_SIZE_RANGE ", " \
++ "framerate = " GST_VIDEO_FPS_RANGE
++
+ /* buffer flags */
+
+ /**
+diff --git a/gst/stride/gststridetransform.c b/gst/stride/gststridetransform.c
+index 21f2d6e..e31bf11 100644
+--- a/gst/stride/gststridetransform.c
++++ b/gst/stride/gststridetransform.c
+@@ -33,7 +33,10 @@
+ * <refsect2>
+ * <title>Example launch lines</title>
+ * |[
+- * gst-launch ???? TODO
++ * gst-launch videotestsrc ! video/x-raw-yuv,format=(fourcc)YUY2,width=320,height=240,framerate=30/1 !
++ * stridetransform ! video/x-raw-yuv-strided,format=(fourcc)YUY2,width=320,height=240,rowstride=700,framerate=30/1 !
++ * stridetransform ! video/x-raw-yuv,format=(fourcc)YUY2,width=320,height=240,framerate=30/1 !
++ * v4l2sink
+ * ]| This pipeline ???? TODO
+ * </refsect2>
+ */
+@@ -43,8 +46,11 @@
+ #include <config.h>
+ #endif
+
+-#include "gststridetransform.h"
++#include <string.h>
++#include <gst/video/video.h>
++
+ #include "gst/gst-i18n-plugin.h"
++#include "gststridetransform.h"
+
+
+ static const GstElementDetails stridetransform_details =
+@@ -53,25 +59,44 @@ GST_ELEMENT_DETAILS ("Stride transform",
+ "Convert between video buffers with and without stride, or with differing stride",
+ "Rob Clark <rob@ti.com>,");
+
++
++/* TODO: add rgb formats too! */
++#define SUPPORTED_CAPS \
++ GST_VIDEO_CAPS_YUV_STRIDED ("{ I420, YV12, YUY2 }", "[ 0, max ]")
++
++
++static GstStaticPadTemplate src_template =
++GST_STATIC_PAD_TEMPLATE ("src",
++ GST_PAD_SRC,
++ GST_PAD_ALWAYS,
++ GST_STATIC_CAPS (SUPPORTED_CAPS)
++ );
++
++static GstStaticPadTemplate sink_template =
++GST_STATIC_PAD_TEMPLATE ("sink",
++ GST_PAD_SINK,
++ GST_PAD_ALWAYS,
++ GST_STATIC_CAPS (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 GstCaps *gst_stride_transform_transform_caps (GstBaseTransform * base,
+- GstPadDirection direction, GstCaps * caps);
+-static void gst_stride_transform_fixate_caps (GstBaseTransform * base,
+- GstPadDirection direction, GstCaps * caps, GstCaps * othercaps);
+-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);
+-static GstFlowReturn gst_stride_transform_transform_ip (GstBaseTransform * base,
+- GstBuffer * buf);
++static gboolean gst_stride_transform_get_unit_size (GstBaseTransform *base,
++ GstCaps *caps, guint *size);
++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);
++static GstFlowReturn gst_stride_transform_transform_ip (GstBaseTransform *base,
++ GstBuffer *buf);
+
+ GST_BOILERPLATE (GstStrideTransform, gst_stride_transform, GstVideoFilter, GST_TYPE_VIDEO_FILTER);
+
+@@ -84,10 +109,15 @@ gst_stride_transform_base_init (gpointer g_class)
+ GST_DEBUG_CATEGORY_INIT (stridetransform_debug, "stride", 0, "stride transform element");
+
+ gst_element_class_set_details (gstelement_class, &stridetransform_details);
++
++ gst_element_class_add_pad_template (gstelement_class,
++ gst_static_pad_template_get (&sink_template));
++ gst_element_class_add_pad_template (gstelement_class,
++ gst_static_pad_template_get (&src_template));
+ }
+
+ 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);
+@@ -98,8 +128,6 @@ gst_stride_transform_class_init (GstStrideTransformClass * klass)
+ GST_DEBUG_FUNCPTR (gst_stride_transform_get_unit_size);
+ basetransform_class->transform_caps =
+ GST_DEBUG_FUNCPTR (gst_stride_transform_transform_caps);
+- basetransform_class->fixate_caps =
+- GST_DEBUG_FUNCPTR (gst_stride_transform_fixate_caps);
+ basetransform_class->set_caps =
+ GST_DEBUG_FUNCPTR (gst_stride_transform_set_caps);
+ basetransform_class->transform_ip =
+@@ -111,57 +139,135 @@ 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");
+ G_OBJECT_CLASS (parent_class)->dispose (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);
+- GST_DEBUG_OBJECT (self, "not implemented");
+- return FALSE;
++ GstVideoFormat format;
++ gint width, height, rowstride;
++
++ 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);
++
++ GST_DEBUG_OBJECT (self,
++ "format=%d, width=%d, height=%d, rowstride=%d -> size=%d",
++ format, width, height, rowstride, *size);
++
++ return TRUE;
+ }
+
+-static GstCaps *
+-gst_stride_transform_transform_caps (GstBaseTransform * base,
+- GstPadDirection direction, GstCaps * caps)
++
++/**
++ * 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)
+ {
+- GstStrideTransform *self = GST_STRIDE_TRANSFORM (base);
+- GST_DEBUG_OBJECT (self, "not implemented");
+- return NULL;
++ gint idx;
++ GstStructure *new_s = gst_structure_new (name, NULL);
++
++ if (rowstride) {
++ gst_structure_set (new_s, "rowstride", GST_TYPE_INT_RANGE, 1, 1000, NULL); // XXX
++ }
++
++ idx = gst_structure_n_fields (s) - 1;
++ while (idx >= 0) {
++ const gchar *name = gst_structure_nth_field_name (s, idx);
++ if (strcmp ("rowstride", name)) {
++ const GValue *val = gst_structure_get_value (s, name);
++ gst_structure_set_value (new_s, name, val);
++ }
++ idx--;
++ }
++
++ gst_caps_merge_structure (caps, new_s);
+ }
+
+-static void
+-gst_stride_transform_fixate_caps (GstBaseTransform * base,
+- GstPadDirection direction, GstCaps * caps, GstCaps * othercaps)
++
++/**
++ * we can transform @caps to strided or non-strided caps with otherwise
++ * identical parameters
++ */
++static GstCaps *
++gst_stride_transform_transform_caps (GstBaseTransform *base,
++ GstPadDirection direction, GstCaps *caps)
+ {
+ GstStrideTransform *self = GST_STRIDE_TRANSFORM (base);
+- GST_DEBUG_OBJECT (self, "not implemented");
++ GstCaps *ret;
++ GstStructure *s;
++
++ g_return_val_if_fail (GST_CAPS_IS_SIMPLE (caps), NULL);
++
++ GST_DEBUG_OBJECT (self, "direction=%d, caps=%p", direction, caps);
++ LOG_CAPS (self, caps);
++
++ ret = gst_caps_new_empty ();
++ s = gst_caps_get_structure (caps, 0);
++
++ if (gst_structure_has_name (s, "video/x-raw-yuv") ||
++ gst_structure_has_name (s, "video/x-raw-yuv-strided")) {
++
++ add_all_fields (ret, "video/x-raw-yuv", s, FALSE);
++ add_all_fields (ret, "video/x-raw-yuv-strided", s, TRUE);
++
++ } else if (gst_structure_has_name (s, "video/x-raw-rgb") ||
++ gst_structure_has_name (s, "video/x-raw-rgb-strided")) {
++
++ add_all_fields (ret, "video/x-raw-rgb", s, FALSE);
++ add_all_fields (ret, "video/x-raw-rgb-strided", s, TRUE);
++
++ }
++
++ LOG_CAPS (self, ret);
++
++ return ret;
+ }
+
++/**
++ * at this point, we have identical fourcc, width, and height for @incaps
++ * and @outcaps.. so we need to extract these to use for transforming,
++ * 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);
+- GST_DEBUG_OBJECT (self, "not implemented");
+- return FALSE;
++
++ LOG_CAPS (self, incaps);
++ LOG_CAPS (self, outcaps);
++
++ g_return_val_if_fail (gst_video_format_parse_caps_strided (incaps,
++ &self->format, &self->width, &self->height, &self->in_rowstride), FALSE);
++ g_return_val_if_fail (gst_video_format_parse_caps_strided (outcaps,
++ NULL, NULL, NULL, &self->out_rowstride), FALSE);
++
++ return TRUE;
+ }
+
+-static GstFlowReturn gst_stride_transform_transform (GstBaseTransform * base,
+- GstBuffer * inbuf, GstBuffer * outbuf)
++static GstFlowReturn
++gst_stride_transform_transform (GstBaseTransform *base,
++ GstBuffer *inbuf, GstBuffer *outbuf)
+ {
+ GstStrideTransform *self = GST_STRIDE_TRANSFORM (base);
+ GST_DEBUG_OBJECT (self, "not implemented");
+@@ -169,8 +275,8 @@ static GstFlowReturn gst_stride_transform_transform (GstBaseTransform * base,
+ }
+
+ static GstFlowReturn
+-gst_stride_transform_transform_ip (GstBaseTransform * base,
+- GstBuffer * buf)
++gst_stride_transform_transform_ip (GstBaseTransform *base,
++ GstBuffer *buf)
+ {
+ GstStrideTransform *self = GST_STRIDE_TRANSFORM (base);
+ GST_DEBUG_OBJECT (self, "not implemented");
+diff --git a/gst/stride/gststridetransform.h b/gst/stride/gststridetransform.h
+index b4f7d59..d80197f 100644
+--- a/gst/stride/gststridetransform.h
++++ b/gst/stride/gststridetransform.h
+@@ -27,6 +27,8 @@
+
+
+ #include <gst/video/gstvideofilter.h>
++#include <gst/video/video.h>
++
+
+ G_BEGIN_DECLS
+
+@@ -52,6 +54,11 @@ typedef struct _GstStrideTransformClass GstStrideTransformClass;
+ struct _GstStrideTransform {
+ GstVideoFilter videofilter;
+
++ /*< private >*/
++ GstVideoFormat format;
++ gint width, height;
++ gint in_rowstride;
++ gint out_rowstride;
+ };
+
+ struct _GstStrideTransformClass {
+@@ -63,4 +70,35 @@ GType gst_stride_transform_get_type (void);
+ G_END_DECLS
+
+
++
++
++/* note: in case this is a build with TTIF logging, we can optimize slightly
++ * and avoid the gst_caps_to_string() in case logging isn't enabled by using
++ * the TTIF_TRACE_ARG_PROCESSOR feature of ttif_trace_fprintf():
++ */
++#ifdef GST_LOG_OVER_TTIF
++# define LOG_CAPS(obj, caps) G_STMT_START { \
++ if (caps) { \
++ static TTIF_TRACE_ARG_PROCESSOR proc = { \
++ .convert = (char (*)(void *))gst_caps_to_string, \
++ .free = (void (*)(char *))g_free \
++ }; \
++ GST_DEBUG_OBJECT (obj, "%s: %qs", #caps, &proc, (caps)); \
++ } else { \
++ GST_DEBUG_OBJECT (obj, "null"); \
++ } \
++ } G_STMT_END
++#else
++# define LOG_CAPS(obj, caps) G_STMT_START { \
++ if (caps) { \
++ gchar *capstr = gst_caps_to_string (caps); \
++ GST_DEBUG_OBJECT (obj, "%s: %s", #caps, capstr); \
++ g_free (capstr); \
++ } else { \
++ GST_DEBUG_OBJECT (obj, "null"); \
++ } \
++ } G_STMT_END
++#endif
++
++
+ #endif /* __GSTSTRIDETRANSFORM_H__ */
+--
+1.7.1
+