From 38db14cb22aace013f415df19fe725e2527d0283 Mon Sep 17 00:00:00 2001 From: Michael Smith Date: Thu, 19 Apr 2007 16:58:53 +0000 Subject: [PATCH] ext/theora/: Track initialisation state; don't try to use encoder state if we're not initialised (it'll segfault). Original commit message from CVS: * ext/theora/gsttheoraenc.h: * ext/theora/theoraenc.c: (theora_enc_sink_setcaps), (theora_enc_sink_event), (theora_enc_change_state): Track initialisation state; don't try to use encoder state if we're not initialised (it'll segfault). --- ChangeLog | 8 ++++++++ common | 2 +- ext/theora/gsttheoraenc.h | 1 + ext/theora/theoraenc.c | 19 ++++++++++++------- 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index e020162191..d6b79b2bdc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2007-04-19 Michael Smith + + * ext/theora/gsttheoraenc.h: + * ext/theora/theoraenc.c: (theora_enc_sink_setcaps), + (theora_enc_sink_event), (theora_enc_change_state): + Track initialisation state; don't try to use encoder state if we're + not initialised (it'll segfault). + 2007-04-18 Stefan Kost * tests/check/pipelines/.cvsignore: diff --git a/common b/common index 380281f0da..765d03a884 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 380281f0da9caa065cfe99a458b3538cc3f5d71a +Subproject commit 765d03a88492fb4ac81d70457f671f3a109e93de diff --git a/ext/theora/gsttheoraenc.h b/ext/theora/gsttheoraenc.h index 009a56d873..6a04da729c 100644 --- a/ext/theora/gsttheoraenc.h +++ b/ext/theora/gsttheoraenc.h @@ -72,6 +72,7 @@ struct _GstTheoraEnc theora_state state; theora_info info; theora_comment comment; + gboolean initialised; gboolean center; GstTheoraEncBorderMode border; diff --git a/ext/theora/theoraenc.c b/ext/theora/theoraenc.c index 75ebe15601..d80838c2d4 100644 --- a/ext/theora/theoraenc.c +++ b/ext/theora/theoraenc.c @@ -396,6 +396,7 @@ theora_enc_sink_setcaps (GstPad * pad, GstCaps * caps) enc->info.keyframe_frequency_force, enc->granule_shift); theora_enc_reset (enc); + enc->initialised = TRUE; gst_object_unref (enc); @@ -550,14 +551,17 @@ theora_enc_sink_event (GstPad * pad, GstEvent * event) switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: - /* push last packet with eos flag */ - while (theora_encode_packetout (&enc->state, 1, &op)) { - /* See comment in the chain function */ - GstClockTime next_time = theora_granule_time (&enc->state, - granulepos_add (op.granulepos, 1, enc->granule_shift)) * GST_SECOND; + if (enc->initialised) { + /* push last packet with eos flag */ + while (theora_encode_packetout (&enc->state, 1, &op)) { + /* See comment in the chain function */ + GstClockTime next_time = theora_granule_time (&enc->state, + granulepos_add (op.granulepos, 1, enc->granule_shift)) * + GST_SECOND; - theora_push_packet (enc, &op, enc->next_ts, next_time - enc->next_ts); - enc->next_ts = next_time; + theora_push_packet (enc, &op, enc->next_ts, next_time - enc->next_ts); + enc->next_ts = next_time; + } } res = gst_pad_push_event (enc->srcpad, event); break; @@ -945,6 +949,7 @@ theora_enc_change_state (GstElement * element, GstStateChange transition) theora_info_clear (&enc->info); theora_enc_clear (enc); + enc->initialised = FALSE; break; case GST_STATE_CHANGE_READY_TO_NULL: break;