From: <tp...@ke...> - 2008-01-08 16:31:39
|
CVS Root: /cvs/gstreamer Module: gst-plugins-ugly Changes by: tpm Date: Tue Jan 08 2008 16:31:43 UTC Log message: * gst/asfdemux/gstasfdemux.c: (asfdemux_dbg), (gst_asf_demux_reset), (gst_asf_demux_add_video_stream), (gst_asf_demux_process_ext_content_desc), (gst_asf_demux_get_metadata_for_stream), (gst_asf_demux_process_metadata), (gst_asf_demux_process_object), (gst_asf_demux_change_state): * gst/asfdemux/gstasfdemux.h: Parse metadata object and extract pixel aspect ratio. Fixes #507844. Modified files: . : ChangeLog gst/asfdemux : gstasfdemux.c gstasfdemux.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/ChangeLog.diff?r1=1.2297&r2=1.2298 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/gst/asfdemux/gstasfdemux.c.diff?r1=1.137&r2=1.138 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/gst/asfdemux/gstasfdemux.h.diff?r1=1.34&r2=1.35 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-ugly/ChangeLog,v retrieving revision 1.2297 retrieving revision 1.2298 diff -u -d -r1.2297 -r1.2298 --- ChangeLog 31 Dec 2007 21:41:51 -0000 1.2297 +++ ChangeLog 8 Jan 2008 16:31:28 -0000 1.2298 @@ -1,3 +1,14 @@ +2008-01-08 Tim-Philipp Müller <tim at centricular dot net> + + * gst/asfdemux/gstasfdemux.c: (asfdemux_dbg), (gst_asf_demux_reset), + (gst_asf_demux_add_video_stream), + (gst_asf_demux_process_ext_content_desc), + (gst_asf_demux_get_metadata_for_stream), + (gst_asf_demux_process_metadata), (gst_asf_demux_process_object), + (gst_asf_demux_change_state): + * gst/asfdemux/gstasfdemux.h: + Parse metadata object and extract pixel aspect ratio. Fixes #507844. 2007-12-31 David Schleef <ds...@sc...> * docs/plugins/.cvsignore: Index: gstasfdemux.c RCS file: /cvs/gstreamer/gst-plugins-ugly/gst/asfdemux/gstasfdemux.c,v retrieving revision 1.137 retrieving revision 1.138 diff -u -d -r1.137 -r1.138 --- gstasfdemux.c 13 Nov 2007 06:57:57 -0000 1.137 +++ gstasfdemux.c 8 Jan 2008 16:31:29 -0000 1.138 @@ -110,6 +110,8 @@ AsfStream * stream, GstBuffer ** p_buffer); static void gst_asf_demux_activate_stream (GstASFDemux * demux, AsfStream * stream); +static GstStructure *gst_asf_demux_get_metadata_for_stream (GstASFDemux * d, + guint stream_num); GST_BOILERPLATE (GstASFDemux, gst_asf_demux, GstElement, GST_TYPE_ELEMENT); @@ -190,6 +192,10 @@ gst_tag_list_free (demux->taglist); demux->taglist = NULL; } + if (demux->metadata) { + gst_caps_unref (demux->metadata); + demux->metadata = NULL; + } demux->state = GST_ASF_DEMUX_STATE_HEADER; g_free (demux->objpath); demux->objpath = NULL; @@ -1716,6 +1722,16 @@ if (caps == NULL) { caps = gst_caps_new_simple ("video/x-asf-unknown", "fourcc", GST_TYPE_FOURCC, video->tag, NULL); + } else { + GstStructure *s; + gint ax, ay; + s = gst_asf_demux_get_metadata_for_stream (demux, id); + if (gst_structure_get_int (s, "AspectRatioX", &ax) && + gst_structure_get_int (s, "AspectRatioY", &ay)) { + gst_caps_set_simple (caps, "pixel-aspect-ratio", GST_TYPE_FRACTION, + ax, ay, NULL); + } /* add fourcc format to caps, some proprietary decoders seem to need it */ @@ -2137,6 +2153,103 @@ } +static GstStructure * +gst_asf_demux_get_metadata_for_stream (GstASFDemux * demux, guint stream_num) +{ + gchar sname[32]; + guint i; + g_snprintf (sname, sizeof (sname), "stream-%u", stream_num); + for (i = 0; i < gst_caps_get_size (demux->metadata); ++i) { + s = gst_caps_get_structure (demux->metadata, i); + if (gst_structure_has_name (s, sname)) + return s; + gst_caps_append_structure (demux->metadata, gst_structure_empty_new (sname)); + /* try lookup again; demux->metadata took ownership of the structure, so we + * can't really make any assumptions about what happened to it, so we can't + * just return it directly after appending it */ + return gst_asf_demux_get_metadata_for_stream (demux, stream_num); +} +static GstFlowReturn +gst_asf_demux_process_metadata (GstASFDemux * demux, guint8 * data, + guint64 size) + guint16 blockcount, i; + GST_INFO_OBJECT (demux, "object is a metadata object"); + /* Content Descriptor Count */ + if (size < 2) + goto not_enough_data; + blockcount = gst_asf_demux_get_uint16 (&data, &size); + for (i = 0; i < blockcount; ++i) { + guint16 lang_idx, stream_num, name_len, data_type; + guint32 data_len, ival; + gchar *name_utf8; + if (size < (2 + 2 + 2 + 2 + 4)) + goto not_enough_data; + lang_idx = gst_asf_demux_get_uint16 (&data, &size); + stream_num = gst_asf_demux_get_uint16 (&data, &size); + name_len = gst_asf_demux_get_uint16 (&data, &size); + data_type = gst_asf_demux_get_uint16 (&data, &size); + data_len = gst_asf_demux_get_uint32 (&data, &size); + if (size < name_len + data_len) + /* convert name to UTF-8 */ + name_utf8 = g_convert ((gchar *) data, name_len, "UTF-8", "UTF-16LE", + NULL, NULL, NULL); + gst_asf_demux_skip_bytes (name_len, &data, &size); + if (name_utf8 == NULL) { + GST_WARNING ("Failed to convert value name to UTF8, skipping"); + gst_asf_demux_skip_bytes (data_len, &data, &size); + continue; + if (data_type != ASF_DEMUX_DATA_TYPE_DWORD) { + /* read DWORD */ + if (size < 4) + ival = gst_asf_demux_get_uint32 (&data, &size); + /* skip anything else there may be, just in case */ + gst_asf_demux_skip_bytes (data_len - 4, &data, &size); + s = gst_asf_demux_get_metadata_for_stream (demux, stream_num); + gst_structure_set (s, name_utf8, G_TYPE_INT, ival, NULL); + g_free (name_utf8); + GST_INFO_OBJECT (demux, "metadata = %" GST_PTR_FORMAT, demux->metadata); + return GST_FLOW_OK; + /* Errors */ +not_enough_data: + { + GST_WARNING ("Unexpected end of data parsing metadata object"); + return GST_FLOW_OK; /* not really fatal */ static GstFlowReturn gst_asf_demux_process_header (GstASFDemux * demux, guint8 * data, guint64 size) { @@ -2889,6 +3002,9 @@ gst_asf_demux_process_ext_content_desc (demux, *p_data, obj_data_size); break; + case ASF_OBJ_METADATA_OBJECT: + ret = gst_asf_demux_process_metadata (demux, *p_data, obj_data_size); + break; case ASF_OBJ_EXTENDED_STREAM_PROPS:{ GstBuffer *buf; @@ -2922,7 +3038,6 @@ case ASF_OBJ_INDEX: case ASF_OBJ_PADDING: case ASF_OBJ_BITRATE_MUTEX: - case ASF_OBJ_METADATA_OBJECT: case ASF_OBJ_COMPATIBILITY: case ASF_OBJ_INDEX_PLACEHOLDER: case ASF_OBJ_INDEX_PARAMETERS: @@ -3769,6 +3884,7 @@ demux->need_newsegment = TRUE; demux->segment_running = FALSE; demux->adapter = gst_adapter_new (); + demux->metadata = gst_caps_new_empty (); demux->data_size = 0; demux->data_offset = 0; demux->index_offset = 0; @@ -3784,6 +3900,7 @@ switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: + case GST_STATE_CHANGE_READY_TO_NULL: gst_asf_demux_reset (demux); default: Index: gstasfdemux.h RCS file: /cvs/gstreamer/gst-plugins-ugly/gst/asfdemux/gstasfdemux.h,v retrieving revision 1.34 retrieving revision 1.35 diff -u -d -r1.34 -r1.35 --- gstasfdemux.h 7 May 2007 13:51:43 -0000 1.34 +++ gstasfdemux.h 8 Jan 2008 16:31:29 -0000 1.35 @@ -142,6 +142,9 @@ gchar **languages; guint num_languages; + GstCaps *metadata; /* metadata, for delayed parsing; one + * structure ('stream-N') per stream */ GSList *ext_stream_props; /* for delayed processing (buffers) */ GSList *mut_ex_streams; /* mutually exclusive streams */ |