summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2012-08-07 12:12:09 +0200
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2012-08-07 13:04:30 +0200
commitc1f1b62ca26106fba30fca65b0945c31da0ffe22 (patch)
treed5a30cc82f446797abd0779cc583b6ed7731ba8e
parent0bdc806ad929aba8f559e358515fc723f2333841 (diff)
flacparse: generate empty vorbiscomment for complete streamheaders if needed
Fixes https://bugzilla.gnome.org/show_bug.cgi?id=681335 Conflicts: gst/audioparsers/gstflacparse.c
-rw-r--r--gst/audioparsers/gstflacparse.c97
1 files changed, 60 insertions, 37 deletions
diff --git a/gst/audioparsers/gstflacparse.c b/gst/audioparsers/gstflacparse.c
index 27458ce0f..c21b48b4d 100644
--- a/gst/audioparsers/gstflacparse.c
+++ b/gst/audioparsers/gstflacparse.c
@@ -184,6 +184,9 @@ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
GST_STATIC_CAPS ("audio/x-flac")
);
+static GstBuffer *gst_flac_parse_generate_vorbiscomment (GstFlacParse *
+ flacparse);
+
static void gst_flac_parse_finalize (GObject * object);
static void gst_flac_parse_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
@@ -1068,6 +1071,16 @@ gst_flac_parse_handle_headers (GstFlacParse * flacparse)
}
}
+ /* at least this one we can generate easily
+ * to provide full headers downstream */
+ if (vorbiscomment == NULL && streaminfo != NULL) {
+ GST_DEBUG_OBJECT (flacparse,
+ "missing vorbiscomment header; generating dummy");
+ vorbiscomment = gst_flac_parse_generate_vorbiscomment (flacparse);
+ flacparse->headers = g_list_insert (flacparse->headers, vorbiscomment,
+ g_list_index (flacparse->headers, streaminfo) + 1);
+ }
+
if (marker == NULL || streaminfo == NULL || vorbiscomment == NULL) {
GST_WARNING_OBJECT (flacparse,
"missing header %p %p %p, muxing into container "
@@ -1150,10 +1163,54 @@ push_headers:
return res;
}
+/* empty vorbiscomment */
+static GstBuffer *
+gst_flac_parse_generate_vorbiscomment (GstFlacParse * flacparse)
+{
+ GstTagList *taglist = gst_tag_list_new ();
+ guchar header[4];
+ guint size;
+ GstBuffer *vorbiscomment;
+ guint8 *data;
+
+ header[0] = 0x84; /* is_last = 1; type = 4; */
+
+ vorbiscomment =
+ gst_tag_list_to_vorbiscomment_buffer (taglist, header,
+ sizeof (header), NULL);
+ gst_tag_list_free (taglist);
+
+ data = GST_BUFFER_DATA (vorbiscomment);
+ size = GST_BUFFER_SIZE (vorbiscomment);
+
+ /* Get rid of framing bit */
+ if (data[size - 1] == 1) {
+ GstBuffer *sub;
+
+ sub = gst_buffer_create_sub (vorbiscomment, 0, size - 1);
+ gst_buffer_unref (vorbiscomment);
+ vorbiscomment = sub;
+
+ data = GST_BUFFER_DATA (vorbiscomment);
+ }
+
+ size = GST_BUFFER_SIZE (vorbiscomment) - 4;
+ data[1] = ((size & 0xFF0000) >> 16);
+ data[2] = ((size & 0x00FF00) >> 8);
+ data[3] = (size & 0x0000FF);
+
+ GST_BUFFER_TIMESTAMP (vorbiscomment) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_DURATION (vorbiscomment) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_OFFSET (vorbiscomment) = 0;
+ GST_BUFFER_OFFSET_END (vorbiscomment) = 0;
+
+ return vorbiscomment;
+}
+
static gboolean
gst_flac_parse_generate_headers (GstFlacParse * flacparse)
{
- GstBuffer *marker, *streaminfo, *vorbiscomment;
+ GstBuffer *marker, *streaminfo;
guint8 *data;
marker = gst_buffer_new_and_alloc (4);
@@ -1220,42 +1277,8 @@ gst_flac_parse_generate_headers (GstFlacParse * flacparse)
GST_BUFFER_OFFSET_END (streaminfo) = 0;
flacparse->headers = g_list_append (flacparse->headers, streaminfo);
- /* empty vorbiscomment */
- {
- GstTagList *taglist = gst_tag_list_new ();
- guchar header[4];
- guint size;
-
- header[0] = 0x84; /* is_last = 1; type = 4; */
-
- vorbiscomment =
- gst_tag_list_to_vorbiscomment_buffer (taglist, header,
- sizeof (header), NULL);
- gst_tag_list_free (taglist);
-
- /* Get rid of framing bit */
- if (GST_BUFFER_DATA (vorbiscomment)[GST_BUFFER_SIZE (vorbiscomment) -
- 1] == 1) {
- GstBuffer *sub;
-
- sub =
- gst_buffer_create_sub (vorbiscomment, 0,
- GST_BUFFER_SIZE (vorbiscomment) - 1);
- gst_buffer_unref (vorbiscomment);
- vorbiscomment = sub;
- }
-
- size = GST_BUFFER_SIZE (vorbiscomment) - 4;
- GST_BUFFER_DATA (vorbiscomment)[1] = ((size & 0xFF0000) >> 16);
- GST_BUFFER_DATA (vorbiscomment)[2] = ((size & 0x00FF00) >> 8);
- GST_BUFFER_DATA (vorbiscomment)[3] = (size & 0x0000FF);
-
- GST_BUFFER_TIMESTAMP (vorbiscomment) = GST_CLOCK_TIME_NONE;
- GST_BUFFER_DURATION (vorbiscomment) = GST_CLOCK_TIME_NONE;
- GST_BUFFER_OFFSET (vorbiscomment) = 0;
- GST_BUFFER_OFFSET_END (vorbiscomment) = 0;
- flacparse->headers = g_list_append (flacparse->headers, vorbiscomment);
- }
+ flacparse->headers = g_list_append (flacparse->headers,
+ gst_flac_parse_generate_vorbiscomment (flacparse));
return TRUE;
}