From: <sl...@ke...> - 2008-12-11 14:35:27
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Thu Dec 11 2008 14:35:22 UTC Log message: * gst/mxf/mxfdemux.c: (gst_mxf_demux_handle_metadata_track), (gst_mxf_demux_handle_header_metadata_resolve_references), (gst_mxf_demux_handle_metadata): * gst/mxf/mxfparse.c: (mxf_metadata_track_parse), (mxf_metadata_structural_component_parse), (mxf_metadata_structural_component_reset): * gst/mxf/mxfparse.h: * gst/mxf/mxftypes.h: Implement parsing of Event Tracks, Static Tracks, DM Segments and DM Source Clips as a preparation for descriptive metadata support. Next step is to implement SMPTE S380M, "Descriptive Metadata Scheme-1". Modified files: . : ChangeLog gst/mxf : mxfdemux.c mxfparse.c mxfparse.h mxftypes.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3803&r2=1.3804 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.33&r2=1.34 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c.diff?r1=1.20&r2=1.21 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h.diff?r1=1.11&r2=1.12 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxftypes.h.diff?r1=1.7&r2=1.8 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3803 retrieving revision 1.3804 diff -u -d -r1.3803 -r1.3804 --- ChangeLog 9 Dec 2008 13:44:43 -0000 1.3803 +++ ChangeLog 11 Dec 2008 14:35:06 -0000 1.3804 @@ -1,3 +1,18 @@ +2008-12-11 Sebastian Dröge <seb...@co...> + + * gst/mxf/mxfdemux.c: (gst_mxf_demux_handle_metadata_track), + (gst_mxf_demux_handle_header_metadata_resolve_references), + (gst_mxf_demux_handle_metadata): + * gst/mxf/mxfparse.c: (mxf_metadata_track_parse), + (mxf_metadata_structural_component_parse), + (mxf_metadata_structural_component_reset): + * gst/mxf/mxfparse.h: + * gst/mxf/mxftypes.h: + Implement parsing of Event Tracks, Static Tracks, DM Segments + and DM Source Clips as a preparation for descriptive metadata + support. Next step is to implement SMPTE S380M, "Descriptive + Metadata Scheme-1". 2008-12-09 Sebastian Dröge <seb...@co...> * gst/mxf/mxfjpeg2000.c: (mxf_jpeg2000_create_caps): Index: mxfdemux.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v retrieving revision 1.33 retrieving revision 1.34 diff -u -d -r1.33 -r1.34 --- mxfdemux.c 8 Dec 2008 15:28:58 -0000 1.33 +++ mxfdemux.c 11 Dec 2008 14:35:07 -0000 1.34 @@ -720,17 +720,18 @@ static GstFlowReturn gst_mxf_demux_handle_metadata_track (GstMXFDemux * demux, - const MXFUL * key, GstBuffer * buffer) + const MXFUL * key, guint16 type, GstBuffer * buffer) { MXFMetadataTrack track; GST_DEBUG_OBJECT (demux, - "Handling metadata track of size %u" - " at offset %" G_GUINT64_FORMAT, GST_BUFFER_SIZE (buffer), demux->offset); + "Handling metadata track with type 0x%04x of size %u" + " at offset %" G_GUINT64_FORMAT, type, GST_BUFFER_SIZE (buffer), + demux->offset); if (!mxf_metadata_track_parse (key, &track, &demux->primer, - GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer))) { - GST_ERROR_OBJECT (demux, "Parsing metadata track timecode failed"); + type, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer))) { + GST_ERROR_OBJECT (demux, "Parsing metadata track failed"); return GST_FLOW_ERROR; } @@ -1287,8 +1288,6 @@ demux->preface.content_storage = &demux->content_storage; - /* TODO: dm_schemes */ - /* Content storage */ demux->content_storage.packages = g_new0 (MXFMetadataGenericPackage *, demux->content_storage.n_packages); @@ -1317,8 +1316,9 @@ MXFMetadataEssenceContainerData, i); for (j = 0; j < demux->content_storage.n_essence_container_data; j++) { - if (mxf_ul_is_equal (&demux->content_storage. - essence_container_data_uids[j], &data->instance_uid)) { + if (mxf_ul_is_equal (&demux-> + content_storage.essence_container_data_uids[j], + &data->instance_uid)) { demux->content_storage.essence_container_data[j] = data; break; } @@ -1500,7 +1500,8 @@ &g_array_index (demux->structural_component, MXFMetadataStructuralComponent, i); - if (component->type != MXF_METADATA_SOURCE_CLIP) + if (component->type != MXF_METADATA_SOURCE_CLIP + && component->type != MXF_METADATA_DM_SOURCE_CLIP) continue; for (j = 0; j < demux->source_package->len; j++) { @@ -1508,10 +1509,16 @@ &g_array_index (demux->source_package, MXFMetadataGenericPackage, j); - if (mxf_umid_is_equal (&component->source_clip.source_package_id, + if (component->type == MXF_METADATA_SOURCE_CLIP && + mxf_umid_is_equal (&component->source_clip.source_package_id, &package->package_uid)) { component->source_clip.source_package = package; + } else if (component->type == MXF_METADATA_DM_SOURCE_CLIP && + mxf_umid_is_equal (&component->dm_source_clip.source_package_id, + &package->package_uid)) { + component->dm_source_clip.source_package = package; + break; } } @@ -1986,7 +1993,7 @@ "Handling metadata of size %u at offset %" - G_GUINT64_FORMAT " of type 0x%04d", GST_BUFFER_SIZE (buffer), + G_GUINT64_FORMAT " of type 0x%04x", GST_BUFFER_SIZE (buffer), demux->offset, type); if (G_UNLIKELY (!demux->partition.valid)) { @@ -2027,13 +2034,17 @@ ret = gst_mxf_demux_handle_metadata_source_package (demux, key, buffer); break; case MXF_METADATA_TRACK: - ret = gst_mxf_demux_handle_metadata_track (demux, key, buffer); + case MXF_METADATA_EVENT_TRACK: + case MXF_METADATA_STATIC_TRACK: + ret = gst_mxf_demux_handle_metadata_track (demux, key, type, buffer); case MXF_METADATA_SEQUENCE: ret = gst_mxf_demux_handle_metadata_sequence (demux, key, buffer); case MXF_METADATA_TIMECODE_COMPONENT: case MXF_METADATA_SOURCE_CLIP: + case MXF_METADATA_DM_SEGMENT: + case MXF_METADATA_DM_SOURCE_CLIP: ret = gst_mxf_demux_handle_metadata_structural_component (demux, key, type, buffer); Index: mxfparse.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- mxfparse.c 8 Dec 2008 15:46:13 -0000 1.20 +++ mxfparse.c 11 Dec 2008 14:35:07 -0000 1.21 @@ -1694,7 +1694,7 @@ gboolean mxf_metadata_track_parse (const MXFUL * key, MXFMetadataTrack * track, const MXFPrimerPack * primer, - const guint8 * data, guint size) + guint16 type, const guint8 * data, guint size) guint16 tag, tag_size; const guint8 *tag_data; @@ -1704,7 +1704,15 @@ memset (track, 0, sizeof (MXFMetadataTrack)); - GST_DEBUG ("Parsing track:"); + if (type == MXF_METADATA_TRACK) + track->variant = MXF_METADATA_TRACK_VARIANT_TIMELINE; + else if (type == MXF_METADATA_EVENT_TRACK) + track->variant = MXF_METADATA_TRACK_VARIANT_EVENT; + else + track->variant = MXF_METADATA_TRACK_VARIANT_STATIC; + GST_DEBUG ("Parsing track of type 0x%04x:", type); while (mxf_local_tag_parse (data, size, &tag, &tag_size, &tag_data)) { if (tag_size == 0 || tag == 0x0000) @@ -1742,12 +1750,14 @@ GST_DEBUG (" track name = %s", GST_STR_NULL (track->track_name)); break; case 0x4b01: + case 0x4901: if (!mxf_fraction_parse (&track->edit_rate, tag_data, tag_size)) goto error; GST_DEBUG (" edit rate = %d/%d", track->edit_rate.n, track->edit_rate.d); case 0x4b02: + case 0x4902: if (tag_size != 8) track->origin = GST_READ_UINT64_BE (tag_data); @@ -1960,10 +1970,14 @@ GST_DEBUG ("Parsing structural component:"); component->type = type; - GST_DEBUG (" type = %s", - (component->type == - MXF_METADATA_TIMECODE_COMPONENT) ? "timecode component" : - "source clip"); + if (type == MXF_METADATA_TIMECODE_COMPONENT) + GST_DEBUG (" type = timecode component"); + else if (type == MXF_METADATA_SOURCE_CLIP) + GST_DEBUG (" type = source clip"); + else if (type == MXF_METADATA_DM_SEGMENT) + GST_DEBUG (" type = DM segment"); + GST_DEBUG (" type = DM source clip"); @@ -2030,33 +2044,164 @@ /* Source clip specifics */ case 0x1201: - if (type != MXF_METADATA_SOURCE_CLIP) + if (type != MXF_METADATA_SOURCE_CLIP + && type != MXF_METADATA_DM_SOURCE_CLIP) goto DFLT; - component->source_clip.start_position = GST_READ_UINT64_BE (tag_data); - GST_DEBUG (" start position = %" G_GINT64_FORMAT, - component->source_clip.start_position); + if (type == MXF_METADATA_SOURCE_CLIP) { + component->source_clip.start_position = GST_READ_UINT64_BE (tag_data); + GST_DEBUG (" start position = %" G_GINT64_FORMAT, + component->source_clip.start_position); + } else { + component->dm_source_clip.start_position = + GST_READ_UINT64_BE (tag_data); + component->dm_source_clip.start_position); + } case 0x1101: if (tag_size != 32) - memcpy (&component->source_clip.source_package_id, tag_data, 32); - GST_DEBUG (" source package id = %s", - mxf_umid_to_string (&component->source_clip.source_package_id, - str)); + memcpy (&component->source_clip.source_package_id, tag_data, 32); + GST_DEBUG (" source package id = %s", + mxf_umid_to_string (&component->source_clip.source_package_id, + str)); + memcpy (&component->dm_source_clip.source_package_id, tag_data, 32); + mxf_umid_to_string (&component->dm_source_clip.source_package_id, case 0x1102: if (tag_size != 4) - component->source_clip.source_track_id = GST_READ_UINT32_BE (tag_data); - GST_DEBUG (" source track id = %u", - component->source_clip.source_track_id); + component->source_clip.source_track_id = + GST_READ_UINT32_BE (tag_data); + GST_DEBUG (" source track id = %u", + component->source_clip.source_track_id); + component->dm_source_clip.source_track_id = + component->dm_source_clip.source_track_id); + break; + /* DM Segment specifics */ + case 0x0601: + if (type != MXF_METADATA_DM_SEGMENT) + goto DFLT; + if (tag_size != 8) + goto error; + component->dm_segment.event_start_position = + GST_READ_UINT64_BE (tag_data); + GST_DEBUG (" event start position = %" G_GINT64_FORMAT, + component->dm_segment.event_start_position); + case 0x0602: + component->dm_segment.event_comment = + mxf_utf16_to_utf8 (tag_data, tag_size); + GST_DEBUG (" event comment = %s", + GST_STR_NULL (component->dm_segment.event_comment)); + case 0x6102: + { + guint32 len; + guint i; + if (tag_size < 8) + len = GST_READ_UINT32_BE (tag_data); + GST_DEBUG (" number of track ids = %u", len); + if (len == 0) + goto next; + if (GST_READ_UINT32_BE (tag_data + 4) != 4) + if (len * 4 + 8 < tag_size) + component->dm_segment.n_track_ids = len; + component->dm_segment.track_ids = g_new0 (guint32, len); + tag_data += 8; + tag_size -= 8; + for (i = 0; i < len; i++) { + component->dm_segment.track_ids[i] = GST_READ_UINT32_BE (tag_data); + GST_DEBUG (" track id %u = %u", i, + component->dm_segment.track_ids[i]); + tag_data += 4; + tag_size -= 4; + } + case 0x6101: + if (tag_size != 16) + memcpy (&component->dm_segment.dm_framework, tag_data, 16); + GST_DEBUG (" DM framework = %s", + mxf_ul_to_string (&component->dm_segment.dm_framework, str)); + /* DM Source Clip specifics */ + case 0x6103: + if (type != MXF_METADATA_DM_SOURCE_CLIP) + if (tag_size < 8 + 4 * len) + component->dm_source_clip.n_track_ids = len; + component->dm_source_clip.track_ids = g_new0 (guint32, len); + component->dm_source_clip.track_ids[i] = + component->dm_source_clip.track_ids[i]); DFLT: default: if (!gst_metadata_add_custom_tag (primer, tag, tag_data, tag_size, @@ -2084,6 +2229,13 @@ g_return_if_fail (component != NULL); + if (component->type == MXF_METADATA_DM_SEGMENT) { + g_free (component->dm_segment.event_comment); + g_free (component->dm_segment.track_ids); + } else if (component->type == MXF_METADATA_DM_SOURCE_CLIP) { + g_free (component->dm_source_clip.track_ids); + } if (component->other_tags) g_hash_table_destroy (component->other_tags); Index: mxfparse.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- mxfparse.h 5 Dec 2008 12:26:02 -0000 1.11 +++ mxfparse.h 11 Dec 2008 14:35:07 -0000 1.12 @@ -106,7 +106,7 @@ gboolean mxf_metadata_generic_package_parse (const MXFUL *key, MXFMetadataGenericPackage *generic_package, const MXFPrimerPack *primer, const guint8 *data, guint size); void mxf_metadata_generic_package_reset (MXFMetadataGenericPackage *generic_package); -gboolean mxf_metadata_track_parse (const MXFUL *key, MXFMetadataTrack *track, const MXFPrimerPack *primer, const guint8 *data, guint size); +gboolean mxf_metadata_track_parse (const MXFUL *key, MXFMetadataTrack *track, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size); void mxf_metadata_track_reset (MXFMetadataTrack *track); MXFMetadataTrackType mxf_metadata_track_identifier_parse (const MXFUL *track_identifier); Index: mxftypes.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxftypes.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- mxftypes.h 8 Dec 2008 15:28:58 -0000 1.7 +++ mxftypes.h 11 Dec 2008 14:35:08 -0000 1.8 @@ -327,6 +327,12 @@ MXF_METADATA_TRACK_PARSED_TEXT = 0x41 } MXFMetadataTrackType; +typedef enum { + MXF_METADATA_TRACK_VARIANT_TIMELINE, + MXF_METADATA_TRACK_VARIANT_EVENT, + MXF_METADATA_TRACK_VARIANT_STATIC +} MXFMetadataTrackVariant; struct _MXFMetadataTrack { MXFUL instance_uid; MXFUL generation_uid; @@ -335,6 +341,7 @@ guint32 track_number; MXFMetadataTrackType type; + MXFMetadataTrackVariant variant; gchar *track_name; @@ -390,6 +397,27 @@ guint32 source_track_id; } source_clip; + struct { + gint64 event_start_position; + gchar *event_comment; + guint32 n_track_ids; + guint32 *track_ids; + + MXFUL dm_framework; + } dm_segment; + gint64 start_position; + MXFUMID source_package_id; + MXFMetadataGenericPackage *source_package; + guint32 source_track_id; + } dm_source_clip; }; GHashTable *other_tags; |