ext/ogg/gstoggmux.c: Added property to set the maximum delay of a page.
authorWim Taymans <wim.taymans@gmail.com>
Fri, 11 Jun 2004 14:38:59 +0000 (14:38 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Fri, 11 Jun 2004 14:38:59 +0000 (14:38 +0000)
Original commit message from CVS:
* ext/ogg/gstoggmux.c: (gst_ogg_mux_class_init),
(gst_ogg_mux_init), (gst_ogg_mux_next_buffer),
(gst_ogg_mux_get_headers), (gst_ogg_mux_set_header_on_caps),
(gst_ogg_mux_send_headers), (gst_ogg_mux_loop),
(gst_ogg_mux_get_property), (gst_ogg_mux_set_property):
Added property to set the maximum delay of a page.

ChangeLog
ext/ogg/gstoggmux.c

index ba20722..8a3464c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2004-06-11  Wim Taymans  <wim@fluendo.com>
+
+       * ext/ogg/gstoggmux.c: (gst_ogg_mux_class_init),
+       (gst_ogg_mux_init), (gst_ogg_mux_next_buffer),
+       (gst_ogg_mux_get_headers), (gst_ogg_mux_set_header_on_caps),
+       (gst_ogg_mux_send_headers), (gst_ogg_mux_loop),
+       (gst_ogg_mux_get_property), (gst_ogg_mux_set_property):
+       Added property to set the maximum delay of a page.
+
 2004-06-10  Wim Taymans  <wim@fluendo.com>
 
        * ext/ogg/gstoggmux.c: (gst_ogg_mux_class_init),
index e6c891c..c3e2ab0 100644 (file)
@@ -51,7 +51,9 @@ typedef struct
   ogg_stream_state stream;
   gint64 packetno;              /* number of next packet */
   gint64 pageno;                /* number of next page */
+  guint64 duration;             /* duration of current page */
   gboolean eos;
+  gint64 offset;
 
   guint state;                  /* state of the pad */
 
@@ -89,6 +91,7 @@ struct _GstOggMux
   gboolean need_headers;
 
   guint64 max_delay;
+  guint64 max_page_delay;
 };
 
 typedef enum
@@ -116,11 +119,14 @@ enum
   LAST_SIGNAL
 };
 
+/* set to 5 seconds by default */
 #define DEFAULT_MAX_DELAY      5000000000LL
+#define DEFAULT_MAX_PAGE_DELAY 5000000000LL
 enum
 {
   ARG_0,
   ARG_MAX_DELAY,
+  ARG_MAX_PAGE_DELAY,
 };
 
 static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
@@ -208,6 +214,10 @@ gst_ogg_mux_class_init (GstOggMuxClass * klass)
       g_param_spec_uint64 ("max-delay", "Max delay",
           "Maximum delay in multiplexing streams", 0, G_MAXUINT64,
           DEFAULT_MAX_DELAY, (GParamFlags) G_PARAM_READWRITE));
+  g_object_class_install_property (gobject_class, ARG_MAX_PAGE_DELAY,
+      g_param_spec_uint64 ("max-page-delay", "Max page delay",
+          "Maximum delay for sending out a page", 0, G_MAXUINT64,
+          DEFAULT_MAX_PAGE_DELAY, (GParamFlags) G_PARAM_READWRITE));
 
   gstelement_class->change_state = gst_ogg_mux_change_state;
 
@@ -247,6 +257,7 @@ gst_ogg_mux_init (GstOggMux * ogg_mux)
   ogg_mux->pulling = NULL;
   ogg_mux->need_headers = TRUE;
   ogg_mux->max_delay = DEFAULT_MAX_DELAY;
+  ogg_mux->max_page_delay = DEFAULT_MAX_PAGE_DELAY;
 
   gst_element_set_loop_function (GST_ELEMENT (ogg_mux), gst_ogg_mux_loop);
 }
@@ -403,8 +414,18 @@ gst_ogg_mux_next_buffer (GstOggPad * pad)
           gst_event_unref (event);
           return NULL;
         case GST_EVENT_DISCONTINUOUS:
+        {
+          gint64 value = 0;
+
+          if (gst_event_discont_get_value (event, GST_FORMAT_TIME, &value)) {
+            GST_DEBUG_OBJECT (ogg_mux,
+                "got discont of %" G_GUINT64_FORMAT " on pad %s:%s",
+                value, GST_DEBUG_PAD_NAME (pad->pad));
+          }
+          pad->offset = value;
           gst_event_unref (event);
           break;
+        }
         default:
           gst_pad_event_default (pad->pad, event);
           break;
@@ -846,6 +867,7 @@ gst_ogg_mux_loop (GstElement * element)
     ogg_page page;
     GstBuffer *buf, *tmpbuf;
     GstOggPad *pad = ogg_mux->pulling;
+    gint64 duration;
 
     /* now see if we have a buffer */
     buf = pad->buffer;
@@ -860,6 +882,8 @@ gst_ogg_mux_loop (GstElement * element)
       }
     }
 
+    duration = GST_BUFFER_DURATION (buf);
+
     /* create a packet from the buffer */
     packet.packet = GST_BUFFER_DATA (buf);
     packet.bytes = GST_BUFFER_SIZE (buf);
@@ -886,6 +910,20 @@ gst_ogg_mux_loop (GstElement * element)
     /* store new readahead buffer */
     pad->buffer = tmpbuf;
 
+    if (duration != -1) {
+      pad->duration += duration;
+      /* if page duration exceeds max, flush page */
+      if (pad->duration > ogg_mux->max_page_delay) {
+        while (ogg_stream_flush (&pad->stream, &page)) {
+          gst_ogg_mux_push_page (ogg_mux, &page);
+          /* increment the page number counter */
+          pad->pageno++;
+        }
+        pad->duration = 0;
+        return;
+      }
+    }
+
     /* flush out the pages now. The packet we got could end up in
      * more than one page so we need to flush them all */
     while (ogg_stream_pageout (&pad->stream, &page) > 0) {
@@ -897,6 +935,7 @@ gst_ogg_mux_loop (GstElement * element)
       /* we're done pulling on this pad, make sure to choose a new 
        * pad for pulling in the next iteration */
       ogg_mux->pulling = NULL;
+      pad->duration = 0;
     }
   }
 }
@@ -913,6 +952,9 @@ gst_ogg_mux_get_property (GObject * object,
     case ARG_MAX_DELAY:
       g_value_set_uint64 (value, ogg_mux->max_delay);
       break;
+    case ARG_MAX_PAGE_DELAY:
+      g_value_set_uint64 (value, ogg_mux->max_page_delay);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -931,6 +973,9 @@ gst_ogg_mux_set_property (GObject * object,
     case ARG_MAX_DELAY:
       ogg_mux->max_delay = g_value_get_uint64 (value);
       break;
+    case ARG_MAX_PAGE_DELAY:
+      ogg_mux->max_page_delay = g_value_get_uint64 (value);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;