flvdemux: output speex vorbiscomment as a GstTagList

This is what speexdec expects.

https://bugzilla.gnome.org/show_bug.cgi?id=755478
This commit is contained in:
Havard Graff 2015-09-23 13:50:52 +02:00 committed by Sebastian Dröge
parent b6f133ba17
commit 240b0ac9f6
4 changed files with 163 additions and 2 deletions

View file

@ -2,7 +2,7 @@ plugin_LTLIBRARIES = libgstflv.la
libgstflv_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
libgstflv_la_LIBADD = -lgstpbutils-@GST_API_VERSION@ -lgstaudio-@GST_API_VERSION@ \
-lgstvideo-@GST_API_VERSION@ \
-lgstvideo-@GST_API_VERSION@ -lgsttag-$(GST_API_VERSION) \
$(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS)
libgstflv_la_LDFLAGS = ${GST_PLUGIN_LDFLAGS}
libgstflv_la_SOURCES = gstflvdemux.c gstflvmux.c

View file

@ -44,6 +44,7 @@
#include <gst/pbutils/pbutils.h>
#include <gst/audio/audio.h>
#include <gst/video/video.h>
#include <gst/tag/tag.h>
/* FIXME: don't rely on own GstIndex */
#include "gstindex.c"
@ -749,6 +750,7 @@ gst_flv_demux_audio_negotiate (GstFlvDemux * demux, guint32 codec_tag,
GstByteWriter w;
GstStructure *structure;
GstBuffer *buf;
GstTagList *tags;
caps = gst_caps_new_empty_simple ("audio/x-speex");
structure = gst_caps_get_structure (caps, 0);
@ -785,7 +787,10 @@ gst_flv_demux_audio_negotiate (GstFlvDemux * demux, guint32 codec_tag,
/* comment part */
g_value_init (&value, GST_TYPE_BUFFER);
buf = gst_buffer_new_wrapped (g_memdup ("No comments", 12), 12);
tags = gst_tag_list_new_empty ();
buf = gst_tag_list_to_vorbiscomment_buffer (tags, NULL,
0, "No comments");
gst_tag_list_unref (tags);
g_value_take_boxed (&value, buf);
gst_value_array_append_value (&streamheader, &value);
g_value_unset (&value);

View file

@ -424,6 +424,8 @@ elements_amrparse_LDADD = libparser.la $(LDADD)
elements_flacparse_LDADD = libparser.la $(LDADD)
elements_flvdemux_LDADD = -lgsttag-$(GST_API_VERSION) $(LDADD)
elements_mpegaudioparse_LDADD = libparser.la $(LDADD)
elements_aspectratiocrop_LDADD = $(LDADD)

View file

@ -19,8 +19,10 @@
*/
#include <gst/check/gstcheck.h>
#include <gst/check/gstharness.h>
#include <gst/gst.h>
#include <gst/tag/tag.h>
static void
pad_added_cb (GstElement * flvdemux, GstPad * pad, GstBin * pipeline)
@ -166,6 +168,156 @@ GST_START_TEST (test_reuse_push)
GST_END_TEST;
static GstBuffer *
create_buffer (guint8 * data, gsize size)
{
GstBuffer * buf = gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY,
data, size, 0, size, NULL, NULL);
GST_BUFFER_PTS (buf) = GST_CLOCK_TIME_NONE;
GST_BUFFER_DTS (buf) = GST_CLOCK_TIME_NONE;
GST_BUFFER_DURATION (buf) = GST_CLOCK_TIME_NONE;
GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE;
GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE;
return buf;
}
static void
flvdemux_pad_added (GstElement * flvdemux, GstPad * srcpad, GstHarness * h)
{
(void)flvdemux;
gst_harness_add_element_src_pad (h, srcpad);
}
GST_START_TEST (test_speex)
{
guint8 flv_header0[] = {
0x46, 0x4c, 0x56, 0x01, 0x04, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00
};
guint8 flv_header1[] = {
0x12, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x6f, 0x6e,
0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61,
0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0c, 0x61,
0x75, 0x64, 0x69, 0x6f, 0x63, 0x6f, 0x64, 0x65,
0x63, 0x69, 0x64, 0x00, 0x40, 0x26, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x6d, 0x65,
0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x63, 0x72,
0x65, 0x61, 0x74, 0x6f, 0x72, 0x02, 0x00, 0x13,
0x47, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65,
0x72, 0x20, 0x46, 0x4c, 0x56, 0x20, 0x6d, 0x75,
0x78, 0x65, 0x72, 0x00, 0x0c, 0x63, 0x72, 0x65,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74,
0x65, 0x02, 0x00, 0x18, 0x57, 0x65, 0x64, 0x20,
0x53, 0x65, 0x70, 0x20, 0x32, 0x33, 0x20, 0x31,
0x30, 0x3a, 0x34, 0x39, 0x3a, 0x35, 0x36, 0x20,
0x32, 0x30, 0x31, 0x35, 0x00, 0x00, 0x09, 0x00,
0x00, 0x00, 0x87,
};
guint8 speex_header0[] = {
0x08, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xb2, 0x53, 0x70, 0x65, 0x65,
0x78, 0x20, 0x20, 0x20, 0x31, 0x2e, 0x32, 0x72,
0x63, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
0x80, 0x3e, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff, 0x40, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c,
};
guint8 speex_header1[] = {
0x08, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xb2, 0x1f, 0x00, 0x00, 0x00,
0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x20,
0x77, 0x69, 0x74, 0x68, 0x20, 0x47, 0x53, 0x74,
0x72, 0x65, 0x61, 0x6d, 0x65, 0x72, 0x20, 0x53,
0x70, 0x65, 0x65, 0x78, 0x65, 0x6e, 0x63, 0x00,
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x34,
};
guint8 buffer[] = {
0x08, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xb2, 0x36, 0x9d, 0x1b, 0x9a,
0x20, 0x00, 0x01, 0x68, 0xe8, 0xe8, 0xe8, 0xe8,
0xe8, 0xe8, 0xe8, 0x84, 0x00, 0xb4, 0x74, 0x74,
0x74, 0x74, 0x74, 0x74, 0x74, 0x42, 0x00, 0x5a,
0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x21,
0x00, 0x2d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d,
0x1d, 0x1b, 0x3b, 0x60, 0xab, 0xab, 0xab, 0xab,
0xab, 0x0a, 0xba, 0xba, 0xba, 0xba, 0xb0, 0xab,
0xab, 0xab, 0xab, 0xab, 0x0a, 0xba, 0xba, 0xba,
0xba, 0xb7, 0x00, 0x00, 0x00, 0x52,
};
GstHarness * h = gst_harness_new_with_padnames ("flvdemux", "sink", NULL);
gst_harness_set_src_caps_str (h, "video/x-flv");
g_signal_connect (h->element, "pad-added",
G_CALLBACK (flvdemux_pad_added), h);
gst_harness_push (h, create_buffer (flv_header0, sizeof (flv_header0)));
gst_harness_push (h, create_buffer (flv_header1, sizeof (flv_header1)));
gst_harness_push (h, create_buffer (speex_header0, sizeof (speex_header0)));
gst_harness_push (h, create_buffer (speex_header1, sizeof (speex_header1)));
gst_harness_push (h, create_buffer (buffer, sizeof (buffer)));
{
GstCaps * caps;
const GstStructure * s;
const GValue *streamheader;
const GValue *header;
const GValue *vorbiscomment;
GstBuffer *buf;
GstTagList *list;
gint rate;
gint channels;
caps = gst_pad_get_current_caps (h->sinkpad);
s = gst_caps_get_structure (caps, 0);
fail_unless (gst_structure_has_name (s, "audio/x-speex"));
streamheader = gst_structure_get_value (s, "streamheader");
fail_unless (streamheader != NULL);
fail_unless (G_VALUE_HOLDS (streamheader, GST_TYPE_ARRAY));
fail_unless_equals_int (2, gst_value_array_get_size (streamheader));
header = gst_value_array_get_value (streamheader, 0);
fail_unless (header != NULL);
fail_unless (G_VALUE_HOLDS (header, GST_TYPE_BUFFER));
buf = gst_value_get_buffer (header);
vorbiscomment = gst_value_array_get_value (streamheader, 1);
fail_unless (header != NULL);
fail_unless (G_VALUE_HOLDS (header, GST_TYPE_BUFFER));
buf = gst_value_get_buffer (vorbiscomment);
list = gst_tag_list_from_vorbiscomment_buffer (buf, NULL, 0, NULL);
fail_unless (list != NULL);
gst_tag_list_unref (list);
gst_structure_get_int (s, "rate", &rate);
fail_unless_equals_int (16000, rate);
gst_structure_get_int (s, "channels", &channels);
fail_unless_equals_int (1, channels);
gst_caps_unref (caps);
}
/* we should have gotten 2x speex-headers, and one encoded buffer */
fail_unless_equals_int (3, gst_harness_buffers_in_queue (h));
gst_harness_teardown (h);
}
GST_END_TEST;
static Suite *
flvdemux_suite (void)
{
@ -176,6 +328,8 @@ flvdemux_suite (void)
tcase_add_test (tc_chain, test_reuse_push);
tcase_add_test (tc_chain, test_reuse_pull);
tcase_add_test (tc_chain, test_speex);
return s;
}