ext/theora/: Track initialisation state; don't try to use encoder state if we're...
authorMichael Smith <msmith@xiph.org>
Thu, 19 Apr 2007 16:58:53 +0000 (16:58 +0000)
committerMichael Smith <msmith@xiph.org>
Thu, 19 Apr 2007 16:58:53 +0000 (16:58 +0000)
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
common
ext/theora/gsttheoraenc.h
ext/theora/theoraenc.c

index e020162..d6b79b2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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:
diff --git a/common b/common
index 380281f..765d03a 160000 (submodule)
--- a/common
+++ b/common
@@ -1 +1 @@
-Subproject commit 380281f0da9caa065cfe99a458b3538cc3f5d71a
+Subproject commit 765d03a88492fb4ac81d70457f671f3a109e93de
index 009a56d..6a04da7 100644 (file)
@@ -72,6 +72,7 @@ struct _GstTheoraEnc
   theora_state state;
   theora_info info;
   theora_comment comment;
+  gboolean initialised;
 
   gboolean center;
   GstTheoraEncBorderMode border;
index 75ebe15..d80838c 100644 (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;
-
-        theora_push_packet (enc, &op, enc->next_ts, next_time - enc->next_ts);
-        enc->next_ts = next_time;
+      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;
+        }
       }
       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;