Fix flushing logic to unbreak handling of flushing seeks
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Mon, 17 Sep 2012 11:46:15 +0000 (13:46 +0200)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Mon, 15 Oct 2012 14:28:41 +0000 (16:28 +0200)
sys/androidmedia/gstamcaudiodec.c
sys/androidmedia/gstamcvideodec.c

index f51fbef5e6511f8b4b5bc59f727c2f494665f455..0b49935bcd4adf5a340eaf8cc867134092135691 100644 (file)
@@ -928,10 +928,8 @@ gst_amc_audio_dec_flush (GstAudioDecoder * decoder, gboolean hard)
     return;
   }
 
-  gst_amc_audio_dec_drain (self);
   self->flushing = TRUE;
   gst_amc_codec_flush (self->codec);
-  self->flushing = FALSE;
 
   /* Wait until the srcpad loop is finished,
    * unlock GST_AUDIO_DECODER_STREAM_LOCK to prevent deadlocks
@@ -940,6 +938,7 @@ gst_amc_audio_dec_flush (GstAudioDecoder * decoder, gboolean hard)
   GST_PAD_STREAM_LOCK (GST_AUDIO_DECODER_SRC_PAD (self));
   GST_PAD_STREAM_UNLOCK (GST_AUDIO_DECODER_SRC_PAD (self));
   GST_AUDIO_DECODER_STREAM_LOCK (self);
+  self->flushing = FALSE;
 
   /* Start the srcpad loop again */
   self->last_upstream_ts = 0;
index 8f58260469a2095f78e74f37405949f1fb78ee8c..1185fce05b148a4b1dbf05cb5454bc54bcc0213a 100644 (file)
@@ -886,7 +886,7 @@ retry:
   /*} */
 
   if (idx < 0) {
-    if (self->flushing)
+    if (self->flushing || self->downstream_flow_ret == GST_FLOW_WRONG_STATE)
       goto flushing;
 
     switch (idx) {
@@ -996,7 +996,7 @@ retry:
     if ((flow_ret = gst_video_decoder_alloc_output_frame (GST_VIDEO_DECODER
                 (self), frame)) != GST_FLOW_OK) {
       GST_ERROR_OBJECT (self, "Failed to allocate buffer");
-      goto failed_allocate;
+      goto flow_error;
     }
 
     if (!gst_amc_video_dec_fill_buffer (self, idx, &buffer_info,
@@ -1124,17 +1124,6 @@ invalid_buffer:
     GST_VIDEO_DECODER_STREAM_UNLOCK (self);
     return;
   }
-
-failed_allocate:
-  {
-    GST_ELEMENT_ERROR (self, LIBRARY, SETTINGS, (NULL),
-        ("Failed to allocate output buffer"));
-    gst_pad_push_event (GST_VIDEO_DECODER_SRC_PAD (self), gst_event_new_eos ());
-    gst_pad_pause_task (GST_VIDEO_DECODER_SRC_PAD (self));
-    self->downstream_flow_ret = GST_FLOW_ERROR;
-    GST_VIDEO_DECODER_STREAM_UNLOCK (self);
-    return;
-  }
 }
 
 static gboolean
@@ -1299,10 +1288,8 @@ gst_amc_video_dec_reset (GstVideoDecoder * decoder, gboolean hard)
     return TRUE;
   }
 
-  gst_amc_video_dec_drain (self);
   self->flushing = TRUE;
   gst_amc_codec_flush (self->codec);
-  self->flushing = FALSE;
 
   /* Wait until the srcpad loop is finished,
    * unlock GST_VIDEO_DECODER_STREAM_LOCK to prevent deadlocks
@@ -1311,6 +1298,7 @@ gst_amc_video_dec_reset (GstVideoDecoder * decoder, gboolean hard)
   GST_PAD_STREAM_LOCK (GST_VIDEO_DECODER_SRC_PAD (self));
   GST_PAD_STREAM_UNLOCK (GST_VIDEO_DECODER_SRC_PAD (self));
   GST_VIDEO_DECODER_STREAM_LOCK (self);
+  self->flushing = FALSE;
 
   /* Start the srcpad loop again */
   self->last_upstream_ts = 0;