mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-05 06:58:56 +00:00
query and convert functions will remove debug output later when everything works
Original commit message from CVS: query and convert functions will remove debug output later when everything works
This commit is contained in:
parent
cdbc5ea65c
commit
d41ef1fedc
1 changed files with 138 additions and 1 deletions
|
@ -27,6 +27,18 @@ static void gst_wavparse_init (GstWavParse *wavparse);
|
||||||
|
|
||||||
static GstCaps* wav_type_find (GstBuffer *buf, gpointer private);
|
static GstCaps* wav_type_find (GstBuffer *buf, gpointer private);
|
||||||
|
|
||||||
|
static const GstFormat* gst_wavparse_get_formats (GstPad *pad);
|
||||||
|
static const GstPadQueryType *
|
||||||
|
gst_wavparse_get_query_types (GstPad *pad);
|
||||||
|
static gboolean gst_wavparse_pad_query (GstPad *pad,
|
||||||
|
GstPadQueryType type,
|
||||||
|
GstFormat *format,
|
||||||
|
gint64 *value);
|
||||||
|
static gboolean gst_wavparse_pad_convert (GstPad *pad,
|
||||||
|
GstFormat src_format,
|
||||||
|
gint64 src_value,
|
||||||
|
GstFormat *dest_format,
|
||||||
|
gint64 *dest_value);
|
||||||
static void gst_wavparse_chain (GstPad *pad, GstBuffer *buf);
|
static void gst_wavparse_chain (GstPad *pad, GstBuffer *buf);
|
||||||
|
|
||||||
/* elementfactory information */
|
/* elementfactory information */
|
||||||
|
@ -134,12 +146,27 @@ gst_wavparse_class_init (GstWavParseClass *klass)
|
||||||
static void
|
static void
|
||||||
gst_wavparse_init (GstWavParse *wavparse)
|
gst_wavparse_init (GstWavParse *wavparse)
|
||||||
{
|
{
|
||||||
|
/* sink */
|
||||||
wavparse->sinkpad = gst_pad_new_from_template (GST_PAD_TEMPLATE_GET (sink_template_factory), "sink");
|
wavparse->sinkpad = gst_pad_new_from_template (GST_PAD_TEMPLATE_GET (sink_template_factory), "sink");
|
||||||
gst_element_add_pad (GST_ELEMENT (wavparse), wavparse->sinkpad);
|
gst_element_add_pad (GST_ELEMENT (wavparse), wavparse->sinkpad);
|
||||||
gst_pad_set_chain_function (wavparse->sinkpad, gst_wavparse_chain);
|
|
||||||
|
|
||||||
|
gst_pad_set_formats_function (wavparse->sinkpad, gst_wavparse_get_formats);
|
||||||
|
gst_pad_set_convert_function (wavparse->sinkpad, gst_wavparse_pad_convert);
|
||||||
|
gst_pad_set_query_type_function (wavparse->sinkpad,
|
||||||
|
gst_wavparse_get_query_types);
|
||||||
|
gst_pad_set_query_function (wavparse->sinkpad, gst_wavparse_pad_query);
|
||||||
|
|
||||||
|
/* source */
|
||||||
wavparse->srcpad = gst_pad_new_from_template (GST_PAD_TEMPLATE_GET (src_template_factory), "src");
|
wavparse->srcpad = gst_pad_new_from_template (GST_PAD_TEMPLATE_GET (src_template_factory), "src");
|
||||||
gst_element_add_pad (GST_ELEMENT (wavparse), wavparse->srcpad);
|
gst_element_add_pad (GST_ELEMENT (wavparse), wavparse->srcpad);
|
||||||
|
gst_pad_set_formats_function (wavparse->srcpad, gst_wavparse_get_formats);
|
||||||
|
gst_pad_set_convert_function (wavparse->srcpad, gst_wavparse_pad_convert);
|
||||||
|
gst_pad_set_query_type_function (wavparse->srcpad,
|
||||||
|
gst_wavparse_get_query_types);
|
||||||
|
gst_pad_set_query_function (wavparse->srcpad, gst_wavparse_pad_query);
|
||||||
|
|
||||||
|
gst_pad_set_chain_function (wavparse->sinkpad, gst_wavparse_chain);
|
||||||
|
|
||||||
|
|
||||||
wavparse->riff = NULL;
|
wavparse->riff = NULL;
|
||||||
|
|
||||||
|
@ -352,6 +379,116 @@ gst_wavparse_chain (GstPad *pad, GstBuffer *buf)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* convert and query stuff */
|
||||||
|
static const GstFormat *
|
||||||
|
gst_wavparse_get_formats (GstPad *pad)
|
||||||
|
{
|
||||||
|
static GstFormat formats[] = {
|
||||||
|
GST_FORMAT_TIME,
|
||||||
|
GST_FORMAT_BYTES,
|
||||||
|
GST_FORMAT_UNITS, /* a "frame", ie a set of samples per Hz */
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
};
|
||||||
|
return formats;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_wavparse_pad_convert (GstPad *pad,
|
||||||
|
GstFormat src_format, gint64 src_value,
|
||||||
|
GstFormat *dest_format, gint64 *dest_value)
|
||||||
|
{
|
||||||
|
gint bytes_per_sample;
|
||||||
|
glong byterate;
|
||||||
|
GstWavParse *wavparse;
|
||||||
|
|
||||||
|
wavparse = GST_WAVPARSE (gst_pad_get_parent (pad));
|
||||||
|
if (*dest_format == GST_FORMAT_DEFAULT)
|
||||||
|
*dest_format = GST_FORMAT_TIME;
|
||||||
|
|
||||||
|
bytes_per_sample = wavparse->channels * wavparse->width / 8;
|
||||||
|
if (bytes_per_sample == 0) {
|
||||||
|
g_warning ("bytes_per_sample is 0, internal error\n");
|
||||||
|
g_warning ("channels %d, width %d\n",
|
||||||
|
wavparse->channels, wavparse->width);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
byterate = (glong) (bytes_per_sample * wavparse->rate);
|
||||||
|
if (byterate == 0) {
|
||||||
|
g_warning ("byterate is 0, internal error\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
g_print ("DEBUG: bytes per sample: %d\n", bytes_per_sample);
|
||||||
|
|
||||||
|
switch (src_format) {
|
||||||
|
case GST_FORMAT_BYTES:
|
||||||
|
if (*dest_format == GST_FORMAT_UNITS)
|
||||||
|
*dest_value = src_value / bytes_per_sample;
|
||||||
|
else if (*dest_format == GST_FORMAT_TIME)
|
||||||
|
*dest_value = src_value * GST_SECOND / byterate;
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
break;
|
||||||
|
case GST_FORMAT_UNITS:
|
||||||
|
if (*dest_format == GST_FORMAT_BYTES)
|
||||||
|
*dest_value = src_value * bytes_per_sample;
|
||||||
|
else if (*dest_format == GST_FORMAT_TIME)
|
||||||
|
*dest_value = src_value * GST_SECOND / wavparse->rate;
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
break;
|
||||||
|
case GST_FORMAT_TIME:
|
||||||
|
if (*dest_format == GST_FORMAT_BYTES)
|
||||||
|
*dest_value = src_value * byterate / GST_SECOND;
|
||||||
|
else if (*dest_format == GST_FORMAT_UNITS)
|
||||||
|
*dest_value = src_value * wavparse->rate /GST_SECOND;
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_warning ("unhandled format for wavparse\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const GstPadQueryType *
|
||||||
|
gst_wavparse_get_query_types (GstPad *pad)
|
||||||
|
{
|
||||||
|
static const GstPadQueryType types[] = {
|
||||||
|
GST_PAD_QUERY_TOTAL,
|
||||||
|
GST_PAD_QUERY_POSITION
|
||||||
|
};
|
||||||
|
return types;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* handle queries for location and length in requested format */
|
||||||
|
static gboolean
|
||||||
|
gst_wavparse_pad_query (GstPad *pad, GstPadQueryType type,
|
||||||
|
GstFormat *format, gint64 *value)
|
||||||
|
{
|
||||||
|
GstFormat peer_format = GST_FORMAT_BYTES;
|
||||||
|
gint64 peer_value;
|
||||||
|
GstWavParse *wavparse;
|
||||||
|
|
||||||
|
/* probe sink's peer pad, convert value, and that's it :) */
|
||||||
|
/* FIXME: ideally we'd loop over possible formats of peer instead
|
||||||
|
* of only using BYTE */
|
||||||
|
wavparse = GST_WAVPARSE (gst_pad_get_parent (pad));
|
||||||
|
if (!gst_pad_query (GST_PAD_PEER (wavparse->sinkpad), type,
|
||||||
|
&peer_format, &peer_value)) {
|
||||||
|
g_warning ("Could not query sink pad's peer\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (!gst_pad_convert (wavparse->sinkpad, peer_format, peer_value,
|
||||||
|
format, value)) {
|
||||||
|
g_warning ("Could not query sink pad's peer\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
g_print ("DEBUG: pad_query done, value %lld\n", *value);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
plugin_init (GModule *module, GstPlugin *plugin)
|
plugin_init (GModule *module, GstPlugin *plugin)
|
||||||
|
|
Loading…
Reference in a new issue