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).
This commit is contained in:
Michael Smith 2007-04-19 16:58:53 +00:00
parent 674dcc1b4e
commit 38db14cb22
4 changed files with 22 additions and 8 deletions

View file

@ -1,3 +1,11 @@
2007-04-19 Michael Smith <msmith@fluendo.com>
* 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 <ensonic@users.sf.net>
* tests/check/pipelines/.cvsignore:

2
common

@ -1 +1 @@
Subproject commit 380281f0da9caa065cfe99a458b3538cc3f5d71a
Subproject commit 765d03a88492fb4ac81d70457f671f3a109e93de

View file

@ -72,6 +72,7 @@ struct _GstTheoraEnc
theora_state state;
theora_info info;
theora_comment comment;
gboolean initialised;
gboolean center;
GstTheoraEncBorderMode border;

View file

@ -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;