diff options
-rw-r--r-- | ChangeLog | 17 | ||||
-rw-r--r-- | gst/avi/gstavidemux.c | 36 | ||||
-rw-r--r-- | gst/matroska/matroska-demux.c | 45 |
3 files changed, 85 insertions, 13 deletions
@@ -1,3 +1,20 @@ +2004-02-23 Julien MOUTTE <julien@moutte.net> + + * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps), + (gst_riff_create_audio_caps), (gst_riff_create_iavs_caps), + (gst_riff_create_video_template_caps), + (gst_riff_create_audio_template_caps), + (gst_riff_create_iavs_template_caps): + * gst-libs/gst/riff/riff-media.h: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init), + (gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream), + (gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream): + * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream): + * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), + (gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps), + (gst_matroska_demux_plugin_init): First batch implementing audio and + video codec tags in demuxers. + 2004-02-22 Benjamin Otte <otte@gnome.org> * ext/xine/Makefile.am: diff --git a/gst/avi/gstavidemux.c b/gst/avi/gstavidemux.c index 2dc595d2..1b50b98e 100644 --- a/gst/avi/gstavidemux.c +++ b/gst/avi/gstavidemux.c @@ -863,26 +863,56 @@ gst_avi_demux_add_stream (GstAviDemux *avi) /* create stream name + pad */ switch (strh->type) { case GST_RIFF_FCC_vids: + { + char *codec_name = NULL; + GstTagList *list = gst_tag_list_new (); padname = g_strdup_printf ("video_%02d", avi->num_v_streams); templ = gst_element_class_get_pad_template (klass, "video_%02d"); - caps = gst_riff_create_video_caps (strf.vids->compression, strh, strf.vids); + caps = gst_riff_create_video_caps (strf.vids->compression, strh, + strf.vids, &codec_name); + gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC, + codec_name, NULL); + gst_element_found_tags (GST_ELEMENT (avi), list); + gst_tag_list_free (list); + if (codec_name) g_free (codec_name); g_free (strf.vids); avi->num_v_streams++; break; + } case GST_RIFF_FCC_auds: + { + char *codec_name = NULL; + GstTagList *list = gst_tag_list_new (); padname = g_strdup_printf ("audio_%02d", avi->num_a_streams); templ = gst_element_class_get_pad_template (klass, "audio_%02d"); - caps = gst_riff_create_audio_caps (strf.auds->format, strh, strf.auds); + caps = gst_riff_create_audio_caps (strf.auds->format, strh, strf.auds, + &codec_name); + gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_AUDIO_CODEC, + codec_name, NULL); + gst_element_found_tags (GST_ELEMENT (avi), list); + gst_tag_list_free (list); + if (codec_name) g_free (codec_name); g_free (strf.auds); avi->num_a_streams++; break; + } case GST_RIFF_FCC_iavs: + { + char *codec_name = NULL; + GstTagList *list = gst_tag_list_new (); padname = g_strdup_printf ("video_%02d", avi->num_v_streams); templ = gst_element_class_get_pad_template (klass, "video_%02d"); - caps = gst_riff_create_iavs_caps (strh->fcc_handler, strh, strf.iavs); + caps = gst_riff_create_iavs_caps (strh->fcc_handler, strh, strf.iavs, + &codec_name); + gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC, + codec_name, NULL); + gst_element_found_tags (GST_ELEMENT (avi), list); + gst_tag_list_free (list); + if (codec_name) g_free (codec_name); g_free (strf.iavs); avi->num_v_streams++; break; + } default: g_assert (0); } diff --git a/gst/matroska/matroska-demux.c b/gst/matroska/matroska-demux.c index cdf70f6a..66537966 100644 --- a/gst/matroska/matroska-demux.c +++ b/gst/matroska/matroska-demux.c @@ -94,12 +94,14 @@ static GstCaps *gst_matroska_demux_video_caps (GstMatroskaTrackVideoCont *videocontext, const gchar *codec_id, gpointer data, - guint size); + guint size, + GstMatroskaDemux *demux); static GstCaps *gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext *audiocontext, const gchar *codec_id, gpointer data, - guint size); + guint size, + GstMatroskaDemux *demux); static GstCaps *gst_matroska_demux_complex_caps (GstMatroskaTrackComplexContext *complexcontext, const gchar *codec_id, @@ -836,7 +838,8 @@ gst_matroska_demux_add_stream (GstMatroskaDemux *demux) caps = gst_matroska_demux_video_caps (videocontext, context->codec_id, context->codec_priv, - context->codec_priv_size); + context->codec_priv_size, + demux); break; } @@ -848,7 +851,8 @@ gst_matroska_demux_add_stream (GstMatroskaDemux *demux) caps = gst_matroska_demux_audio_caps (audiocontext, context->codec_id, context->codec_priv, - context->codec_priv_size); + context->codec_priv_size, + demux); break; } @@ -2164,7 +2168,8 @@ static GstCaps * gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext *videocontext, const gchar *codec_id, gpointer data, - guint size) + guint size, + GstMatroskaDemux *demux) { GstMatroskaTrackContext *context = (GstMatroskaTrackContext *) videocontext; @@ -2174,6 +2179,9 @@ gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext *videocontext, gst_riff_strf_vids *vids = NULL; if (data) { + char *codec_name = NULL; + GstTagList *list = gst_tag_list_new (); + vids = (gst_riff_strf_vids *) data; /* assure size is big enough */ @@ -2198,7 +2206,14 @@ gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext *videocontext, vids->num_colors = GUINT32_FROM_LE (vids->num_colors); vids->imp_colors = GUINT32_FROM_LE (vids->imp_colors); - caps = gst_riff_create_video_caps (vids->compression, NULL, vids); + caps = gst_riff_create_video_caps (vids->compression, NULL, vids, + &codec_name); + gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC, + codec_name, NULL); + if (GST_IS_ELEMENT (demux)) + gst_element_found_tags (GST_ELEMENT (demux), list); + gst_tag_list_free (list); + if (codec_name) g_free (codec_name); } else { caps = gst_riff_create_video_template_caps (); } @@ -2330,7 +2345,8 @@ static GstCaps * gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext *audiocontext, const gchar *codec_id, gpointer data, - guint size) + guint size, + GstMatroskaDemux *demux) { GstMatroskaTrackContext *context = (GstMatroskaTrackContext *) audiocontext; @@ -2396,6 +2412,9 @@ gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext *audiocontext, gst_riff_strf_auds *auds = NULL; if (data) { + char *codec_name = NULL; + GstTagList *list = gst_tag_list_new (); + auds = (gst_riff_strf_auds *) data; /* little-endian -> byte-order */ @@ -2406,7 +2425,13 @@ gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext *audiocontext, auds->blockalign = GUINT16_FROM_LE (auds->blockalign); auds->size = GUINT16_FROM_LE (auds->size); - caps = gst_riff_create_audio_caps (auds->format, NULL, auds); + caps = gst_riff_create_audio_caps (auds->format, NULL, auds, &codec_name); + gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_AUDIO_CODEC, + codec_name, NULL); + if (GST_IS_ELEMENT (demux)) + gst_element_found_tags (GST_ELEMENT (demux), list); + gst_tag_list_free (list); + if (codec_name) g_free (codec_name); } else { caps = gst_riff_create_audio_template_caps (); } @@ -2576,7 +2601,7 @@ gst_matroska_demux_plugin_init (GstPlugin *plugin) /* video src template */ videosrccaps = gst_caps_new_empty (); for (i = 0; video_id[i] != NULL; i++) { - temp = gst_matroska_demux_video_caps (NULL, video_id[i], NULL, 0); + temp = gst_matroska_demux_video_caps (NULL, video_id[i], NULL, 0, NULL); gst_caps_append (videosrccaps, temp); } for (i = 0; complex_id[i] != NULL; i++) { @@ -2591,7 +2616,7 @@ gst_matroska_demux_plugin_init (GstPlugin *plugin) audiosrccaps = gst_caps_new_empty (); /* audio src template */ for (i = 0; audio_id[i] != NULL; i++) { - temp = gst_matroska_demux_audio_caps (NULL, audio_id[i], NULL, 0); + temp = gst_matroska_demux_audio_caps (NULL, audio_id[i], NULL, 0, NULL); gst_caps_append (audiosrccaps, temp); } audiosrctempl = gst_pad_template_new ("audio_%02d", |