summaryrefslogtreecommitdiffstats
path: root/ext/x264/gstx264enc.c
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim@centricular.net>2008-06-04 11:33:21 +0000
committerTim-Philipp Müller <tim@centricular.net>2008-06-04 11:33:21 +0000
commit756724755434db9c9f0b840309a44d36ae285748 (patch)
tree666258b43315b2fd07c6ebccc77fc4f29d766b8e /ext/x264/gstx264enc.c
parent165253fdefab57104c146938ce870f4568a953d5 (diff)
downloadgst-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/x264/gstx264enc.c')
-rw-r--r--ext/x264/gstx264enc.c29
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);