summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZaheer Abbas Merali <zaheerabbas@merali.org>2010-05-21 13:38:11 +0100
committerZaheer Abbas Merali <zaheerabbas@merali.org>2010-06-01 16:43:03 +0100
commitd3daa12473c9b850fa30b0c7274d946586366d8e (patch)
tree89d44e0f44e0a44859f59260ad1fd4968421326e
parentb4e6fcd0519893e8f1a3bfa464b4472a606dfcd8 (diff)
matroskamux: store caps and set on buffers rather than using pad caps
-rw-r--r--gst/matroska/ebml-write.c16
-rw-r--r--gst/matroska/ebml-write.h2
-rw-r--r--gst/matroska/matroska-mux.c18
3 files changed, 22 insertions, 14 deletions
diff --git a/gst/matroska/ebml-write.c b/gst/matroska/ebml-write.c
index b31472d7d..6bcc3e4db 100644
--- a/gst/matroska/ebml-write.c
+++ b/gst/matroska/ebml-write.c
@@ -65,6 +65,8 @@ gst_ebml_write_init (GstEbmlWrite * ebml, GstEbmlWriteClass * klass)
ebml->streamheader = NULL;
ebml->streamheader_pos = 0;
ebml->writing_streamheader = FALSE;
+
+ ebml->caps = NULL;
}
static void
@@ -84,6 +86,10 @@ gst_ebml_write_finalize (GObject * object)
ebml->streamheader = NULL;
}
+ if (ebml->caps) {
+ gst_caps_unref (ebml->caps);
+ ebml->caps = NULL;
+ }
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
}
@@ -216,7 +222,7 @@ gst_ebml_write_flush_cache (GstEbmlWrite * ebml)
buffer = gst_byte_writer_free_and_get_buffer (ebml->cache);
ebml->cache = NULL;
GST_DEBUG ("Flushing cache of size %d", GST_BUFFER_SIZE (buffer));
-
+ gst_buffer_set_caps (buffer, ebml->caps);
if (ebml->last_write_result == GST_FLOW_OK) {
if (ebml->need_newsegment) {
GstEvent *ev;
@@ -225,6 +231,9 @@ gst_ebml_write_flush_cache (GstEbmlWrite * ebml)
if (gst_pad_push_event (ebml->srcpad, ev))
ebml->need_newsegment = FALSE;
}
+ if (ebml->writing_streamheader) {
+ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_IN_CAPS);
+ }
ebml->last_write_result = gst_pad_push (ebml->srcpad, buffer);
} else {
gst_buffer_unref (buffer);
@@ -390,7 +399,10 @@ gst_ebml_write_element_push (GstEbmlWrite * ebml, GstBuffer * buf)
ebml->need_newsegment = FALSE;
}
buf = gst_buffer_make_metadata_writable (buf);
- gst_buffer_set_caps (buf, GST_PAD_CAPS (ebml->srcpad));
+ gst_buffer_set_caps (buf, ebml->caps);
+ if (ebml->writing_streamheader) {
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS);
+ }
ebml->last_write_result = gst_pad_push (ebml->srcpad, buf);
} else {
gst_buffer_unref (buf);
diff --git a/gst/matroska/ebml-write.h b/gst/matroska/ebml-write.h
index 72ac2e193..38f0766f0 100644
--- a/gst/matroska/ebml-write.h
+++ b/gst/matroska/ebml-write.h
@@ -59,6 +59,8 @@ typedef struct _GstEbmlWrite {
gboolean writing_streamheader;
GstByteWriter *streamheader;
guint64 streamheader_pos;
+
+ GstCaps *caps;
} GstEbmlWrite;
typedef struct _GstEbmlWriteClass {
diff --git a/gst/matroska/matroska-mux.c b/gst/matroska/matroska-mux.c
index 2fc52d9a5..f0244c45e 100644
--- a/gst/matroska/matroska-mux.c
+++ b/gst/matroska/matroska-mux.c
@@ -2007,16 +2007,10 @@ gst_matroska_mux_start (GstMatroskaMux * mux)
GTimeVal time = { 0, 0 };
GstBuffer *streamheader_buffer;
- /* set initial pad caps */
- {
- GstCaps *caps;
- if (!strcmp (mux->doctype, GST_MATROSKA_DOCTYPE_WEBM)) {
- caps = gst_caps_from_string ("video/webm");
- } else {
- caps = gst_caps_from_string ("video/x-matroska");
- }
- gst_pad_set_caps (mux->srcpad, caps);
- gst_caps_unref (caps);
+ if (!strcmp (mux->doctype, GST_MATROSKA_DOCTYPE_WEBM)) {
+ ebml->caps = gst_caps_from_string ("video/webm");
+ } else {
+ ebml->caps = gst_caps_from_string ("video/x-matroska");
}
/* we start with a EBML header */
doctype = mux->doctype;
@@ -2135,8 +2129,8 @@ gst_matroska_mux_start (GstMatroskaMux * mux)
g_value_unset (&bufval);
gst_structure_set_value (s, "streamheader", &streamheader);
g_value_unset (&streamheader);
- gst_pad_set_caps (mux->srcpad, caps);
- gst_caps_unref (caps);
+ gst_caps_unref (ebml->caps);
+ ebml->caps = caps;
}
}