summaryrefslogtreecommitdiffstats
path: root/gst/multipart
diff options
context:
space:
mode:
authorPatrick Radizi <patrick.radizi@axis.com>2008-05-21 09:38:48 +0000
committerWim Taymans <wim.taymans@gmail.com>2008-05-21 09:38:48 +0000
commit94fb1d987043113b847131f86b3b096d7dbea8a1 (patch)
tree1983f09809a98e0e0ec8c24228419dbdd2a87228 /gst/multipart
parentb9775592e388cea7fe8f100001f6e81a99fbbe01 (diff)
gst/multipart/multipartdemux.*: Don't blindly copy the mime-type as the caps name because they not always map directl...
Original commit message from CVS: Patch by: Patrick Radizi <patrick dot radizi at axis dot com> * gst/multipart/multipartdemux.c: (gst_multipart_demux_class_init), (gst_multipart_demux_get_gstname), (gst_multipart_find_pad_by_mime), (gst_multipart_demux_chain): * gst/multipart/multipartdemux.h: Don't blindly copy the mime-type as the caps name because they not always map directly. Instead use a hashtable with common mappings. Fixes #533287.
Diffstat (limited to 'gst/multipart')
-rw-r--r--gst/multipart/multipartdemux.c47
-rw-r--r--gst/multipart/multipartdemux.h3
2 files changed, 49 insertions, 1 deletions
diff --git a/gst/multipart/multipartdemux.c b/gst/multipart/multipartdemux.c
index b4cbbd75..f5efda70 100644
--- a/gst/multipart/multipartdemux.c
+++ b/gst/multipart/multipartdemux.c
@@ -100,6 +100,19 @@ GST_STATIC_PAD_TEMPLATE ("sink",
GST_STATIC_CAPS ("multipart/x-mixed-replace")
);
+typedef struct
+{
+ const gchar *key;
+ const gchar *val;
+} GstNamesMap;
+
+/* convert from mime types to gst structure names. Add more when needed. */
+static const GstNamesMap gstnames[] = {
+ {"audio/basic", "audio/x-mulaw"},
+ {NULL, NULL}
+};
+
+
static GstFlowReturn gst_multipart_demux_chain (GstPad * pad, GstBuffer * buf);
static GstStateChangeReturn gst_multipart_demux_change_state (GstElement *
@@ -131,6 +144,8 @@ gst_multipart_demux_base_init (gpointer g_class)
static void
gst_multipart_demux_class_init (GstMultipartDemuxClass * klass)
{
+ int i;
+
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
@@ -148,6 +163,13 @@ gst_multipart_demux_class_init (GstMultipartDemuxClass * klass)
"Try to autofind the prefix (deprecated unused, see boundary)",
DEFAULT_AUTOSCAN, G_PARAM_READWRITE));
+ /* populate gst names and mime types pairs */
+ klass->gstnames = g_hash_table_new (g_str_hash, g_str_equal);
+ for (i = 0; gstnames[i].key; i++) {
+ g_hash_table_insert (klass->gstnames, (gpointer) gstnames[i].key,
+ (gpointer) gstnames[i].val);
+ }
+
gstelement_class->change_state = gst_multipart_demux_change_state;
}
@@ -185,6 +207,23 @@ gst_multipart_demux_finalize (GObject * object)
G_OBJECT_CLASS (parent_class)->finalize (object);
}
+static const gchar *
+gst_multipart_demux_get_gstname (GstMultipartDemux * demux, gchar * mimetype)
+{
+ GstMultipartDemuxClass *klass;
+ const gchar *gstname;
+
+ klass = GST_MULTIPART_DEMUX_GET_CLASS (demux);
+
+ /* use hashtable to convert to gst name */
+ gstname = g_hash_table_lookup (klass->gstnames, mimetype);
+ if (gstname == NULL) {
+ /* no gst name mapping, use mime type */
+ gstname = mimetype;
+ }
+ return gstname;
+}
+
static GstMultipartPad *
gst_multipart_find_pad_by_mime (GstMultipartDemux * demux, gchar * mime,
gboolean * created)
@@ -209,6 +248,7 @@ gst_multipart_find_pad_by_mime (GstMultipartDemux * demux, gchar * mime,
GstPad *pad;
GstMultipartPad *mppad;
gchar *name;
+ const gchar *capsname;
GstCaps *caps;
mppad = g_new0 (GstMultipartPad, 1);
@@ -220,9 +260,13 @@ gst_multipart_find_pad_by_mime (GstMultipartDemux * demux, gchar * mime,
gst_pad_new_from_static_template (&multipart_demux_src_template_factory,
name);
g_free (name);
- caps = gst_caps_from_string (mime);
+
+ /* take the mime type, convert it to the caps name */
+ capsname = gst_multipart_demux_get_gstname (demux, mime);
+ caps = gst_caps_from_string (capsname);
gst_pad_use_fixed_caps (pad);
gst_pad_set_caps (pad, caps);
+ gst_caps_unref (caps);
mppad->pad = pad;
mppad->mime = g_strdup (mime);
@@ -520,6 +564,7 @@ gst_multipart_demux_change_state (GstElement * element,
return ret;
}
+
static void
gst_multipart_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)
diff --git a/gst/multipart/multipartdemux.h b/gst/multipart/multipartdemux.h
index b481b6a7..af51d5ba 100644
--- a/gst/multipart/multipartdemux.h
+++ b/gst/multipart/multipartdemux.h
@@ -33,6 +33,7 @@ G_BEGIN_DECLS
#define GST_TYPE_MULTIPART_DEMUX (gst_multipart_demux_get_type())
#define GST_MULTIPART_DEMUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MULTIPART_DEMUX, GstMultipartDemux))
#define GST_MULTIPART_DEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MULTIPART_DEMUX, GstMultipartDemux))
+#define GST_MULTIPART_DEMUX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_MULTIPART_DEMUX, GstMultipartDemuxClass))
#define GST_IS_MULTIPART_DEMUX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MULTIPART_DEMUX))
#define GST_IS_MULTIPART_DEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MULTIPART_DEMUX))
@@ -86,6 +87,8 @@ struct _GstMultipartDemux
struct _GstMultipartDemuxClass
{
GstElementClass parent_class;
+
+ GHashTable *gstnames;
};
G_END_DECLS