diff options
author | Sebastian Dröge <slomo@circular-chaos.org> | 2008-11-28 11:24:24 +0000 |
---|---|---|
committer | Sebastian Dröge <slomo@circular-chaos.org> | 2008-11-28 11:24:24 +0000 |
commit | 65587b80f51d6ab80bdc076ee4e375b61e7371c4 (patch) | |
tree | 134dc92a555e8721043be097321fbc0efee9b14f /gst/mxf/mxfdemux.c | |
parent | 6ff76898aaba61d6e9c78d4545ff82e44b04c3b2 (diff) | |
download | gst-plugins-bad-65587b80f51d6ab80bdc076ee4e375b61e7371c4.tar.gz gst-plugins-bad-65587b80f51d6ab80bdc076ee4e375b61e7371c4.tar.bz2 gst-plugins-bad-65587b80f51d6ab80bdc076ee4e375b61e7371c4.zip |
gst/mxf/: Implement parsing of index table segments, which will later be used for seeking.
Original commit message from CVS:
* gst/mxf/mxfdemux.c: (gst_mxf_demux_reset),
(gst_mxf_demux_handle_index_table_segment):
* gst/mxf/mxfdemux.h:
* gst/mxf/mxfparse.c: (mxf_index_table_segment_parse),
(mxf_index_table_segment_reset):
* gst/mxf/mxfparse.h:
* gst/mxf/mxftypes.h:
Implement parsing of index table segments, which will later be
used for seeking.
Diffstat (limited to 'gst/mxf/mxfdemux.c')
-rw-r--r-- | gst/mxf/mxfdemux.c | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c index 07151b5e..9813b3a3 100644 --- a/gst/mxf/mxfdemux.c +++ b/gst/mxf/mxfdemux.c @@ -394,6 +394,17 @@ gst_mxf_demux_reset (GstMXFDemux * demux) demux->partition_index = NULL; } + if (demux->index_table) { + guint i; + + for (i = 0; i < demux->index_table->len; i++) + mxf_index_table_segment_reset (&g_array_index (demux->index_table, + MXFIndexTableSegment, i)); + + g_array_free (demux->index_table, TRUE); + demux->index_table = NULL; + } + gst_mxf_demux_reset_mxf_state (demux); gst_mxf_demux_reset_metadata (demux); } @@ -1280,9 +1291,8 @@ gst_mxf_demux_handle_header_metadata_resolve_references (GstMXFDemux * demux) 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; } @@ -2160,11 +2170,32 @@ static GstFlowReturn gst_mxf_demux_handle_index_table_segment (GstMXFDemux * demux, const MXFUL * key, GstBuffer * buffer) { + MXFIndexTableSegment segment; + + memset (&segment, 0, sizeof (segment)); + GST_DEBUG_OBJECT (demux, "Handling index table segment of size %u at offset %" G_GUINT64_FORMAT, GST_BUFFER_SIZE (buffer), demux->offset); - /* TODO: Parse this */ + if (!demux->primer.valid) { + GST_WARNING_OBJECT (demux, "Invalid primer pack"); + return GST_FLOW_OK; + } + + if (!mxf_index_table_segment_parse (key, &segment, &demux->primer, + GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer))) { + + GST_ERROR_OBJECT (demux, "Parsing index table segment failed"); + return GST_FLOW_ERROR; + } + + if (!demux->index_table) + demux->index_table = + g_array_new (FALSE, FALSE, sizeof (MXFIndexTableSegment)); + + g_array_append_val (demux->index_table, segment); + return GST_FLOW_OK; } |