[gst-cvs] gst-plugins-ugly: [MOVED FROM BAD 07/28] ext/x264/gstx264enc.c: Try harder not to crash when we get an EOS event but haven' t set up the encoder yet (as may ha...

Jan Schmidt thaytan at kemper.freedesktop.org
Fri Jun 5 11:58:53 PDT 2009


Module: gst-plugins-ugly
Branch: master
Commit: 9527af6c16be41ce1c48e22a2428413283d26c64
URL:    http://cgit.freedesktop.org/gstreamer/gst-plugins-ugly/commit/?id=9527af6c16be41ce1c48e22a2428413283d26c64

Author: Tim-Philipp Müller <tim at centricular.net>
Date:   Wed Jun  4 11:33:21 2008 +0000

[MOVED FROM BAD 07/28] ext/x264/gstx264enc.c: Try harder not to crash when we get an EOS event but haven't set up the encoder yet (as may ha...

Original commit message from CVS:
* ext/x264/gstx264enc.c: (gst_x264_enc_header_buf),
(gst_x264_enc_sink_event), (gst_x264_enc_chain),
(gst_x264_enc_encode_frame):
Try harder not to crash when we get an EOS event but haven't set
up the encoder yet (as may happen when upstream errors out with
not-negotiated, for example). Also, always push the EOS event
downstream.

---

 ext/x264/gstx264enc.c |   29 ++++++++++++++++-------------
 1 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/ext/x264/gstx264enc.c b/ext/x264/gstx264enc.c
index 92f003b..82dfb2a 100644
--- a/ext/x264/gstx264enc.c
+++ b/ext/x264/gstx264enc.c
@@ -220,6 +220,9 @@ gst_x264_enc_header_buf (GstX264Enc * encoder)
   guint8 *buffer, *sps;
   gulong buffer_size;
 
+  if (G_UNLIKELY (encoder->x264enc == NULL))
+    return NULL;
+
   /* Create avcC header. */
 
   header_return = x264_encoder_headers (encoder->x264enc, &nal, &i_nal);
@@ -681,25 +684,23 @@ gst_x264_enc_sink_event (GstPad * pad, GstEvent * event)
 {
   gboolean ret;
   GstX264Enc *encoder;
-  GstFlowReturn flow_ret;
-  int i_nal;
 
   encoder = GST_X264_ENC (gst_pad_get_parent (pad));
 
   switch (GST_EVENT_TYPE (event)) {
-    case GST_EVENT_EOS:
-      /* send the rest NAL units */
+    case GST_EVENT_EOS:{
+      GstFlowReturn flow_ret;
+      int i_nal;
+
+      /* first send the rest NAL units */
       do {
         flow_ret = gst_x264_enc_encode_frame (encoder, NULL, &i_nal);
       } while (flow_ret == GST_FLOW_OK && i_nal > 0);
 
-      /* send EOS */
-      if (flow_ret == GST_FLOW_OK) {
-        ret = gst_pad_push_event (encoder->srcpad, event);
-      } else {
-        ret = FALSE;
-      }
+      /* then push the EOS downstream */
+      ret = gst_pad_push_event (encoder->srcpad, event);
       break;
+    }
     default:
       ret = gst_pad_push_event (encoder->srcpad, event);
       break;
@@ -779,10 +780,9 @@ gst_x264_enc_chain (GstPad * pad, GstBuffer * buf)
 /* ERRORS */
 not_inited:
   {
-    GST_ELEMENT_ERROR (encoder, CORE, NEGOTIATION, (NULL),
-        ("Got buffer before pads were fully negotiated"));
+    GST_WARNING_OBJECT (encoder, "Got buffer before set_caps was called");
     gst_buffer_unref (buf);
-    return GST_FLOW_ERROR;
+    return GST_FLOW_NOT_NEGOTIATED;
   }
 wrong_buffer_size:
   {
@@ -810,6 +810,9 @@ gst_x264_enc_encode_frame (GstX264Enc * encoder, x264_picture_t * pic_in,
   GstClockTime timestamp;
   GstClockTime duration;
 
+  if (G_UNLIKELY (encoder->x264enc == NULL))
+    return GST_FLOW_NOT_NEGOTIATED;
+
   encoder_return = x264_encoder_encode (encoder->x264enc,
       &nal, i_nal, pic_in, &pic_out);
 





More information about the Gstreamer-commits mailing list