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> 2007-04-18 Stefan Kost <ensonic@users.sf.net>
* tests/check/pipelines/.cvsignore: * 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_state state;
theora_info info; theora_info info;
theora_comment comment; theora_comment comment;
gboolean initialised;
gboolean center; gboolean center;
GstTheoraEncBorderMode border; GstTheoraEncBorderMode border;

View file

@ -396,6 +396,7 @@ theora_enc_sink_setcaps (GstPad * pad, GstCaps * caps)
enc->info.keyframe_frequency_force, enc->granule_shift); enc->info.keyframe_frequency_force, enc->granule_shift);
theora_enc_reset (enc); theora_enc_reset (enc);
enc->initialised = TRUE;
gst_object_unref (enc); gst_object_unref (enc);
@ -550,14 +551,17 @@ theora_enc_sink_event (GstPad * pad, GstEvent * event)
switch (GST_EVENT_TYPE (event)) { switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_EOS: case GST_EVENT_EOS:
/* push last packet with eos flag */ if (enc->initialised) {
while (theora_encode_packetout (&enc->state, 1, &op)) { /* push last packet with eos flag */
/* See comment in the chain function */ while (theora_encode_packetout (&enc->state, 1, &op)) {
GstClockTime next_time = theora_granule_time (&enc->state, /* See comment in the chain function */
granulepos_add (op.granulepos, 1, enc->granule_shift)) * GST_SECOND; 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); theora_push_packet (enc, &op, enc->next_ts, next_time - enc->next_ts);
enc->next_ts = next_time; enc->next_ts = next_time;
}
} }
res = gst_pad_push_event (enc->srcpad, event); res = gst_pad_push_event (enc->srcpad, event);
break; break;
@ -945,6 +949,7 @@ theora_enc_change_state (GstElement * element, GstStateChange transition)
theora_info_clear (&enc->info); theora_info_clear (&enc->info);
theora_enc_clear (enc); theora_enc_clear (enc);
enc->initialised = FALSE;
break; break;
case GST_STATE_CHANGE_READY_TO_NULL: case GST_STATE_CHANGE_READY_TO_NULL:
break; break;