Check for EOS on all pads after adjusting the essence track durations
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Fri, 30 Jan 2009 18:52:59 +0000 (19:52 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Sat, 31 Jan 2009 10:02:26 +0000 (11:02 +0100)
gst/mxf/mxfdemux.c

index 8eca074..1afab1e 100644 (file)
@@ -632,11 +632,11 @@ gst_mxf_demux_choose_package (GstMXFDemux * demux)
 
   for (i = 0; i < demux->preface->content_storage->n_packages; i++) {
     if (demux->preface->content_storage->packages[i] &&
-        MXF_IS_METADATA_MATERIAL_PACKAGE (demux->preface->
-            content_storage->packages[i])) {
+        MXF_IS_METADATA_MATERIAL_PACKAGE (demux->preface->content_storage->
+            packages[i])) {
       ret =
-          MXF_METADATA_GENERIC_PACKAGE (demux->preface->
-          content_storage->packages[i]);
+          MXF_METADATA_GENERIC_PACKAGE (demux->preface->content_storage->
+          packages[i]);
       break;
     }
   }
@@ -1280,8 +1280,8 @@ gst_mxf_demux_pad_next_component (GstMXFDemux * demux, GstMXFDemuxPad * pad)
       pad->current_component_index);
 
   pad->current_component =
-      MXF_METADATA_SOURCE_CLIP (sequence->
-      structural_components[pad->current_component_index]);
+      MXF_METADATA_SOURCE_CLIP (sequence->structural_components[pad->
+          current_component_index]);
   if (pad->current_component == NULL) {
     GST_ERROR_OBJECT (demux, "No such structural component");
     return GST_FLOW_ERROR;
@@ -1289,8 +1289,8 @@ gst_mxf_demux_pad_next_component (GstMXFDemux * demux, GstMXFDemuxPad * pad)
 
   if (!pad->current_component->source_package
       || !pad->current_component->source_package->top_level
-      || !MXF_METADATA_GENERIC_PACKAGE (pad->
-          current_component->source_package)->tracks) {
+      || !MXF_METADATA_GENERIC_PACKAGE (pad->current_component->
+          source_package)->tracks) {
     GST_ERROR_OBJECT (demux, "Invalid component");
     return GST_FLOW_ERROR;
   }
@@ -2272,6 +2272,17 @@ from_index:
       }
       /* For the searched track this is really our position */
       etrack->duration = etrack->position;
+
+      for (i = 0; i < demux->src->len; i++) {
+        GstMXFDemuxPad *p = g_ptr_array_index (demux->src, i);
+
+        if (!p->eos
+            && p->current_essence_track_position >=
+            p->current_essence_track->duration) {
+          p->eos = TRUE;
+          gst_pad_push_event (GST_PAD_CAST (p), gst_event_new_eos ());
+        }
+      }
     }
 
     if (G_UNLIKELY (ret != GST_FLOW_OK))
@@ -2334,6 +2345,18 @@ gst_mxf_demux_pull_and_handle_klv_packet (GstMXFDemux * demux)
         t->duration = t->position;
     }
 
+
+    for (i = 0; i < demux->src->len; i++) {
+      GstMXFDemuxPad *p = g_ptr_array_index (demux->src, i);
+
+      if (!p->eos
+          && p->current_essence_track_position >=
+          p->current_essence_track->duration) {
+        p->eos = TRUE;
+        gst_pad_push_event (GST_PAD_CAST (p), gst_event_new_eos ());
+      }
+    }
+
     while ((p = gst_mxf_demux_get_earliest_pad (demux))) {
       guint64 offset;
       gint64 position;