omxvideodec: Don't try to drain the component after EOS
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Tue, 8 Nov 2011 09:46:36 +0000 (10:46 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Tue, 8 Nov 2011 10:08:06 +0000 (11:08 +0100)
And don't send EOS twice in any case. This most likely
will cause the component to not output it again and
is not necessary anyway.

omx/gstomxvideodec.c
omx/gstomxvideodec.h

index 9e7da441f676bc4e008c094526d56f99a7f47125..487652224fa279949346ab3fe300e2f4e648a206 100644 (file)
@@ -793,6 +793,7 @@ component_error:
         gst_event_new_eos ());
     gst_pad_pause_task (GST_BASE_VIDEO_CODEC_SRC_PAD (self));
     self->downstream_flow_ret = GST_FLOW_ERROR;
+    self->started = FALSE;
     return;
   }
 
@@ -801,6 +802,7 @@ flushing:
     GST_DEBUG_OBJECT (self, "Flushing -- stopping task");
     gst_pad_pause_task (GST_BASE_VIDEO_CODEC_SRC_PAD (self));
     self->downstream_flow_ret = GST_FLOW_WRONG_STATE;
+    self->started = FALSE;
     return;
   }
 
@@ -821,6 +823,7 @@ flow_error:
           gst_event_new_eos ());
       gst_pad_pause_task (GST_BASE_VIDEO_CODEC_SRC_PAD (self));
     }
+    self->started = FALSE;
     return;
   }
 
@@ -832,6 +835,7 @@ reconfigure_error:
         gst_event_new_eos ());
     gst_pad_pause_task (GST_BASE_VIDEO_CODEC_SRC_PAD (self));
     self->downstream_flow_ret = GST_FLOW_ERROR;
+    self->started = FALSE;
     return;
   }
 
@@ -843,6 +847,7 @@ invalid_buffer:
         gst_event_new_eos ());
     gst_pad_pause_task (GST_BASE_VIDEO_CODEC_SRC_PAD (self));
     self->downstream_flow_ret = GST_FLOW_NOT_NEGOTIATED;
+    self->started = FALSE;
     return;
   }
 
@@ -853,6 +858,7 @@ caps_failed:
         gst_event_new_eos ());
     gst_pad_pause_task (GST_BASE_VIDEO_CODEC_SRC_PAD (self));
     self->downstream_flow_ret = GST_FLOW_NOT_NEGOTIATED;
+    self->started = FALSE;
     return;
   }
 }
@@ -865,6 +871,7 @@ gst_omx_video_dec_start (GstBaseVideoDecoder * decoder)
 
   self = GST_OMX_VIDEO_DEC (decoder);
 
+  self->eos = FALSE;
   self->downstream_flow_ret = GST_FLOW_OK;
   ret =
       gst_pad_start_task (GST_BASE_VIDEO_CODEC_SRC_PAD (self),
@@ -888,6 +895,8 @@ gst_omx_video_dec_stop (GstBaseVideoDecoder * decoder)
     gst_omx_component_set_state (self->component, OMX_StateIdle);
 
   self->downstream_flow_ret = GST_FLOW_WRONG_STATE;
+  self->started = FALSE;
+  self->eos = FALSE;
 
   g_mutex_lock (self->drain_lock);
   self->draining = FALSE;
@@ -1068,10 +1077,7 @@ gst_omx_video_dec_set_format (GstBaseVideoDecoder * decoder,
   }
 
   if (needs_disable && is_format_change) {
-    if (self->started) {
-      gst_omx_video_dec_drain (self);
-      self->started = FALSE;
-    }
+    gst_omx_video_dec_drain (self);
 
     /* FIXME: Workaround for 
      * https://bugzilla.gnome.org/show_bug.cgi?id=654529
@@ -1182,8 +1188,7 @@ gst_omx_video_dec_reset (GstBaseVideoDecoder * decoder)
 
   GST_DEBUG_OBJECT (self, "Resetting decoder");
 
-  if (self->started)
-    gst_omx_video_dec_drain (self);
+  gst_omx_video_dec_drain (self);
 
   /* FIXME: Workaround for 
    * https://bugzilla.gnome.org/show_bug.cgi?id=654529
@@ -1214,6 +1219,7 @@ gst_omx_video_dec_reset (GstBaseVideoDecoder * decoder)
   }
 
   /* Start the srcpad loop again */
+  self->eos = FALSE;
   self->downstream_flow_ret = GST_FLOW_OK;
   gst_pad_start_task (GST_BASE_VIDEO_CODEC_SRC_PAD (self),
       (GstTaskFunction) gst_omx_video_dec_loop, decoder);
@@ -1246,6 +1252,11 @@ gst_omx_video_dec_handle_frame (GstBaseVideoDecoder * decoder,
 
   GST_DEBUG_OBJECT (self, "Handling frame");
 
+  if (self->eos) {
+    GST_WARNING_OBJECT (self, "Got frame after EOS");
+    return GST_FLOW_UNEXPECTED;
+  }
+
   timestamp = frame->presentation_timestamp;
   duration = frame->presentation_duration;
 
@@ -1430,6 +1441,11 @@ gst_omx_video_dec_finish (GstBaseVideoDecoder * decoder)
 
   GST_DEBUG_OBJECT (self, "Sending EOS to the component");
 
+  /* Don't send EOS buffer twice, this doesn't work */
+  if (self->eos)
+    return GST_BASE_VIDEO_DECODER_FLOW_DROPPED;
+  self->eos = TRUE;
+
   /* Send an EOS buffer to the component and let the base
    * class drop the EOS event. We will send it later when
    * the EOS buffer arrives on the output port. */
@@ -1450,7 +1466,13 @@ gst_omx_video_dec_drain (GstOMXVideoDec * self)
 
   GST_DEBUG_OBJECT (self, "Draining component");
 
-  g_assert (self->started);
+  if (!self->started)
+    return GST_FLOW_OK;
+  self->started = FALSE;
+
+  /* Don't send EOS buffer twice, this doesn't work */
+  if (self->eos)
+    return GST_FLOW_OK;
 
   /* Send an EOS buffer to the component and let the base
    * class drop the EOS event. We will send it later when
@@ -1470,5 +1492,7 @@ gst_omx_video_dec_drain (GstOMXVideoDec * self)
   g_mutex_unlock (self->drain_lock);
   GST_BASE_VIDEO_CODEC_STREAM_LOCK (self);
 
+  self->started = FALSE;
+
   return GST_FLOW_OK;
 }
index 5d3fd32c154594b44318b03e7012d57575afe73f..afbd4db2cf13840c89f0d2d22f1cdea83aa5e8a9 100644 (file)
@@ -65,6 +65,9 @@ struct _GstOMXVideoDec
   /* TRUE if EOS buffers shouldn't be forwarded */
   gboolean draining;
 
+  /* TRUE if upstream is EOS */
+  gboolean eos;
+
   GstFlowReturn downstream_flow_ret;
 };