diff options
author | Tim-Philipp Müller <tim@centricular.net> | 2008-06-04 11:33:21 +0000 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.net> | 2008-06-04 11:33:21 +0000 |
commit | 756724755434db9c9f0b840309a44d36ae285748 (patch) | |
tree | 666258b43315b2fd07c6ebccc77fc4f29d766b8e /ext | |
parent | 165253fdefab57104c146938ce870f4568a953d5 (diff) | |
download | gst-plugins-bad-756724755434db9c9f0b840309a44d36ae285748.tar.gz gst-plugins-bad-756724755434db9c9f0b840309a44d36ae285748.tar.bz2 gst-plugins-bad-756724755434db9c9f0b840309a44d36ae285748.zip |
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.
Diffstat (limited to 'ext')
-rw-r--r-- | 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 92f003b3..82dfb2a2 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); |