rtph264depay: Drain on EOS event
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Mon, 17 Dec 2018 21:48:53 +0000 (16:48 -0500)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Tue, 18 Dec 2018 18:39:46 +0000 (13:39 -0500)
gst/rtp/gstrtph264depay.c

index a5573a2..1712bee 100644 (file)
@@ -93,6 +93,11 @@ static gboolean gst_rtp_h264_depay_setcaps (GstRTPBaseDepayload * filter,
     GstCaps * caps);
 static gboolean gst_rtp_h264_depay_handle_event (GstRTPBaseDepayload * depay,
     GstEvent * event);
+static GstBuffer *gst_rtp_h264_complete_au (GstRtpH264Depay * rtph264depay,
+    GstClockTime * out_timestamp, gboolean * out_keyframe);
+static void gst_rtp_h264_depay_push (GstRtpH264Depay * rtph264depay,
+    GstBuffer * outbuf, gboolean keyframe, GstClockTime timestamp,
+    gboolean marker);
 
 static void
 gst_rtp_h264_depay_class_init (GstRtpH264DepayClass * klass)
@@ -160,6 +165,21 @@ gst_rtp_h264_depay_reset (GstRtpH264Depay * rtph264depay, gboolean hard)
 }
 
 static void
+gst_rtp_h264_depay_drain (GstRtpH264Depay * rtph264depay)
+{
+  GstClockTime timestamp;
+  gboolean keyframe;
+  GstBuffer *outbuf;
+
+  if (!rtph264depay->picture_start)
+    return;
+
+  outbuf = gst_rtp_h264_complete_au (rtph264depay, &timestamp, &keyframe);
+  if (outbuf)
+    gst_rtp_h264_depay_push (rtph264depay, outbuf, keyframe, timestamp, FALSE);
+}
+
+static void
 gst_rtp_h264_depay_finalize (GObject * object)
 {
   GstRtpH264Depay *rtph264depay;
@@ -1286,6 +1306,9 @@ gst_rtp_h264_depay_handle_event (GstRTPBaseDepayload * depay, GstEvent * event)
     case GST_EVENT_FLUSH_STOP:
       gst_rtp_h264_depay_reset (rtph264depay, FALSE);
       break;
+    case GST_EVENT_EOS:
+      gst_rtp_h264_depay_drain (rtph264depay);
+      break;
     default:
       break;
   }