slomo gst-plugins-bad: gst-plugins-bad/ gst-plugins-bad/gst/mxf/ gst-plugins-bad/tests/check/elements/
[email protected] Wed, 31 Dec 2008 00:53:16 -0800 (PST)
| Newsgroups | gmane.comp.video.gstreamer.cvs |
|---|---|
| Message-ID | <[email protected]> |
CVS Root: /cvs/gstreamer
Module: gst-plugins-bad
Changes by: slomo
Date: Wed Dec 31 2008 08:53:16 UTC
Log message:
* gst/mxf/mxfaes-bwf.c: (mxf_bwf_handle_essence_element),
(mxf_aes3_handle_essence_element):
* gst/mxf/mxfalaw.c: (mxf_alaw_handle_essence_element):
* gst/mxf/mxfd10.c: (mxf_d10_picture_handle_essence_element),
(mxf_d10_sound_handle_essence_element):
* gst/mxf/mxfdemux.c: (gst_mxf_demux_pad_init),
(gst_mxf_demux_choose_package),
(gst_mxf_demux_handle_header_metadata_update_streams),
(gst_mxf_demux_pad_next_component),
(gst_mxf_demux_handle_generic_container_essence_element),
(gst_mxf_demux_parse_footer_metadata),
(gst_mxf_demux_handle_klv_packet), (gst_mxf_demux_src_query):
* gst/mxf/mxfdv-dif.c: (mxf_dv_dif_handle_essence_element):
* gst/mxf/mxfjpeg2000.c: (mxf_jpeg2000_handle_essence_element):
* gst/mxf/mxfmetadata.c: (mxf_metadata_sequence_init),
(mxf_metadata_structural_component_init),
(mxf_metadata_generic_picture_essence_descriptor_init):
* gst/mxf/mxfmpeg.c: (mxf_mpeg_video_handle_essence_element),
(mxf_mpeg_audio_handle_essence_element):
* gst/mxf/mxfparse.h:
* gst/mxf/mxfup.c: (mxf_up_handle_essence_element):
* gst/mxf/mxfvc3.c: (mxf_vc3_handle_essence_element):
* tests/check/elements/mxfdemux.c: (_sink_chain):
Implement support for OP2a/b/c and OP3a/b/c, i.e. tracks with
more than a single component. This currently only works for
the case where the components are stored in playback order
in the file.
Set some more default/distinguished values for the structural
metadata.
Make some types more strict by choosing the correct subclasses.
Set DISCONT flag on buffers after a component switch.
Take the last partition from the random index pack for the footer
partition of the header partition doesn't reference the footer
partition. This gives us the final structural metadata for
some more files in the beginning.
Modified files:
. : ChangeLog
gst/mxf : mxfaes-bwf.c mxfalaw.c mxfd10.c mxfdemux.c
mxfdv-dif.c mxfjpeg2000.c mxfmetadata.c
mxfmpeg.c mxfparse.h mxfup.c mxfvc3.c
tests/check/elements: mxfdemux.c
Links:
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3843&r2=1.3844
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.c.diff?r1=1.13&r2=1.14
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfalaw.c.diff?r1=1.7&r2=1.8
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfd10.c.diff?r1=1.7&r2=1.8
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.42&r2=1.43
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdv-dif.c.diff?r1=1.5&r2=1.6
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfjpeg2000.c.diff?r1=1.9&r2=1.10
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfmetadata.c.diff?r1=1.5&r2=1.6
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.c.diff?r1=1.15&r2=1.16
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h.diff?r1=1.14&r2=1.15
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfup.c.diff?r1=1.6&r2=1.7
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfvc3.c.diff?r1=1.1&r2=1.2
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/tests/check/elements/mxfdemux.c.diff?r1=1.3&r2=1.4
====Begin Diffs====
Index: ChangeLog
===================================================================
RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v
retrieving revision 1.3843
retrieving revision 1.3844
diff -u -d -r1.3843 -r1.3844
--- ChangeLog 29 Dec 2008 18:22:25 -0000 1.3843
+++ ChangeLog 31 Dec 2008 08:52:59 -0000 1.3844
@@ -1,3 +1,45 @@
+2008-12-31 Sebastian Dröge <[email protected]>
+
+ * gst/mxf/mxfaes-bwf.c: (mxf_bwf_handle_essence_element),
+ (mxf_aes3_handle_essence_element):
+ * gst/mxf/mxfalaw.c: (mxf_alaw_handle_essence_element):
+ * gst/mxf/mxfd10.c: (mxf_d10_picture_handle_essence_element),
+ (mxf_d10_sound_handle_essence_element):
+ * gst/mxf/mxfdemux.c: (gst_mxf_demux_pad_init),
+ (gst_mxf_demux_choose_package),
+ (gst_mxf_demux_handle_header_metadata_update_streams),
+ (gst_mxf_demux_pad_next_component),
+ (gst_mxf_demux_handle_generic_container_essence_element),
+ (gst_mxf_demux_parse_footer_metadata),
+ (gst_mxf_demux_handle_klv_packet), (gst_mxf_demux_src_query):
+ * gst/mxf/mxfdv-dif.c: (mxf_dv_dif_handle_essence_element):
+ * gst/mxf/mxfjpeg2000.c: (mxf_jpeg2000_handle_essence_element):
+ * gst/mxf/mxfmetadata.c: (mxf_metadata_sequence_init),
+ (mxf_metadata_structural_component_init),
+ (mxf_metadata_generic_picture_essence_descriptor_init):
+ * gst/mxf/mxfmpeg.c: (mxf_mpeg_video_handle_essence_element),
+ (mxf_mpeg_audio_handle_essence_element):
+ * gst/mxf/mxfparse.h:
+ * gst/mxf/mxfup.c: (mxf_up_handle_essence_element):
+ * gst/mxf/mxfvc3.c: (mxf_vc3_handle_essence_element):
+ * tests/check/elements/mxfdemux.c: (_sink_chain):
+ Implement support for OP2a/b/c and OP3a/b/c, i.e. tracks with
+ more than a single component. This currently only works for
+ the case where the components are stored in playback order
+ in the file.
+ Set some more default/distinguished values for the structural
+ metadata.
+ Make some types more strict by choosing the correct subclasses.
+ Set DISCONT flag on buffers after a component switch.
+ Take the last partition from the random index pack for the footer
+ partition of the header partition doesn't reference the footer
+ partition. This gives us the final structural metadata for
+ some more files in the beginning.
2008-12-29 Wim Taymans <[email protected]>
* gst/mpegdemux/gstmpegdemux.c: (gst_flups_demux_src_query),
Index: mxfaes-bwf.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- mxfaes-bwf.c 19 Dec 2008 10:06:23 -0000 1.13
+++ mxfaes-bwf.c 31 Dec 2008 08:53:00 -0000 1.14
@@ -574,7 +574,7 @@
mxf_bwf_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
GstCaps * caps,
MXFMetadataTimelineTrack * track,
- MXFMetadataStructuralComponent * component, gpointer mapping_data,
+ MXFMetadataSourceClip * component, gpointer mapping_data,
GstBuffer ** outbuf)
{
*outbuf = buffer;
@@ -593,7 +593,7 @@
static GstFlowReturn
mxf_aes3_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
GstCaps * caps, MXFMetadataTimelineTrack * track,
@@ -812,24 +812,24 @@
if (!track->parent.descriptor[i])
continue;
- if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->
- parent.descriptor[i])
+ if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->parent.
+ descriptor[i])
&& (track->parent.descriptor[i]->essence_container.u[14] == 0x01
|| track->parent.descriptor[i]->essence_container.u[14] == 0x02
|| track->parent.descriptor[i]->essence_container.u[14] == 0x08)) {
- s = (MXFMetadataGenericSoundEssenceDescriptor *) track->
- parent.descriptor[i];
+ s = (MXFMetadataGenericSoundEssenceDescriptor *) track->parent.
+ descriptor[i];
bwf = TRUE;
break;
} else
- if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->
+ if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->parent.
&& (track->parent.descriptor[i]->essence_container.u[14] == 0x03
|| track->parent.descriptor[i]->essence_container.u[14] == 0x04
|| track->parent.descriptor[i]->essence_container.u[14] == 0x09)) {
bwf = FALSE;
}
Index: mxfalaw.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfalaw.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- mxfalaw.c 19 Dec 2008 10:06:23 -0000 1.7
+++ mxfalaw.c 31 Dec 2008 08:53:00 -0000 1.8
@@ -65,7 +65,7 @@
mxf_alaw_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
@@ -100,10 +100,10 @@
- parent.descriptor[i])) {
+ descriptor[i])) {
}
Index: mxfd10.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfd10.c,v
--- mxfd10.c 22 Dec 2008 10:14:34 -0000 1.7
+++ mxfd10.c 31 Dec 2008 08:53:01 -0000 1.8
@@ -71,7 +71,7 @@
mxf_d10_picture_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
@@ -89,7 +89,7 @@
mxf_d10_sound_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
guint i, j, nsamples;
@@ -173,15 +173,15 @@
- if (MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (track->
- p = (MXFMetadataGenericPictureEssenceDescriptor *) track->parent.
- descriptor[i];
+ if (MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (track->parent.
+ p = (MXFMetadataGenericPictureEssenceDescriptor *) track->
+ parent.descriptor[i];
- } else if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->
- s = (MXFMetadataGenericSoundEssenceDescriptor *) track->parent.
+ } else if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->parent.
+ s = (MXFMetadataGenericSoundEssenceDescriptor *) track->
Index: mxfdemux.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -d -r1.42 -r1.43
--- mxfdemux.c 19 Dec 2008 10:06:23 -0000 1.42
+++ mxfdemux.c 31 Dec 2008 08:53:01 -0000 1.43
@@ -35,10 +35,10 @@
* - Differentiate UL and UUIDs, the former can define an object system
* (i.e. mxf_ul_is_a() and friends could be implemented), see SMPTE S336M.
* The latter are just 16 byte unique identifiers
+ * - Differentiate between "Generation UID" and "This Generation UID" and move
+ * them from MXFMetadataBase to MXFMetadata*.
* - Check everything for correctness vs. SMPTE S336M, some things can probably
* be generalized/simplified
- * - Correctly timestamp essence streams and start/stop at the correct positions.
- * Also switch between different structural components after one has ended.
* - Seeking support: IndexTableSegments and skip-to-position seeks, needs correct
* timestamp calculation, etc.
* - Handle timecode tracks correctly (where is this documented?)
@@ -98,19 +98,23 @@
guint32 track_id;
gboolean need_segment;
+ GstClockTime last_stop;
GstFlowReturn last_flow;
+ gboolean eos, discont;
- guint64 essence_element_count;
gpointer mapping_data;
const MXFEssenceElementHandler *handler;
MXFEssenceElementHandleFunc handle_func;
GstTagList *tags;
- guint current_material_component;
MXFMetadataGenericPackage *material_package;
MXFMetadataTimelineTrack *material_track;
- MXFMetadataStructuralComponent *component;
+ MXFMetadataSourceClip *component;
+ guint current_component;
+ gint64 current_component_position;
+ gint64 current_component_drop;
MXFMetadataSourcePackage *source_package;
MXFMetadataTimelineTrack *source_track;
@@ -156,6 +160,7 @@
gst_mxf_demux_pad_init (GstMXFDemuxPad * pad)
pad->last_flow = GST_FLOW_OK;
+ pad->last_stop = 0;
}
enum
@@ -583,6 +588,7 @@
MXFMetadataGenericPackage *current_package = NULL;
guint i, j, k;
gboolean first_run;
+ guint component_index;
GST_DEBUG_OBJECT (demux, "Updating streams");
@@ -605,7 +611,7 @@
for (i = 0; i < current_package->n_tracks; i++) {
MXFMetadataTimelineTrack *track = NULL;
MXFMetadataSequence *sequence;
- MXFMetadataStructuralComponent *component = NULL;
+ MXFMetadataSourceClip *component = NULL;
MXFMetadataSourcePackage *source_package = NULL;
MXFMetadataTimelineTrack *source_track = NULL;
GstMXFDemuxPad *pad = NULL;
@@ -625,6 +631,23 @@
track = MXF_METADATA_TIMELINE_TRACK (current_package->tracks[i]);
+ if (demux->src && demux->src->len > 0) {
+ /* Find pad from track_id */
+ for (j = 0; j < demux->src->len; j++) {
+ GstMXFDemuxPad *tmp = g_ptr_array_index (demux->src, j);
+ if (tmp->track_id == track->parent.track_id) {
+ pad = tmp;
+ break;
+ }
+ }
+ }
+ if (pad)
+ component_index = pad->current_component;
+ else
+ component_index = 0;
if (!track->parent.sequence) {
GST_WARNING_OBJECT (demux, "Track with no sequence");
@@ -633,31 +656,34 @@
sequence = track->parent.sequence;
if (MXF_IS_METADATA_SOURCE_PACKAGE (current_package)) {
+ GST_DEBUG_OBJECT (demux, "Playing source package");
+ component = NULL;
source_package = MXF_METADATA_SOURCE_PACKAGE (current_package);
source_track = track;
- }
-
- /* TODO: handle multiple components, see SMPTE 377M page 37 */
- if (sequence->structural_components && sequence->structural_components[0]) {
- component = sequence->structural_components[0];
+ } else if (sequence->structural_components
+ &&
+ MXF_IS_METADATA_SOURCE_CLIP (sequence->structural_components
+ [component_index])) {
+ GST_DEBUG_OBJECT (demux, "Playing material package");
- if (!source_package && MXF_IS_METADATA_SOURCE_CLIP (component)) {
- MXFMetadataSourceClip *clip = MXF_METADATA_SOURCE_CLIP (component);
+ component =
+ MXF_METADATA_SOURCE_CLIP (sequence->structural_components
+ [component_index]);
- if (clip->source_package && clip->source_package->top_level &&
- MXF_METADATA_GENERIC_PACKAGE (clip->source_package)->tracks) {
- MXFMetadataGenericPackage *tmp_pkg =
- MXF_METADATA_GENERIC_PACKAGE (clip->source_package);
+ if (component->source_package && component->source_package->top_level &&
+ MXF_METADATA_GENERIC_PACKAGE (component->source_package)->tracks) {
+ MXFMetadataGenericPackage *tmp_pkg =
+ MXF_METADATA_GENERIC_PACKAGE (component->source_package);
- source_package = clip->source_package;
+ source_package = component->source_package;
- for (k = 0; k < tmp_pkg->n_tracks; k++) {
- MXFMetadataTrack *tmp = tmp_pkg->tracks[k];
+ for (k = 0; k < tmp_pkg->n_tracks; k++) {
+ MXFMetadataTrack *tmp = tmp_pkg->tracks[k];
- if (tmp->track_id == clip->source_track_id) {
- source_track = MXF_METADATA_TIMELINE_TRACK (tmp);
- break;
- }
+ if (tmp->track_id == component->source_track_id) {
+ source_track = MXF_METADATA_TIMELINE_TRACK (tmp);
+ break;
}
}
}
@@ -669,12 +695,18 @@
if (!source_package || track->parent.type == MXF_METADATA_TRACK_UNKNOWN
- || !source_track || !component) {
+ || !source_track) {
GST_WARNING_OBJECT (demux,
"No source package or track type for track found");
+ if (MXF_IS_METADATA_MATERIAL_PACKAGE (current_package) && !component) {
+ GST_WARNING_OBJECT (demux,
+ "Playing material package but found no component for track");
+ continue;
if (!source_package->descriptors) {
GST_WARNING_OBJECT (demux, "Source package has no descriptors");
@@ -685,18 +717,6 @@
- if (demux->src && demux->src->len > 0) {
- /* Find pad from track_id */
- for (j = 0; j < demux->src->len; j++) {
- GstMXFDemuxPad *tmp = g_ptr_array_index (demux->src, j);
- if (tmp->track_id == track->parent.track_id) {
- pad = tmp;
- break;
- }
- }
if (!pad && first_run) {
GstPadTemplate *templ;
gchar *pad_name;
@@ -712,6 +732,7 @@
pad = (GstMXFDemuxPad *) g_object_new (GST_TYPE_MXF_DEMUX_PAD,
"name", pad_name, "direction", GST_PAD_SRC, "template", templ, NULL);
pad->need_segment = TRUE;
+ pad->eos = FALSE;
g_free (pad_name);
@@ -726,7 +747,25 @@
pad->material_package = current_package;
pad->material_track = track;
- pad->current_material_component = 0;
+ /* If we just added the pad initialize for the current component */
+ if (first_run && MXF_IS_METADATA_MATERIAL_PACKAGE (current_package)) {
+ pad->current_component = 0;
+ pad->current_component_position = 0;
+ pad->current_component_drop = source_track->origin;
+ if (track->edit_rate.n != source_track->edit_rate.n ||
+ track->edit_rate.n != source_track->edit_rate.n) {
+ pad->current_component_drop +=
+ gst_util_uint64_scale (component->start_position,
+ source_track->edit_rate.n * track->edit_rate.d,
+ source_track->edit_rate.d * track->edit_rate.n);
+ } else {
+ pad->current_component_drop += component->start_position;
+ /* NULL iff playing a source package */
pad->component = component;
pad->source_package = source_package;
@@ -780,6 +819,7 @@
if (!demux->src)
demux->src = g_ptr_array_new ();
g_ptr_array_add (demux->src, pad);
+ pad->discont = TRUE;
gst_caps_unref (caps);
@@ -913,6 +953,113 @@
+gst_mxf_demux_pad_next_component (GstMXFDemux * demux, GstMXFDemuxPad * pad)
+{
+ MXFMetadataSequence *sequence;
+ guint k;
+ GstCaps *caps = NULL;
+ pad->current_component++;
+ sequence = pad->material_track->parent.sequence;
+ if (pad->current_component >= sequence->n_structural_components) {
+ GST_DEBUG_OBJECT (demux, "After last structural component");
+ return GST_FLOW_UNEXPECTED;
+ }
+ pad->component =
+ MXF_METADATA_SOURCE_CLIP (sequence->
+ structural_components[pad->current_component]);
+ if (pad->component == NULL) {
+ GST_ERROR_OBJECT (demux, "No such structural component");
+ return GST_FLOW_ERROR;
+ if (!pad->component->source_package
+ || !pad->component->source_package->top_level
+ || !MXF_METADATA_GENERIC_PACKAGE (pad->component->source_package)->
+ tracks) {
+ GST_ERROR_OBJECT (demux, "Invalid component");
+ pad->source_package = pad->component->source_package;
+ pad->source_track = NULL;
+ for (k = 0; k < pad->source_package->parent.n_tracks; k++) {
+ MXFMetadataTrack *tmp = pad->source_package->parent.tracks[k];
+ if (tmp->track_id == pad->component->source_track_id) {
+ pad->source_track = MXF_METADATA_TIMELINE_TRACK (tmp);
+ break;
+ if (!pad->source_track) {
+ GST_ERROR_OBJECT (demux, "No source track found");
+ if (!pad->source_package->descriptors) {
+ GST_ERROR_OBJECT (demux, "Source package has no descriptors");
+ if (!pad->source_track->parent.descriptor) {
+ GST_ERROR_OBJECT (demux, "No descriptor found for track");
+ pad->current_component_position = 0;
+ pad->current_component_drop = pad->source_track->origin;
+ if (pad->material_track->edit_rate.n != pad->source_track->edit_rate.n ||
+ pad->material_track->edit_rate.n != pad->source_track->edit_rate.n) {
+ pad->current_component_drop +=
+ gst_util_uint64_scale (pad->component->start_position,
+ pad->source_track->edit_rate.n * pad->material_track->edit_rate.d,
+ pad->source_track->edit_rate.d * pad->material_track->edit_rate.n);
+ } else {
+ pad->current_component_drop += pad->component->start_position;
+ pad->handler = NULL;
+ g_free (pad->mapping_data);
+ pad->handle_func = NULL;
+ pad->mapping_data = NULL;
+ pad->handler = mxf_essence_element_handler_find (pad->source_track);
+ if (!pad->handler) {
+ GST_ERROR_OBJECT (demux, "No essence element handler for track found");
+ caps =
+ pad->handler->create_caps (pad->source_track, &pad->tags,
+ &pad->handle_func, &pad->mapping_data);
+ if (!caps) {
+ GST_ERROR_OBJECT (demux, "No caps created");
+ GST_DEBUG_OBJECT (demux, "Created caps %" GST_PTR_FORMAT, caps);
+ if (!gst_caps_is_equal (pad->caps, caps)) {
+ gst_pad_set_caps (GST_PAD_CAST (pad), caps);
+ gst_caps_replace (&pad->caps, gst_caps_ref (caps));
+ gst_caps_unref (caps);
+ return GST_FLOW_OK;
+}
+static GstFlowReturn
gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux,
const MXFUL * key, GstBuffer * buffer)
@@ -983,6 +1130,12 @@
return GST_FLOW_OK;
+ if (pad->component && pad->current_component_drop > 0) {
+ GST_DEBUG_OBJECT (demux, "Before component start, dropping");
+ pad->current_component_drop--;
+ return GST_FLOW_OK;
if (pad->need_segment) {
gst_pad_push_event (GST_PAD_CAST (pad),
gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0, -1, 0));
@@ -998,15 +1151,12 @@
/* Create subbuffer to be able to change metadata */
inbuf = gst_buffer_create_sub (buffer, 0, GST_BUFFER_SIZE (buffer));
- GST_BUFFER_TIMESTAMP (inbuf) =
- gst_util_uint64_scale (pad->essence_element_count +
- pad->material_track->origin,
- GST_SECOND * pad->material_track->edit_rate.d,
- pad->material_track->edit_rate.n);
+ //FIXME broken!
+ GST_BUFFER_TIMESTAMP (inbuf) = pad->last_stop;
GST_BUFFER_DURATION (inbuf) =
gst_util_uint64_scale (GST_SECOND, pad->material_track->edit_rate.d,
pad->material_track->edit_rate.n);
- GST_BUFFER_OFFSET (inbuf) = pad->essence_element_count;
+ GST_BUFFER_OFFSET (inbuf) = GST_BUFFER_OFFSET_NONE;
GST_BUFFER_OFFSET_END (inbuf) = GST_BUFFER_OFFSET_NONE;
gst_buffer_set_caps (inbuf, pad->caps);
@@ -1022,8 +1172,6 @@
ret = GST_FLOW_OK;
- pad->essence_element_count++;
if (ret != GST_FLOW_OK) {
GST_ERROR_OBJECT (demux, "Failed to handle essence element");
if (outbuf) {
@@ -1032,6 +1180,9 @@
+ if (outbuf)
+ pad->last_stop += GST_BUFFER_DURATION (outbuf);
if (outbuf) {
/* TODO: handle timestamp gaps */
GST_DEBUG_OBJECT (demux,
@@ -1040,6 +1191,12 @@
pad->material_track->parent.track_id,
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)),
GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)));
+ if (pad->discont) {
+ GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT);
+ pad->discont = FALSE;
ret = gst_pad_push (GST_PAD_CAST (pad), outbuf);
ret = gst_mxf_demux_combine_flows (demux, pad, ret);
} else {
@@ -1047,6 +1204,42 @@
pad->material_track->parent.track_id);
+ if (ret != GST_FLOW_OK)
+ return ret;
+ if (pad->component) {
+ pad->current_component_position++;
+ if (pad->component->parent.duration != -1 &&
+ pad->current_component_position >= pad->component->parent.duration) {
+ GST_DEBUG_OBJECT (demux, "Switching to next component");
+ if ((ret = gst_mxf_demux_pad_next_component (demux, pad)) != GST_FLOW_OK) {
+ if (ret == GST_FLOW_UNEXPECTED) {
+ gboolean eos = TRUE;
+ GST_DEBUG_OBJECT (demux, "EOS for track");
+ pad->eos = TRUE;
+ for (i = 0; i < demux->src->len; i++) {
+ GstMXFDemuxPad *opad = g_ptr_array_index (demux->src, i);
+ eos &= opad->eos;
+ }
+ if (eos) {
+ GST_DEBUG_OBJECT (demux, "All tracks are EOS");
+ return GST_FLOW_UNEXPECTED;
+ } else {
+ return GST_FLOW_OK;
+ } else {
+ GST_ERROR_OBJECT (demux, "Switching component failed");
+ return ret;
return ret;
@@ -1271,8 +1464,17 @@
memset (&demux->primer, 0, sizeof (MXFPrimerPack));
gst_mxf_demux_reset_metadata (demux);
- offset =
- demux->header_partition_pack_offset + demux->footer_partition_pack_offset;
+ if (demux->footer_partition_pack_offset != 0) {
+ offset =
+ demux->header_partition_pack_offset +
+ demux->footer_partition_pack_offset;
+ MXFRandomIndexPackEntry *entry =
+ &g_array_index (demux->partition_index, MXFRandomIndexPackEntry,
+ demux->partition_index->len - 1);
+ offset = entry->offset;
next_try:
mxf_partition_pack_reset (&demux->partition);
@@ -1465,7 +1667,8 @@
&& demux->random_access && demux->partition.valid
&& demux->partition.type == MXF_PARTITION_PACK_HEADER
&& (!demux->partition.closed || !demux->partition.complete)
- && demux->footer_partition_pack_offset != 0) {
+ && (demux->footer_partition_pack_offset != 0 ||
+ demux->partition_index->len > 0)) {
"Open or incomplete header partition, trying to get final metadata from the last partitions");
gst_mxf_demux_parse_footer_metadata (demux);
@@ -1809,16 +2012,16 @@
if (format != GST_FORMAT_TIME && format != GST_FORMAT_DEFAULT)
goto error;
- pos = mxfpad->essence_element_count;
- if (format == GST_FORMAT_TIME) {
+ pos = mxfpad->last_stop;
+ if (format == GST_FORMAT_DEFAULT && pos != GST_CLOCK_TIME_NONE) {
if (!mxfpad->material_track || mxfpad->material_track->edit_rate.n == 0
|| mxfpad->material_track->edit_rate.d == 0)
goto error;
pos =
- gst_util_uint64_scale (pos + mxfpad->material_track->origin,
- GST_SECOND * mxfpad->material_track->edit_rate.d,
- mxfpad->material_track->edit_rate.n);
+ gst_util_uint64_scale (pos,
+ mxfpad->material_track->edit_rate.n,
+ mxfpad->material_track->edit_rate.d * GST_SECOND);
GST_DEBUG_OBJECT (pad,
Index: mxfdv-dif.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdv-dif.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- mxfdv-dif.c 16 Dec 2008 12:30:33 -0000 1.5
+++ mxfdv-dif.c 31 Dec 2008 08:53:01 -0000 1.6
@@ -70,7 +70,7 @@
mxf_dv_dif_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
Index: mxfjpeg2000.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfjpeg2000.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- mxfjpeg2000.c 16 Dec 2008 12:30:33 -0000 1.9
+++ mxfjpeg2000.c 31 Dec 2008 08:53:01 -0000 1.10
mxf_jpeg2000_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
@@ -106,10 +106,10 @@
f = track->parent.descriptor[i];
} else if (MXF_IS_METADATA_FILE_DESCRIPTOR (track->parent.descriptor[i]) &&
Index: mxfmetadata.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfmetadata.c,v
--- mxfmetadata.c 22 Dec 2008 20:37:24 -0000 1.5
+++ mxfmetadata.c 31 Dec 2008 08:53:01 -0000 1.6
@@ -1748,7 +1748,7 @@
static void
mxf_metadata_sequence_init (MXFMetadataSequence * self)
+ self->duration = -1;
@@ -1810,7 +1810,7 @@
mxf_metadata_structural_component_init (MXFMetadataStructuralComponent * self)
@@ -2617,6 +2617,7 @@
(MXFMetadataGenericPictureEssenceDescriptor * self)
self->signal_standard = 1;
+ self->frame_layout = 255;
Index: mxfmpeg.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -d -r1.15 -r1.16
--- mxfmpeg.c 22 Dec 2008 20:56:10 -0000 1.15
+++ mxfmpeg.c 31 Dec 2008 08:53:01 -0000 1.16
@@ -256,7 +256,7 @@
mxf_mpeg_video_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
@@ -274,7 +274,7 @@
mxf_mpeg_audio_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
@@ -478,17 +478,17 @@
Index: mxfparse.h
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h,v
diff -u -d -r1.14 -r1.15
--- mxfparse.h 16 Dec 2008 12:30:34 -0000 1.14
+++ mxfparse.h 31 Dec 2008 08:53:01 -0000 1.15
@@ -27,7 +27,7 @@
#include "mxftypes.h"
#include "mxfmetadata.h"
-typedef GstFlowReturn (*MXFEssenceElementHandleFunc) (const MXFUL *key, GstBuffer *buffer, GstCaps *caps, MXFMetadataTimelineTrack *track, MXFMetadataStructuralComponent *component, gpointer mapping_data, GstBuffer **outbuf);
+typedef GstFlowReturn (*MXFEssenceElementHandleFunc) (const MXFUL *key, GstBuffer *buffer, GstCaps *caps, MXFMetadataTimelineTrack *track, MXFMetadataSourceClip *component, gpointer mapping_data, GstBuffer **outbuf);
typedef struct {
gboolean (*handles_track) (const MXFMetadataTimelineTrack *track);
Index: mxfup.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfup.c,v
diff -u -d -r1.6 -r1.7
--- mxfup.c 16 Dec 2008 12:30:34 -0000 1.6
+++ mxfup.c 31 Dec 2008 08:53:01 -0000 1.7
@@ -80,7 +80,7 @@
mxf_up_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
MXFUPMappingData *data = mapping_data;
@@ -222,19 +222,19 @@
- if (MXF_IS_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR (track->parent.
- descriptor[i])) {
- r = (MXFMetadataRGBAPictureEssenceDescriptor *) track->parent.
- break;
- } else if (MXF_IS_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR (track->
+ if (MXF_IS_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR (track->
parent.descriptor[i])) {
- c = (MXFMetadataCDCIPictureEssenceDescriptor *) track->parent.
+ r = (MXFMetadataRGBAPictureEssenceDescriptor *) track->
+ } else if (MXF_IS_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR (track->parent.
+ c = (MXFMetadataCDCIPictureEssenceDescriptor *) track->
Index: mxfvc3.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfvc3.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- mxfvc3.c 18 Dec 2008 17:49:07 -0000 1.1
+++ mxfvc3.c 31 Dec 2008 08:53:01 -0000 1.2
mxf_vc3_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
- if (MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (track->parent.
- p = (MXFMetadataGenericPictureEssenceDescriptor *) track->
+ if (MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (track->
+ parent.descriptor[i])) {
+ p = (MXFMetadataGenericPictureEssenceDescriptor *) track->parent.
RCS file: /cvs/gstreamer/gst-plugins-bad/tests/check/elements/mxfdemux.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- mxfdemux.c 16 Dec 2008 12:46:37 -0000 1.3
+++ mxfdemux.c 31 Dec 2008 08:53:02 -0000 1.4
@@ -69,7 +69,6 @@
fail_unless (GST_BUFFER_TIMESTAMP (buffer) == 0);
fail_unless (GST_BUFFER_DURATION (buffer) == 200 * GST_MSECOND);
- fail_unless (GST_BUFFER_OFFSET (buffer) == 0);
gst_buffer_unref (buffer);
gst_caps_unref (caps);
------------------------------------------------------------------------------
_______________________________________________
gstreamer-cvs-verbose mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gstreamer-cvs-verbose