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.
This commit is contained in:
Patrick Radizi 2008-05-21 09:38:48 +00:00 committed by Wim Taymans
parent b9775592e3
commit 94fb1d9870
3 changed files with 61 additions and 1 deletions

View file

@ -1,3 +1,15 @@
2008-05-21 Wim Taymans <wim.taymans@collabora.co.uk>
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.
2008-05-20 Wim Taymans <wim.taymans@collabora.co.uk>
* ext/esd/esdsink.c: (gst_esdsink_write):

View file

@ -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)

View file

@ -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