2007-01-07 22:03:54 +00:00
|
|
|
/* GStreamer
|
|
|
|
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
|
|
|
|
* 2000 Wim Taymans <wtay@chello.be>
|
|
|
|
* 2005 Wim Taymans <wim@fluendo.com>
|
|
|
|
* 2007 Andy Wingo <wingo at pobox.com>
|
gst/interleave/: Split definitions into separate header files for better documentation generation.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.h:
* gst/interleave/interleave.h:
* gst/interleave/plugin.h:
Split definitions into separate header files for better documentation
generation.
* gst/interleave/deinterleave.c: (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_sink_setcaps),
(gst_deinterleave_process):
Don't use alloca, allow caps changes as long as the number of channels
does not change, don't use g_warning, return NOT_NEGOTIATED as early
as possible and some other cleanup.
* gst/interleave/interleave.c: (gst_interleave_base_init),
(gst_interleave_class_init):
Do some random cleanup.
* tests/check/Makefile.am:
* tests/check/elements/deinterleave.c: (GST_START_TEST),
(deinterleave_chain_func), (deinterleave_pad_added),
(deinterleave_suite):
Add unit tests for the deinterleave element.
2008-05-14 07:32:44 +00:00
|
|
|
* 2008 Sebastian Dröge <slomo@circular-chaos.org>
|
2007-01-07 22:03:54 +00:00
|
|
|
*
|
2008-05-22 18:55:09 +00:00
|
|
|
* deinterleave.c: deinterleave samples
|
2007-01-07 22:03:54 +00:00
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Library General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Library General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Library General Public
|
|
|
|
* License along with this library; if not, write to the
|
2012-11-04 00:07:18 +00:00
|
|
|
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
|
|
|
* Boston, MA 02110-1301, USA.
|
2007-01-07 22:03:54 +00:00
|
|
|
*/
|
|
|
|
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
/* TODO:
|
|
|
|
* - handle changes in number of channels
|
|
|
|
* - handle changes in channel positions
|
|
|
|
* - better capsnego by using a buffer alloc function
|
|
|
|
* and passing downstream caps changes upstream there
|
|
|
|
*/
|
|
|
|
|
2008-05-17 19:39:53 +00:00
|
|
|
/**
|
|
|
|
* SECTION:element-deinterleave
|
2018-10-22 09:39:24 +00:00
|
|
|
* @title: deinterleave
|
2008-06-13 11:59:23 +00:00
|
|
|
* @see_also: interleave
|
2008-05-17 19:39:53 +00:00
|
|
|
*
|
|
|
|
* Splits one interleaved multichannel audio stream into many mono audio streams.
|
2018-10-22 09:39:24 +00:00
|
|
|
*
|
2008-05-22 18:55:09 +00:00
|
|
|
* This element handles all raw audio formats and supports changing the input caps as long as
|
|
|
|
* all downstream elements can handle the new caps and the number of channels and the channel
|
|
|
|
* positions stay the same. This restriction will be removed in later versions by adding or
|
|
|
|
* removing some source pads as required.
|
2018-10-22 09:39:24 +00:00
|
|
|
*
|
2008-05-22 19:47:53 +00:00
|
|
|
* In most cases a queue and an audioconvert element should be added after each source pad
|
|
|
|
* before further processing of the audio data.
|
2018-10-22 09:39:24 +00:00
|
|
|
*
|
|
|
|
* ## Example launch line
|
2008-06-13 11:59:23 +00:00
|
|
|
* |[
|
2012-08-26 21:39:55 +00:00
|
|
|
* gst-launch-1.0 filesrc location=/path/to/file.mp3 ! decodebin ! audioconvert ! "audio/x-raw,channels=2 ! deinterleave name=d d.src_0 ! queue ! audioconvert ! vorbisenc ! oggmux ! filesink location=channel1.ogg d.src_1 ! queue ! audioconvert ! vorbisenc ! oggmux ! filesink location=channel2.ogg
|
2008-06-13 11:59:23 +00:00
|
|
|
* ]| Decodes an MP3 file and encodes the left and right channel into separate
|
|
|
|
* Ogg Vorbis files.
|
|
|
|
* |[
|
2012-08-26 21:39:55 +00:00
|
|
|
* gst-launch-1.0 filesrc location=file.mp3 ! decodebin ! audioconvert ! "audio/x-raw,channels=2" ! deinterleave name=d interleave name=i ! audioconvert ! wavenc ! filesink location=test.wav d.src_0 ! queue ! audioconvert ! i.sink_1 d.src_1 ! queue ! audioconvert ! i.sink_0
|
2008-06-13 11:59:23 +00:00
|
|
|
* ]| Decodes and deinterleaves a Stereo MP3 file into separate channels and
|
|
|
|
* then interleaves the channels again to a WAV file with the channel with the
|
|
|
|
* channels exchanged.
|
2018-10-22 09:39:24 +00:00
|
|
|
*
|
2008-05-17 19:39:53 +00:00
|
|
|
*/
|
|
|
|
|
2007-01-07 22:03:54 +00:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "config.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <gst/gst.h>
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
#include <string.h>
|
2021-02-16 08:57:27 +00:00
|
|
|
#include "gstinterleaveelements.h"
|
gst/interleave/: Split definitions into separate header files for better documentation generation.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.h:
* gst/interleave/interleave.h:
* gst/interleave/plugin.h:
Split definitions into separate header files for better documentation
generation.
* gst/interleave/deinterleave.c: (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_sink_setcaps),
(gst_deinterleave_process):
Don't use alloca, allow caps changes as long as the number of channels
does not change, don't use g_warning, return NOT_NEGOTIATED as early
as possible and some other cleanup.
* gst/interleave/interleave.c: (gst_interleave_base_init),
(gst_interleave_class_init):
Do some random cleanup.
* tests/check/Makefile.am:
* tests/check/elements/deinterleave.c: (GST_START_TEST),
(deinterleave_chain_func), (deinterleave_pad_added),
(deinterleave_suite):
Add unit tests for the deinterleave element.
2008-05-14 07:32:44 +00:00
|
|
|
#include "deinterleave.h"
|
2007-01-07 22:03:54 +00:00
|
|
|
|
|
|
|
GST_DEBUG_CATEGORY_STATIC (gst_deinterleave_debug);
|
|
|
|
#define GST_CAT_DEFAULT gst_deinterleave_debug
|
|
|
|
|
2011-11-04 12:12:37 +00:00
|
|
|
static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src_%u",
|
2007-01-07 22:03:54 +00:00
|
|
|
GST_PAD_SRC,
|
|
|
|
GST_PAD_SOMETIMES,
|
2012-01-30 15:40:19 +00:00
|
|
|
GST_STATIC_CAPS ("audio/x-raw, "
|
|
|
|
"format = (string) " GST_AUDIO_FORMATS_ALL ", "
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
"rate = (int) [ 1, MAX ], "
|
2012-01-30 15:40:19 +00:00
|
|
|
"channels = (int) 1, layout = (string) {non-interleaved, interleaved}"));
|
2008-06-05 11:07:17 +00:00
|
|
|
|
2007-01-07 22:03:54 +00:00
|
|
|
static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
|
|
|
|
GST_PAD_SINK,
|
|
|
|
GST_PAD_ALWAYS,
|
2012-01-30 15:40:19 +00:00
|
|
|
GST_STATIC_CAPS ("audio/x-raw, "
|
|
|
|
"format = (string) " GST_AUDIO_FORMATS_ALL ", "
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
"rate = (int) [ 1, MAX ], "
|
2012-01-30 15:40:19 +00:00
|
|
|
"channels = (int) [ 1, MAX ], layout = (string) interleaved"));
|
2007-01-07 22:03:54 +00:00
|
|
|
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
#define MAKE_FUNC(type) \
|
|
|
|
static void deinterleave_##type (guint##type *out, guint##type *in, \
|
|
|
|
guint stride, guint nframes) \
|
|
|
|
{ \
|
|
|
|
gint i; \
|
|
|
|
\
|
|
|
|
for (i = 0; i < nframes; i++) { \
|
|
|
|
out[i] = *in; \
|
|
|
|
in += stride; \
|
|
|
|
} \
|
|
|
|
}
|
|
|
|
|
|
|
|
MAKE_FUNC (8);
|
|
|
|
MAKE_FUNC (16);
|
|
|
|
MAKE_FUNC (32);
|
|
|
|
MAKE_FUNC (64);
|
|
|
|
|
|
|
|
static void
|
|
|
|
deinterleave_24 (guint8 * out, guint8 * in, guint stride, guint nframes)
|
|
|
|
{
|
|
|
|
gint i;
|
|
|
|
|
|
|
|
for (i = 0; i < nframes; i++) {
|
|
|
|
memcpy (out, in, 3);
|
|
|
|
out += 3;
|
|
|
|
in += stride * 3;
|
|
|
|
}
|
|
|
|
}
|
2007-01-07 22:03:54 +00:00
|
|
|
|
2012-01-30 15:40:19 +00:00
|
|
|
#define gst_deinterleave_parent_class parent_class
|
|
|
|
G_DEFINE_TYPE (GstDeinterleave, gst_deinterleave, GST_TYPE_ELEMENT);
|
2021-02-16 08:57:27 +00:00
|
|
|
GST_ELEMENT_REGISTER_DEFINE (deinterleave, "deinterleave",
|
|
|
|
GST_RANK_NONE, gst_deinterleave_get_type ());
|
2007-01-07 22:03:54 +00:00
|
|
|
|
2008-05-19 07:46:05 +00:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
PROP_0,
|
|
|
|
PROP_KEEP_POSITIONS
|
|
|
|
};
|
|
|
|
|
2012-01-30 15:40:19 +00:00
|
|
|
static GstFlowReturn gst_deinterleave_chain (GstPad * pad, GstObject * parent,
|
|
|
|
GstBuffer * buffer);
|
2008-06-05 11:07:17 +00:00
|
|
|
|
2012-01-30 15:40:19 +00:00
|
|
|
static gboolean gst_deinterleave_sink_setcaps (GstDeinterleave * self,
|
|
|
|
GstCaps * caps);
|
2008-06-05 11:07:17 +00:00
|
|
|
|
2012-01-30 15:40:19 +00:00
|
|
|
static GstStateChangeReturn
|
|
|
|
gst_deinterleave_change_state (GstElement * element, GstStateChange transition);
|
2008-06-05 11:07:17 +00:00
|
|
|
|
2012-01-30 15:40:19 +00:00
|
|
|
static gboolean gst_deinterleave_sink_event (GstPad * pad, GstObject * parent,
|
|
|
|
GstEvent * event);
|
2015-09-30 13:00:31 +00:00
|
|
|
static gboolean gst_deinterleave_sink_query (GstPad * pad, GstObject * parent,
|
|
|
|
GstQuery * query);
|
2008-06-05 11:07:17 +00:00
|
|
|
|
2012-01-30 15:40:19 +00:00
|
|
|
static gboolean gst_deinterleave_src_query (GstPad * pad, GstObject * parent,
|
|
|
|
GstQuery * query);
|
2008-06-05 11:07:17 +00:00
|
|
|
|
2008-05-19 07:46:05 +00:00
|
|
|
static void gst_deinterleave_set_property (GObject * object,
|
|
|
|
guint prop_id, const GValue * value, GParamSpec * pspec);
|
|
|
|
static void gst_deinterleave_get_property (GObject * object,
|
|
|
|
guint prop_id, GValue * value, GParamSpec * pspec);
|
|
|
|
|
2007-01-07 22:03:54 +00:00
|
|
|
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
static void
|
|
|
|
gst_deinterleave_finalize (GObject * obj)
|
|
|
|
{
|
|
|
|
GstDeinterleave *self = GST_DEINTERLEAVE (obj);
|
|
|
|
|
2008-05-17 19:39:53 +00:00
|
|
|
if (self->pending_events) {
|
|
|
|
g_list_foreach (self->pending_events, (GFunc) gst_mini_object_unref, NULL);
|
|
|
|
g_list_free (self->pending_events);
|
|
|
|
self->pending_events = NULL;
|
|
|
|
}
|
|
|
|
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
G_OBJECT_CLASS (parent_class)->finalize (obj);
|
|
|
|
}
|
|
|
|
|
2007-01-07 22:03:54 +00:00
|
|
|
static void
|
2012-01-30 15:40:19 +00:00
|
|
|
gst_deinterleave_class_init (GstDeinterleaveClass * klass)
|
2007-01-07 22:03:54 +00:00
|
|
|
{
|
2012-01-30 15:40:19 +00:00
|
|
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
|
|
|
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
|
|
|
|
|
|
|
|
GST_DEBUG_CATEGORY_INIT (gst_deinterleave_debug, "deinterleave", 0,
|
|
|
|
"deinterleave element");
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
|
2012-04-09 23:51:41 +00:00
|
|
|
gst_element_class_set_static_metadata (gstelement_class,
|
|
|
|
"Audio deinterleaver", "Filter/Converter/Audio",
|
gst/interleave/: Split definitions into separate header files for better documentation generation.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.h:
* gst/interleave/interleave.h:
* gst/interleave/plugin.h:
Split definitions into separate header files for better documentation
generation.
* gst/interleave/deinterleave.c: (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_sink_setcaps),
(gst_deinterleave_process):
Don't use alloca, allow caps changes as long as the number of channels
does not change, don't use g_warning, return NOT_NEGOTIATED as early
as possible and some other cleanup.
* gst/interleave/interleave.c: (gst_interleave_base_init),
(gst_interleave_class_init):
Do some random cleanup.
* tests/check/Makefile.am:
* tests/check/elements/deinterleave.c: (GST_START_TEST),
(deinterleave_chain_func), (deinterleave_pad_added),
(deinterleave_suite):
Add unit tests for the deinterleave element.
2008-05-14 07:32:44 +00:00
|
|
|
"Splits one interleaved multichannel audio stream into many mono audio streams",
|
2012-04-09 23:51:41 +00:00
|
|
|
"Andy Wingo <wingo at pobox.com>, " "Iain <iain@prettypeople.org>, "
|
2008-05-22 18:55:09 +00:00
|
|
|
"Sebastian Dröge <slomo@circular-chaos.org>");
|
2007-01-07 22:03:54 +00:00
|
|
|
|
2016-03-04 01:30:12 +00:00
|
|
|
gst_element_class_add_static_pad_template (gstelement_class, &sink_template);
|
|
|
|
gst_element_class_add_static_pad_template (gstelement_class, &src_template);
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
|
2012-01-30 15:40:19 +00:00
|
|
|
gstelement_class->change_state = gst_deinterleave_change_state;
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
|
|
|
|
gobject_class->finalize = gst_deinterleave_finalize;
|
2008-05-19 07:46:05 +00:00
|
|
|
gobject_class->set_property = gst_deinterleave_set_property;
|
|
|
|
gobject_class->get_property = gst_deinterleave_get_property;
|
|
|
|
|
2008-05-22 18:55:09 +00:00
|
|
|
/**
|
|
|
|
* GstDeinterleave:keep-positions
|
2018-10-22 09:39:24 +00:00
|
|
|
*
|
2008-05-22 18:55:09 +00:00
|
|
|
* Keep positions: When enable the caps on the output buffers will
|
|
|
|
* contain the original channel positions. This can be used to correctly
|
|
|
|
* interleave the output again later but can also lead to unwanted effects
|
|
|
|
* if the output should be handled as Mono.
|
|
|
|
*
|
|
|
|
*/
|
2008-05-19 07:46:05 +00:00
|
|
|
g_object_class_install_property (gobject_class, PROP_KEEP_POSITIONS,
|
|
|
|
g_param_spec_boolean ("keep-positions", "Keep positions",
|
|
|
|
"Keep the original channel positions on the output buffers",
|
|
|
|
FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
2007-01-07 22:03:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-01-30 15:40:19 +00:00
|
|
|
gst_deinterleave_init (GstDeinterleave * self)
|
2007-01-07 22:03:54 +00:00
|
|
|
{
|
2008-05-19 07:46:05 +00:00
|
|
|
self->keep_positions = FALSE;
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
self->func = NULL;
|
2012-01-30 15:40:19 +00:00
|
|
|
gst_audio_info_init (&self->audio_info);
|
2007-01-07 22:03:54 +00:00
|
|
|
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
/* Add sink pad */
|
|
|
|
self->sink = gst_pad_new_from_static_template (&sink_template, "sink");
|
2007-01-07 22:03:54 +00:00
|
|
|
gst_pad_set_chain_function (self->sink,
|
|
|
|
GST_DEBUG_FUNCPTR (gst_deinterleave_chain));
|
2008-05-17 19:39:53 +00:00
|
|
|
gst_pad_set_event_function (self->sink,
|
|
|
|
GST_DEBUG_FUNCPTR (gst_deinterleave_sink_event));
|
2015-09-30 13:00:31 +00:00
|
|
|
gst_pad_set_query_function (self->sink,
|
|
|
|
GST_DEBUG_FUNCPTR (gst_deinterleave_sink_query));
|
2007-01-07 22:03:54 +00:00
|
|
|
gst_element_add_pad (GST_ELEMENT (self), self->sink);
|
|
|
|
}
|
|
|
|
|
2013-05-13 12:07:11 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
GstCaps *caps;
|
|
|
|
GstPad *pad;
|
|
|
|
} CopyStickyEventsData;
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
copy_sticky_events (GstPad * pad, GstEvent ** event, gpointer user_data)
|
|
|
|
{
|
|
|
|
CopyStickyEventsData *data = user_data;
|
|
|
|
|
|
|
|
if (GST_EVENT_TYPE (*event) >= GST_EVENT_CAPS && data->caps) {
|
|
|
|
gst_pad_set_caps (data->pad, data->caps);
|
|
|
|
data->caps = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (GST_EVENT_TYPE (*event) != GST_EVENT_CAPS)
|
|
|
|
gst_pad_push_event (data->pad, gst_event_ref (*event));
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2007-01-07 22:03:54 +00:00
|
|
|
static void
|
|
|
|
gst_deinterleave_add_new_pads (GstDeinterleave * self, GstCaps * caps)
|
|
|
|
{
|
|
|
|
GstPad *pad;
|
|
|
|
guint i;
|
|
|
|
|
2012-01-30 15:40:19 +00:00
|
|
|
for (i = 0; i < GST_AUDIO_INFO_CHANNELS (&self->audio_info); i++) {
|
2011-11-04 12:12:37 +00:00
|
|
|
gchar *name = g_strdup_printf ("src_%u", i);
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
GstCaps *srccaps;
|
2012-01-30 15:40:19 +00:00
|
|
|
GstAudioInfo info;
|
|
|
|
GstAudioFormat format = GST_AUDIO_INFO_FORMAT (&self->audio_info);
|
|
|
|
gint rate = GST_AUDIO_INFO_RATE (&self->audio_info);
|
2012-10-05 22:12:27 +00:00
|
|
|
GstAudioChannelPosition position = GST_AUDIO_CHANNEL_POSITION_MONO;
|
2013-05-13 12:07:11 +00:00
|
|
|
CopyStickyEventsData data;
|
2008-06-05 11:07:17 +00:00
|
|
|
|
2012-01-30 15:40:19 +00:00
|
|
|
/* Set channel position if we know it */
|
|
|
|
if (self->keep_positions)
|
|
|
|
position = GST_AUDIO_INFO_POSITION (&self->audio_info, i);
|
2007-01-07 22:03:54 +00:00
|
|
|
|
2012-01-30 15:40:19 +00:00
|
|
|
gst_audio_info_init (&info);
|
|
|
|
gst_audio_info_set_format (&info, format, rate, 1, &position);
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
|
2012-01-30 15:40:19 +00:00
|
|
|
srccaps = gst_audio_info_to_caps (&info);
|
2008-05-19 07:46:05 +00:00
|
|
|
|
2012-01-30 15:40:19 +00:00
|
|
|
pad = gst_pad_new_from_static_template (&src_template, name);
|
|
|
|
g_free (name);
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
|
2007-01-13 19:12:32 +00:00
|
|
|
gst_pad_use_fixed_caps (pad);
|
2008-06-05 11:07:17 +00:00
|
|
|
gst_pad_set_query_function (pad,
|
|
|
|
GST_DEBUG_FUNCPTR (gst_deinterleave_src_query));
|
2007-03-22 22:14:29 +00:00
|
|
|
gst_pad_set_active (pad, TRUE);
|
2013-05-13 12:07:11 +00:00
|
|
|
|
|
|
|
data.pad = pad;
|
|
|
|
data.caps = srccaps;
|
|
|
|
gst_pad_sticky_events_foreach (self->sink, copy_sticky_events, &data);
|
|
|
|
if (data.caps)
|
|
|
|
gst_pad_set_caps (pad, data.caps);
|
2007-01-07 22:03:54 +00:00
|
|
|
gst_element_add_pad (GST_ELEMENT (self), pad);
|
2007-03-22 22:14:29 +00:00
|
|
|
self->srcpads = g_list_prepend (self->srcpads, gst_object_ref (pad));
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
|
2012-01-30 15:40:19 +00:00
|
|
|
gst_caps_unref (srccaps);
|
2007-01-07 22:03:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
gst_element_no_more_pads (GST_ELEMENT (self));
|
2007-03-22 22:14:29 +00:00
|
|
|
self->srcpads = g_list_reverse (self->srcpads);
|
2007-01-07 22:03:54 +00:00
|
|
|
}
|
|
|
|
|
2014-04-21 12:27:24 +00:00
|
|
|
static gboolean
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
gst_deinterleave_set_pads_caps (GstDeinterleave * self, GstCaps * caps)
|
|
|
|
{
|
|
|
|
GList *l;
|
|
|
|
gint i;
|
2014-04-21 12:27:24 +00:00
|
|
|
gboolean ret = TRUE;
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
|
|
|
|
for (l = self->srcpads, i = 0; l; l = l->next, i++) {
|
|
|
|
GstPad *pad = GST_PAD (l->data);
|
|
|
|
GstCaps *srccaps;
|
2012-01-30 15:40:19 +00:00
|
|
|
GstAudioInfo info;
|
2013-05-13 12:07:11 +00:00
|
|
|
|
2014-04-21 12:27:24 +00:00
|
|
|
if (!gst_audio_info_from_caps (&info, caps)) {
|
|
|
|
ret = FALSE;
|
|
|
|
continue;
|
|
|
|
}
|
2012-01-30 15:40:19 +00:00
|
|
|
if (self->keep_positions)
|
2012-12-12 11:07:34 +00:00
|
|
|
GST_AUDIO_INFO_POSITION (&info, 0) =
|
2012-01-30 15:40:19 +00:00
|
|
|
GST_AUDIO_INFO_POSITION (&self->audio_info, i);
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
|
2012-01-30 15:40:19 +00:00
|
|
|
srccaps = gst_audio_info_to_caps (&info);
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
|
|
|
|
gst_pad_set_caps (pad, srccaps);
|
2012-01-30 15:40:19 +00:00
|
|
|
gst_caps_unref (srccaps);
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
}
|
2014-04-21 12:27:24 +00:00
|
|
|
return ret;
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
}
|
|
|
|
|
2007-01-07 22:03:54 +00:00
|
|
|
static void
|
|
|
|
gst_deinterleave_remove_pads (GstDeinterleave * self)
|
|
|
|
{
|
2007-03-22 22:14:29 +00:00
|
|
|
GList *l;
|
2007-01-07 22:03:54 +00:00
|
|
|
|
2007-03-22 22:14:29 +00:00
|
|
|
GST_INFO_OBJECT (self, "removing pads");
|
2007-01-07 22:03:54 +00:00
|
|
|
|
2007-03-22 22:14:29 +00:00
|
|
|
for (l = self->srcpads; l; l = l->next) {
|
|
|
|
GstPad *pad = GST_PAD (l->data);
|
2007-01-07 22:03:54 +00:00
|
|
|
|
2007-03-22 22:14:29 +00:00
|
|
|
gst_element_remove_pad (GST_ELEMENT_CAST (self), pad);
|
|
|
|
gst_object_unref (pad);
|
|
|
|
}
|
|
|
|
g_list_free (self->srcpads);
|
|
|
|
self->srcpads = NULL;
|
2007-01-07 22:03:54 +00:00
|
|
|
|
|
|
|
gst_caps_replace (&self->sinkcaps, NULL);
|
|
|
|
}
|
|
|
|
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
static gboolean
|
2012-01-30 15:40:19 +00:00
|
|
|
gst_deinterleave_set_process_function (GstDeinterleave * self)
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
{
|
2012-01-30 15:40:19 +00:00
|
|
|
switch (GST_AUDIO_INFO_WIDTH (&self->audio_info)) {
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
case 8:
|
|
|
|
self->func = (GstDeinterleaveFunc) deinterleave_8;
|
|
|
|
break;
|
|
|
|
case 16:
|
|
|
|
self->func = (GstDeinterleaveFunc) deinterleave_16;
|
|
|
|
break;
|
|
|
|
case 24:
|
|
|
|
self->func = (GstDeinterleaveFunc) deinterleave_24;
|
|
|
|
break;
|
|
|
|
case 32:
|
|
|
|
self->func = (GstDeinterleaveFunc) deinterleave_32;
|
|
|
|
break;
|
|
|
|
case 64:
|
|
|
|
self->func = (GstDeinterleaveFunc) deinterleave_64;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2015-09-30 20:35:33 +00:00
|
|
|
static gboolean
|
|
|
|
gst_deinterleave_check_caps_change (GstDeinterleave * self,
|
|
|
|
GstAudioInfo * old_info, GstAudioInfo * new_info)
|
|
|
|
{
|
|
|
|
gint i;
|
|
|
|
gboolean same_layout = TRUE;
|
|
|
|
gboolean was_unpositioned;
|
2019-01-24 21:21:12 +00:00
|
|
|
gboolean is_unpositioned;
|
|
|
|
gint new_channels;
|
2015-09-30 20:35:33 +00:00
|
|
|
gint old_channels;
|
|
|
|
|
2019-01-24 21:21:12 +00:00
|
|
|
new_channels = GST_AUDIO_INFO_CHANNELS (new_info);
|
2015-09-30 20:35:33 +00:00
|
|
|
old_channels = GST_AUDIO_INFO_CHANNELS (old_info);
|
|
|
|
|
2019-01-24 21:21:12 +00:00
|
|
|
if (GST_AUDIO_INFO_IS_UNPOSITIONED (new_info) || new_channels == 1)
|
|
|
|
is_unpositioned = TRUE;
|
|
|
|
else
|
|
|
|
is_unpositioned = FALSE;
|
|
|
|
|
|
|
|
if (GST_AUDIO_INFO_IS_UNPOSITIONED (old_info) || old_channels == 1)
|
|
|
|
was_unpositioned = TRUE;
|
|
|
|
else
|
|
|
|
was_unpositioned = FALSE;
|
|
|
|
|
2015-09-30 20:35:33 +00:00
|
|
|
/* We allow caps changes as long as the number of channels doesn't change
|
|
|
|
* and the channel positions stay the same. _getcaps() should've cared
|
|
|
|
* for this already but better be safe.
|
|
|
|
*/
|
|
|
|
if (new_channels != old_channels)
|
|
|
|
goto cannot_change_caps;
|
|
|
|
|
|
|
|
/* Now check the channel positions. If we had no channel positions
|
|
|
|
* and get them or the other way around things have changed.
|
|
|
|
* If we had channel positions and get different ones things have
|
|
|
|
* changed too of course
|
|
|
|
*/
|
|
|
|
if ((!was_unpositioned && is_unpositioned) || (was_unpositioned
|
|
|
|
&& !is_unpositioned))
|
|
|
|
goto cannot_change_caps;
|
|
|
|
|
|
|
|
if (!is_unpositioned) {
|
|
|
|
if (GST_AUDIO_INFO_CHANNELS (old_info) !=
|
|
|
|
GST_AUDIO_INFO_CHANNELS (new_info))
|
|
|
|
goto cannot_change_caps;
|
|
|
|
for (i = 0; i < GST_AUDIO_INFO_CHANNELS (old_info); i++) {
|
|
|
|
if (new_info->position[i] != old_info->position[i]) {
|
|
|
|
same_layout = FALSE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!same_layout)
|
|
|
|
goto cannot_change_caps;
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
cannot_change_caps:
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2007-01-07 22:03:54 +00:00
|
|
|
static gboolean
|
2012-01-30 15:40:19 +00:00
|
|
|
gst_deinterleave_sink_setcaps (GstDeinterleave * self, GstCaps * caps)
|
2007-01-07 22:03:54 +00:00
|
|
|
{
|
gst/interleave/: Split definitions into separate header files for better documentation generation.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.h:
* gst/interleave/interleave.h:
* gst/interleave/plugin.h:
Split definitions into separate header files for better documentation
generation.
* gst/interleave/deinterleave.c: (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_sink_setcaps),
(gst_deinterleave_process):
Don't use alloca, allow caps changes as long as the number of channels
does not change, don't use g_warning, return NOT_NEGOTIATED as early
as possible and some other cleanup.
* gst/interleave/interleave.c: (gst_interleave_base_init),
(gst_interleave_class_init):
Do some random cleanup.
* tests/check/Makefile.am:
* tests/check/elements/deinterleave.c: (GST_START_TEST),
(deinterleave_chain_func), (deinterleave_pad_added),
(deinterleave_suite):
Add unit tests for the deinterleave element.
2008-05-14 07:32:44 +00:00
|
|
|
GstCaps *srccaps;
|
|
|
|
GstStructure *s;
|
2007-01-07 22:03:54 +00:00
|
|
|
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
GST_DEBUG_OBJECT (self, "got caps: %" GST_PTR_FORMAT, caps);
|
|
|
|
|
2012-01-30 15:40:19 +00:00
|
|
|
if (!gst_audio_info_from_caps (&self->audio_info, caps))
|
|
|
|
goto invalid_caps;
|
2008-06-05 11:07:17 +00:00
|
|
|
|
2012-01-30 15:40:19 +00:00
|
|
|
if (!gst_deinterleave_set_process_function (self))
|
|
|
|
goto unsupported_caps;
|
2008-06-05 11:07:17 +00:00
|
|
|
|
2012-01-30 15:40:19 +00:00
|
|
|
if (self->sinkcaps && !gst_caps_is_equal (caps, self->sinkcaps)) {
|
|
|
|
GstAudioInfo old_info;
|
|
|
|
|
|
|
|
gst_audio_info_init (&old_info);
|
2014-04-21 12:27:24 +00:00
|
|
|
if (!gst_audio_info_from_caps (&old_info, self->sinkcaps))
|
|
|
|
goto info_from_caps_failed;
|
gst/interleave/: Split definitions into separate header files for better documentation generation.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.h:
* gst/interleave/interleave.h:
* gst/interleave/plugin.h:
Split definitions into separate header files for better documentation
generation.
* gst/interleave/deinterleave.c: (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_sink_setcaps),
(gst_deinterleave_process):
Don't use alloca, allow caps changes as long as the number of channels
does not change, don't use g_warning, return NOT_NEGOTIATED as early
as possible and some other cleanup.
* gst/interleave/interleave.c: (gst_interleave_base_init),
(gst_interleave_class_init):
Do some random cleanup.
* tests/check/Makefile.am:
* tests/check/elements/deinterleave.c: (GST_START_TEST),
(deinterleave_chain_func), (deinterleave_pad_added),
(deinterleave_suite):
Add unit tests for the deinterleave element.
2008-05-14 07:32:44 +00:00
|
|
|
|
2015-09-30 20:35:33 +00:00
|
|
|
if (gst_deinterleave_check_caps_change (self, &old_info, &self->audio_info)) {
|
|
|
|
if (!gst_deinterleave_set_process_function (self))
|
gst/interleave/: Split definitions into separate header files for better documentation generation.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.h:
* gst/interleave/interleave.h:
* gst/interleave/plugin.h:
Split definitions into separate header files for better documentation
generation.
* gst/interleave/deinterleave.c: (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_sink_setcaps),
(gst_deinterleave_process):
Don't use alloca, allow caps changes as long as the number of channels
does not change, don't use g_warning, return NOT_NEGOTIATED as early
as possible and some other cleanup.
* gst/interleave/interleave.c: (gst_interleave_base_init),
(gst_interleave_class_init):
Do some random cleanup.
* tests/check/Makefile.am:
* tests/check/elements/deinterleave.c: (GST_START_TEST),
(deinterleave_chain_func), (deinterleave_pad_added),
(deinterleave_suite):
Add unit tests for the deinterleave element.
2008-05-14 07:32:44 +00:00
|
|
|
goto cannot_change_caps;
|
2015-09-30 20:35:33 +00:00
|
|
|
} else
|
|
|
|
goto cannot_change_caps;
|
2008-05-17 14:05:03 +00:00
|
|
|
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
gst_caps_replace (&self->sinkcaps, caps);
|
|
|
|
|
|
|
|
/* Get srcpad caps */
|
|
|
|
srccaps = gst_caps_copy (caps);
|
|
|
|
s = gst_caps_get_structure (srccaps, 0);
|
|
|
|
gst_structure_set (s, "channels", G_TYPE_INT, 1, NULL);
|
2012-01-30 15:40:19 +00:00
|
|
|
gst_structure_remove_field (s, "channel-mask");
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
|
|
|
|
/* If we already have pads, update the caps otherwise
|
|
|
|
* add new pads */
|
|
|
|
if (self->srcpads) {
|
2014-04-21 12:27:24 +00:00
|
|
|
if (!gst_deinterleave_set_pads_caps (self, srccaps))
|
|
|
|
goto set_caps_failed;
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
} else {
|
2007-01-07 22:03:54 +00:00
|
|
|
gst_deinterleave_add_new_pads (self, srccaps);
|
|
|
|
}
|
|
|
|
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
gst_caps_unref (srccaps);
|
2007-01-07 22:03:54 +00:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
gst/interleave/: Split definitions into separate header files for better documentation generation.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.h:
* gst/interleave/interleave.h:
* gst/interleave/plugin.h:
Split definitions into separate header files for better documentation
generation.
* gst/interleave/deinterleave.c: (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_sink_setcaps),
(gst_deinterleave_process):
Don't use alloca, allow caps changes as long as the number of channels
does not change, don't use g_warning, return NOT_NEGOTIATED as early
as possible and some other cleanup.
* gst/interleave/interleave.c: (gst_interleave_base_init),
(gst_interleave_class_init):
Do some random cleanup.
* tests/check/Makefile.am:
* tests/check/elements/deinterleave.c: (GST_START_TEST),
(deinterleave_chain_func), (deinterleave_pad_added),
(deinterleave_suite):
Add unit tests for the deinterleave element.
2008-05-14 07:32:44 +00:00
|
|
|
cannot_change_caps:
|
2007-01-07 22:03:54 +00:00
|
|
|
{
|
2012-07-03 18:38:39 +00:00
|
|
|
GST_WARNING_OBJECT (self, "caps change from %" GST_PTR_FORMAT
|
|
|
|
" to %" GST_PTR_FORMAT " not supported: channel number or channel "
|
|
|
|
"positions change", self->sinkcaps, caps);
|
2007-01-07 22:03:54 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
unsupported_caps:
|
|
|
|
{
|
|
|
|
GST_ERROR_OBJECT (self, "caps not supported: %" GST_PTR_FORMAT, caps);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2012-01-30 15:40:19 +00:00
|
|
|
invalid_caps:
|
2007-01-07 22:03:54 +00:00
|
|
|
{
|
gst/interleave/: Split definitions into separate header files for better documentation generation.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.h:
* gst/interleave/interleave.h:
* gst/interleave/plugin.h:
Split definitions into separate header files for better documentation
generation.
* gst/interleave/deinterleave.c: (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_sink_setcaps),
(gst_deinterleave_process):
Don't use alloca, allow caps changes as long as the number of channels
does not change, don't use g_warning, return NOT_NEGOTIATED as early
as possible and some other cleanup.
* gst/interleave/interleave.c: (gst_interleave_base_init),
(gst_interleave_class_init):
Do some random cleanup.
* tests/check/Makefile.am:
* tests/check/elements/deinterleave.c: (GST_START_TEST),
(deinterleave_chain_func), (deinterleave_pad_added),
(deinterleave_suite):
Add unit tests for the deinterleave element.
2008-05-14 07:32:44 +00:00
|
|
|
GST_ERROR_OBJECT (self, "invalid caps");
|
2007-01-07 22:03:54 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2014-04-21 12:27:24 +00:00
|
|
|
set_caps_failed:
|
|
|
|
{
|
|
|
|
GST_ERROR_OBJECT (self, "set_caps failed");
|
|
|
|
gst_caps_unref (srccaps);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
info_from_caps_failed:
|
|
|
|
{
|
2019-09-02 12:27:35 +00:00
|
|
|
GST_ERROR_OBJECT (self, "could not get info from caps");
|
2014-04-21 12:27:24 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2007-01-07 22:03:54 +00:00
|
|
|
}
|
|
|
|
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
static void
|
|
|
|
__remove_channels (GstCaps * caps)
|
|
|
|
{
|
|
|
|
GstStructure *s;
|
|
|
|
gint i, size;
|
|
|
|
|
|
|
|
size = gst_caps_get_size (caps);
|
|
|
|
for (i = 0; i < size; i++) {
|
|
|
|
s = gst_caps_get_structure (caps, i);
|
2012-01-30 15:40:19 +00:00
|
|
|
gst_structure_remove_field (s, "channel-mask");
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
gst_structure_remove_field (s, "channels");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
__set_channels (GstCaps * caps, gint channels)
|
|
|
|
{
|
|
|
|
GstStructure *s;
|
|
|
|
gint i, size;
|
|
|
|
|
|
|
|
size = gst_caps_get_size (caps);
|
|
|
|
for (i = 0; i < size; i++) {
|
|
|
|
s = gst_caps_get_structure (caps, i);
|
|
|
|
if (channels > 0)
|
|
|
|
gst_structure_set (s, "channels", G_TYPE_INT, channels, NULL);
|
|
|
|
else
|
|
|
|
gst_structure_set (s, "channels", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-09-30 20:35:33 +00:00
|
|
|
static gboolean
|
|
|
|
gst_deinterleave_sink_acceptcaps (GstPad * pad, GstObject * parent,
|
|
|
|
GstCaps * caps)
|
|
|
|
{
|
|
|
|
GstDeinterleave *self = GST_DEINTERLEAVE (parent);
|
|
|
|
GstCaps *templ_caps = gst_pad_get_pad_template_caps (pad);
|
|
|
|
gboolean ret;
|
|
|
|
|
|
|
|
ret = gst_caps_can_intersect (templ_caps, caps);
|
|
|
|
gst_caps_unref (templ_caps);
|
|
|
|
if (ret && self->sinkcaps) {
|
|
|
|
GstAudioInfo new_info;
|
|
|
|
|
|
|
|
gst_audio_info_init (&new_info);
|
|
|
|
if (!gst_audio_info_from_caps (&new_info, caps))
|
|
|
|
goto info_from_caps_failed;
|
|
|
|
ret =
|
|
|
|
gst_deinterleave_check_caps_change (self, &self->audio_info, &new_info);
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
|
|
|
info_from_caps_failed:
|
|
|
|
{
|
2019-09-02 12:27:35 +00:00
|
|
|
GST_ERROR_OBJECT (self, "could not get info from caps");
|
2015-09-30 20:35:33 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
static GstCaps *
|
2015-09-30 13:00:31 +00:00
|
|
|
gst_deinterleave_getcaps (GstPad * pad, GstObject * parent, GstCaps * filter)
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
{
|
2012-01-30 15:40:19 +00:00
|
|
|
GstDeinterleave *self = GST_DEINTERLEAVE (parent);
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
GstCaps *ret;
|
2016-03-16 18:18:41 +00:00
|
|
|
GstIterator *it;
|
|
|
|
GstIteratorResult res;
|
|
|
|
GValue v = G_VALUE_INIT;
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
|
2016-03-16 18:26:16 +00:00
|
|
|
if (pad != self->sink) {
|
|
|
|
ret = gst_pad_get_current_caps (pad);
|
|
|
|
if (ret) {
|
|
|
|
if (filter) {
|
|
|
|
GstCaps *tmp =
|
|
|
|
gst_caps_intersect_full (filter, ret, GST_CAPS_INTERSECT_FIRST);
|
|
|
|
gst_caps_unref (ret);
|
|
|
|
ret = tmp;
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
/* Intersect all of our pad template caps with the peer caps of the pad
|
|
|
|
* to get all formats that are possible up- and downstream.
|
|
|
|
*
|
|
|
|
* For the pad for which the caps are requested we don't remove the channel
|
2019-09-02 12:27:35 +00:00
|
|
|
* information as they must be in the returned caps and incompatibilities
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
* will be detected here already
|
|
|
|
*/
|
|
|
|
ret = gst_caps_new_any ();
|
2016-03-16 18:18:41 +00:00
|
|
|
it = gst_element_iterate_pads (GST_ELEMENT_CAST (self));
|
|
|
|
|
|
|
|
do {
|
|
|
|
res = gst_iterator_next (it, &v);
|
|
|
|
switch (res) {
|
|
|
|
case GST_ITERATOR_OK:{
|
|
|
|
GstPad *ourpad = GST_PAD (g_value_get_object (&v));
|
|
|
|
GstCaps *peercaps = NULL, *ourcaps;
|
|
|
|
GstCaps *templ_caps = gst_pad_get_pad_template_caps (ourpad);
|
|
|
|
|
|
|
|
ourcaps = gst_caps_copy (templ_caps);
|
|
|
|
gst_caps_unref (templ_caps);
|
|
|
|
|
|
|
|
if (pad == ourpad) {
|
|
|
|
if (GST_PAD_DIRECTION (pad) == GST_PAD_SINK)
|
|
|
|
__set_channels (ourcaps,
|
|
|
|
GST_AUDIO_INFO_CHANNELS (&self->audio_info));
|
|
|
|
else
|
|
|
|
__set_channels (ourcaps, 1);
|
|
|
|
} else {
|
|
|
|
__remove_channels (ourcaps);
|
|
|
|
/* Only ask for peer caps for other pads than pad
|
|
|
|
* as otherwise gst_pad_peer_get_caps() might call
|
|
|
|
* back into this function and deadlock
|
|
|
|
*/
|
|
|
|
peercaps = gst_pad_peer_query_caps (ourpad, NULL);
|
|
|
|
peercaps = gst_caps_make_writable (peercaps);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* If the peer exists and has caps add them to the intersection,
|
|
|
|
* otherwise assume that the peer accepts everything */
|
|
|
|
if (peercaps) {
|
|
|
|
GstCaps *intersection;
|
|
|
|
GstCaps *oldret = ret;
|
|
|
|
|
|
|
|
__remove_channels (peercaps);
|
|
|
|
|
|
|
|
intersection = gst_caps_intersect (peercaps, ourcaps);
|
|
|
|
|
|
|
|
ret = gst_caps_intersect (ret, intersection);
|
|
|
|
gst_caps_unref (intersection);
|
|
|
|
gst_caps_unref (peercaps);
|
|
|
|
gst_caps_unref (oldret);
|
|
|
|
} else {
|
|
|
|
GstCaps *oldret = ret;
|
|
|
|
|
|
|
|
ret = gst_caps_intersect (ret, ourcaps);
|
|
|
|
gst_caps_unref (oldret);
|
|
|
|
}
|
|
|
|
gst_caps_unref (ourcaps);
|
|
|
|
g_value_reset (&v);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case GST_ITERATOR_DONE:
|
|
|
|
break;
|
|
|
|
case GST_ITERATOR_ERROR:
|
|
|
|
gst_caps_unref (ret);
|
|
|
|
ret = gst_caps_new_empty ();
|
|
|
|
break;
|
|
|
|
case GST_ITERATOR_RESYNC:
|
|
|
|
gst_caps_unref (ret);
|
2016-11-14 15:37:51 +00:00
|
|
|
ret = gst_caps_new_any ();
|
2016-03-16 18:18:41 +00:00
|
|
|
gst_iterator_resync (it);
|
|
|
|
break;
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
}
|
2016-03-16 18:18:41 +00:00
|
|
|
} while (res != GST_ITERATOR_DONE && res != GST_ITERATOR_ERROR);
|
|
|
|
g_value_unset (&v);
|
|
|
|
gst_iterator_free (it);
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
|
2015-09-30 15:30:59 +00:00
|
|
|
if (filter) {
|
|
|
|
GstCaps *aux;
|
|
|
|
|
2016-03-16 18:26:16 +00:00
|
|
|
aux = gst_caps_intersect_full (filter, ret, GST_CAPS_INTERSECT_FIRST);
|
2015-09-30 15:30:59 +00:00
|
|
|
gst_caps_unref (ret);
|
|
|
|
ret = aux;
|
|
|
|
}
|
|
|
|
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "Intersected caps to %" GST_PTR_FORMAT, ret);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2008-05-17 19:39:53 +00:00
|
|
|
static gboolean
|
2012-01-30 15:40:19 +00:00
|
|
|
gst_deinterleave_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
|
2008-05-17 19:39:53 +00:00
|
|
|
{
|
2012-01-30 15:40:19 +00:00
|
|
|
GstDeinterleave *self = GST_DEINTERLEAVE (parent);
|
2008-05-17 19:39:53 +00:00
|
|
|
gboolean ret;
|
|
|
|
|
|
|
|
GST_DEBUG ("Got %s event on pad %s:%s", GST_EVENT_TYPE_NAME (event),
|
|
|
|
GST_DEBUG_PAD_NAME (pad));
|
|
|
|
|
|
|
|
/* Send FLUSH_STOP, FLUSH_START and EOS immediately, no matter if
|
|
|
|
* we have src pads already or not. Queue all other events and
|
|
|
|
* push them after we have src pads
|
|
|
|
*/
|
|
|
|
switch (GST_EVENT_TYPE (event)) {
|
|
|
|
case GST_EVENT_FLUSH_STOP:
|
|
|
|
case GST_EVENT_FLUSH_START:
|
|
|
|
case GST_EVENT_EOS:
|
2012-01-30 15:40:19 +00:00
|
|
|
ret = gst_pad_event_default (pad, parent, event);
|
|
|
|
break;
|
|
|
|
case GST_EVENT_CAPS:
|
|
|
|
{
|
|
|
|
GstCaps *caps;
|
|
|
|
|
|
|
|
gst_event_parse_caps (event, &caps);
|
|
|
|
ret = gst_deinterleave_sink_setcaps (self, caps);
|
|
|
|
gst_event_unref (event);
|
2008-05-17 19:39:53 +00:00
|
|
|
break;
|
2012-01-30 15:40:19 +00:00
|
|
|
}
|
|
|
|
|
2008-05-17 19:39:53 +00:00
|
|
|
default:
|
2013-05-13 12:07:11 +00:00
|
|
|
if (!self->srcpads && !GST_EVENT_IS_STICKY (event)) {
|
|
|
|
/* Sticky events are copied when creating a new pad */
|
2008-05-17 19:39:53 +00:00
|
|
|
GST_OBJECT_LOCK (self);
|
|
|
|
self->pending_events = g_list_append (self->pending_events, event);
|
|
|
|
GST_OBJECT_UNLOCK (self);
|
|
|
|
ret = TRUE;
|
2013-05-13 12:07:11 +00:00
|
|
|
} else {
|
|
|
|
ret = gst_pad_event_default (pad, parent, event);
|
2008-05-17 19:39:53 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2015-09-30 13:00:31 +00:00
|
|
|
static gboolean
|
|
|
|
gst_deinterleave_sink_query (GstPad * pad, GstObject * parent, GstQuery * query)
|
|
|
|
{
|
|
|
|
gboolean res;
|
|
|
|
|
|
|
|
switch (GST_QUERY_TYPE (query)) {
|
|
|
|
case GST_QUERY_CAPS:{
|
|
|
|
GstCaps *filter;
|
|
|
|
GstCaps *caps;
|
|
|
|
|
|
|
|
gst_query_parse_caps (query, &filter);
|
|
|
|
caps = gst_deinterleave_getcaps (pad, parent, filter);
|
|
|
|
gst_query_set_caps_result (query, caps);
|
|
|
|
gst_caps_unref (caps);
|
|
|
|
res = TRUE;
|
|
|
|
break;
|
|
|
|
}
|
2015-09-30 20:35:33 +00:00
|
|
|
case GST_QUERY_ACCEPT_CAPS:{
|
|
|
|
GstCaps *caps;
|
|
|
|
gboolean ret;
|
|
|
|
|
|
|
|
gst_query_parse_accept_caps (query, &caps);
|
|
|
|
ret = gst_deinterleave_sink_acceptcaps (pad, parent, caps);
|
|
|
|
gst_query_set_accept_caps_result (query, ret);
|
|
|
|
res = TRUE;
|
|
|
|
break;
|
|
|
|
}
|
2015-09-30 13:00:31 +00:00
|
|
|
default:
|
|
|
|
res = gst_pad_query_default (pad, parent, query);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2008-06-05 11:07:17 +00:00
|
|
|
static gboolean
|
2012-01-30 15:40:19 +00:00
|
|
|
gst_deinterleave_src_query (GstPad * pad, GstObject * parent, GstQuery * query)
|
2008-06-05 11:07:17 +00:00
|
|
|
{
|
2012-01-30 15:40:19 +00:00
|
|
|
GstDeinterleave *self = GST_DEINTERLEAVE (parent);
|
2008-06-05 11:07:17 +00:00
|
|
|
gboolean res;
|
|
|
|
|
2012-01-30 15:40:19 +00:00
|
|
|
res = gst_pad_query_default (pad, parent, query);
|
2008-06-05 11:07:17 +00:00
|
|
|
|
|
|
|
if (res && GST_QUERY_TYPE (query) == GST_QUERY_DURATION) {
|
|
|
|
GstFormat format;
|
|
|
|
gint64 dur;
|
|
|
|
|
|
|
|
gst_query_parse_duration (query, &format, &dur);
|
|
|
|
|
|
|
|
/* Need to divide by the number of channels in byte format
|
|
|
|
* to get the correct value. All other formats should be fine
|
|
|
|
*/
|
|
|
|
if (format == GST_FORMAT_BYTES && dur != -1)
|
2012-01-30 15:40:19 +00:00
|
|
|
gst_query_set_duration (query, format,
|
|
|
|
dur / GST_AUDIO_INFO_CHANNELS (&self->audio_info));
|
2008-06-05 11:07:17 +00:00
|
|
|
} else if (res && GST_QUERY_TYPE (query) == GST_QUERY_POSITION) {
|
|
|
|
GstFormat format;
|
|
|
|
gint64 pos;
|
|
|
|
|
|
|
|
gst_query_parse_position (query, &format, &pos);
|
|
|
|
|
|
|
|
/* Need to divide by the number of channels in byte format
|
|
|
|
* to get the correct value. All other formats should be fine
|
|
|
|
*/
|
|
|
|
if (format == GST_FORMAT_BYTES && pos != -1)
|
2012-01-30 15:40:19 +00:00
|
|
|
gst_query_set_position (query, format,
|
|
|
|
pos / GST_AUDIO_INFO_CHANNELS (&self->audio_info));
|
|
|
|
} else if (res && GST_QUERY_TYPE (query) == GST_QUERY_CAPS) {
|
|
|
|
GstCaps *filter, *caps;
|
|
|
|
|
|
|
|
gst_query_parse_caps (query, &filter);
|
2015-09-30 13:00:31 +00:00
|
|
|
caps = gst_deinterleave_getcaps (pad, parent, filter);
|
2012-01-30 15:40:19 +00:00
|
|
|
gst_query_set_caps_result (query, caps);
|
|
|
|
gst_caps_unref (caps);
|
2008-06-05 11:07:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2008-05-19 07:46:05 +00:00
|
|
|
static void
|
|
|
|
gst_deinterleave_set_property (GObject * object, guint prop_id,
|
|
|
|
const GValue * value, GParamSpec * pspec)
|
|
|
|
{
|
|
|
|
GstDeinterleave *self = GST_DEINTERLEAVE (object);
|
|
|
|
|
|
|
|
switch (prop_id) {
|
|
|
|
case PROP_KEEP_POSITIONS:
|
|
|
|
self->keep_positions = g_value_get_boolean (value);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gst_deinterleave_get_property (GObject * object, guint prop_id,
|
|
|
|
GValue * value, GParamSpec * pspec)
|
|
|
|
{
|
|
|
|
GstDeinterleave *self = GST_DEINTERLEAVE (object);
|
|
|
|
|
|
|
|
switch (prop_id) {
|
|
|
|
case PROP_KEEP_POSITIONS:
|
|
|
|
g_value_set_boolean (value, self->keep_positions);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-01-07 22:03:54 +00:00
|
|
|
static GstFlowReturn
|
|
|
|
gst_deinterleave_process (GstDeinterleave * self, GstBuffer * buf)
|
|
|
|
{
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
GstFlowReturn ret = GST_FLOW_OK;
|
2012-01-30 15:40:19 +00:00
|
|
|
guint channels = GST_AUDIO_INFO_CHANNELS (&self->audio_info);
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
guint pads_pushed = 0, buffers_allocated = 0;
|
2012-01-30 15:40:19 +00:00
|
|
|
guint nframes =
|
|
|
|
gst_buffer_get_size (buf) / channels /
|
|
|
|
(GST_AUDIO_INFO_WIDTH (&self->audio_info) / 8);
|
|
|
|
guint bufsize = nframes * (GST_AUDIO_INFO_WIDTH (&self->audio_info) / 8);
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
guint i;
|
2007-01-07 22:03:54 +00:00
|
|
|
GList *srcs;
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
GstBuffer **buffers_out = g_new0 (GstBuffer *, channels);
|
|
|
|
guint8 *in, *out;
|
2012-01-30 15:40:19 +00:00
|
|
|
GstMapInfo read_info;
|
2013-07-01 09:37:00 +00:00
|
|
|
GList *pending_events, *l;
|
2012-01-30 15:40:19 +00:00
|
|
|
|
2008-05-17 19:39:53 +00:00
|
|
|
/* Send any pending events to all src pads */
|
|
|
|
GST_OBJECT_LOCK (self);
|
2013-07-01 09:37:00 +00:00
|
|
|
pending_events = self->pending_events;
|
|
|
|
self->pending_events = NULL;
|
|
|
|
GST_OBJECT_UNLOCK (self);
|
|
|
|
|
|
|
|
if (pending_events) {
|
2008-05-17 19:39:53 +00:00
|
|
|
GstEvent *event;
|
|
|
|
|
|
|
|
GST_DEBUG_OBJECT (self, "Sending pending events to all src pads");
|
2013-07-01 09:37:00 +00:00
|
|
|
for (l = pending_events; l; l = l->next) {
|
|
|
|
event = l->data;
|
2008-05-17 19:39:53 +00:00
|
|
|
for (srcs = self->srcpads; srcs != NULL; srcs = srcs->next)
|
|
|
|
gst_pad_push_event (GST_PAD (srcs->data), gst_event_ref (event));
|
|
|
|
gst_event_unref (event);
|
|
|
|
}
|
2013-07-01 09:37:00 +00:00
|
|
|
g_list_free (pending_events);
|
2008-05-17 19:39:53 +00:00
|
|
|
}
|
2013-07-01 09:37:00 +00:00
|
|
|
|
|
|
|
gst_buffer_map (buf, &read_info, GST_MAP_READ);
|
2008-05-17 19:39:53 +00:00
|
|
|
|
gst/interleave/: Split definitions into separate header files for better documentation generation.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.h:
* gst/interleave/interleave.h:
* gst/interleave/plugin.h:
Split definitions into separate header files for better documentation
generation.
* gst/interleave/deinterleave.c: (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_sink_setcaps),
(gst_deinterleave_process):
Don't use alloca, allow caps changes as long as the number of channels
does not change, don't use g_warning, return NOT_NEGOTIATED as early
as possible and some other cleanup.
* gst/interleave/interleave.c: (gst_interleave_base_init),
(gst_interleave_class_init):
Do some random cleanup.
* tests/check/Makefile.am:
* tests/check/elements/deinterleave.c: (GST_START_TEST),
(deinterleave_chain_func), (deinterleave_pad_added),
(deinterleave_suite):
Add unit tests for the deinterleave element.
2008-05-14 07:32:44 +00:00
|
|
|
/* Allocate buffers */
|
2007-03-22 22:14:29 +00:00
|
|
|
for (srcs = self->srcpads, i = 0; srcs; srcs = srcs->next, i++) {
|
2012-03-15 12:36:17 +00:00
|
|
|
buffers_out[i] = gst_buffer_new_allocate (NULL, bufsize, NULL);
|
2007-01-07 22:03:54 +00:00
|
|
|
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
/* Make sure we got a correct buffer. The only other case we allow
|
|
|
|
* here is an unliked pad */
|
2012-01-30 15:40:19 +00:00
|
|
|
if (!buffers_out[i])
|
2007-01-07 22:03:54 +00:00
|
|
|
goto alloc_buffer_failed;
|
2016-03-16 18:18:41 +00:00
|
|
|
else if (buffers_out[i]
|
|
|
|
&& gst_buffer_get_size (buffers_out[i]) != bufsize)
|
2007-01-07 22:03:54 +00:00
|
|
|
goto alloc_buffer_bad_size;
|
2007-01-13 19:12:32 +00:00
|
|
|
|
gst/interleave/: Split definitions into separate header files for better documentation generation.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.h:
* gst/interleave/interleave.h:
* gst/interleave/plugin.h:
Split definitions into separate header files for better documentation
generation.
* gst/interleave/deinterleave.c: (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_sink_setcaps),
(gst_deinterleave_process):
Don't use alloca, allow caps changes as long as the number of channels
does not change, don't use g_warning, return NOT_NEGOTIATED as early
as possible and some other cleanup.
* gst/interleave/interleave.c: (gst_interleave_base_init),
(gst_interleave_class_init):
Do some random cleanup.
* tests/check/Makefile.am:
* tests/check/elements/deinterleave.c: (GST_START_TEST),
(deinterleave_chain_func), (deinterleave_pad_added),
(deinterleave_suite):
Add unit tests for the deinterleave element.
2008-05-14 07:32:44 +00:00
|
|
|
if (buffers_out[i]) {
|
2012-01-30 15:40:19 +00:00
|
|
|
gst_buffer_copy_into (buffers_out[i], buf, GST_BUFFER_COPY_METADATA, 0,
|
|
|
|
-1);
|
gst/interleave/: Split definitions into separate header files for better documentation generation.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.h:
* gst/interleave/interleave.h:
* gst/interleave/plugin.h:
Split definitions into separate header files for better documentation
generation.
* gst/interleave/deinterleave.c: (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_sink_setcaps),
(gst_deinterleave_process):
Don't use alloca, allow caps changes as long as the number of channels
does not change, don't use g_warning, return NOT_NEGOTIATED as early
as possible and some other cleanup.
* gst/interleave/interleave.c: (gst_interleave_base_init),
(gst_interleave_class_init):
Do some random cleanup.
* tests/check/Makefile.am:
* tests/check/elements/deinterleave.c: (GST_START_TEST),
(deinterleave_chain_func), (deinterleave_pad_added),
(deinterleave_suite):
Add unit tests for the deinterleave element.
2008-05-14 07:32:44 +00:00
|
|
|
buffers_allocated++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
/* Return NOT_LINKED if no pad was linked */
|
gst/interleave/: Split definitions into separate header files for better documentation generation.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.h:
* gst/interleave/interleave.h:
* gst/interleave/plugin.h:
Split definitions into separate header files for better documentation
generation.
* gst/interleave/deinterleave.c: (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_sink_setcaps),
(gst_deinterleave_process):
Don't use alloca, allow caps changes as long as the number of channels
does not change, don't use g_warning, return NOT_NEGOTIATED as early
as possible and some other cleanup.
* gst/interleave/interleave.c: (gst_interleave_base_init),
(gst_interleave_class_init):
Do some random cleanup.
* tests/check/Makefile.am:
* tests/check/elements/deinterleave.c: (GST_START_TEST),
(deinterleave_chain_func), (deinterleave_pad_added),
(deinterleave_suite):
Add unit tests for the deinterleave element.
2008-05-14 07:32:44 +00:00
|
|
|
if (!buffers_allocated) {
|
2008-05-17 19:39:53 +00:00
|
|
|
GST_WARNING_OBJECT (self,
|
|
|
|
"Couldn't allocate any buffers because no pad was linked");
|
gst/interleave/: Split definitions into separate header files for better documentation generation.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.h:
* gst/interleave/interleave.h:
* gst/interleave/plugin.h:
Split definitions into separate header files for better documentation
generation.
* gst/interleave/deinterleave.c: (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_sink_setcaps),
(gst_deinterleave_process):
Don't use alloca, allow caps changes as long as the number of channels
does not change, don't use g_warning, return NOT_NEGOTIATED as early
as possible and some other cleanup.
* gst/interleave/interleave.c: (gst_interleave_base_init),
(gst_interleave_class_init):
Do some random cleanup.
* tests/check/Makefile.am:
* tests/check/elements/deinterleave.c: (GST_START_TEST),
(deinterleave_chain_func), (deinterleave_pad_added),
(deinterleave_suite):
Add unit tests for the deinterleave element.
2008-05-14 07:32:44 +00:00
|
|
|
ret = GST_FLOW_NOT_LINKED;
|
|
|
|
goto done;
|
2007-01-07 22:03:54 +00:00
|
|
|
}
|
|
|
|
|
gst/interleave/: Split definitions into separate header files for better documentation generation.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.h:
* gst/interleave/interleave.h:
* gst/interleave/plugin.h:
Split definitions into separate header files for better documentation
generation.
* gst/interleave/deinterleave.c: (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_sink_setcaps),
(gst_deinterleave_process):
Don't use alloca, allow caps changes as long as the number of channels
does not change, don't use g_warning, return NOT_NEGOTIATED as early
as possible and some other cleanup.
* gst/interleave/interleave.c: (gst_interleave_base_init),
(gst_interleave_class_init):
Do some random cleanup.
* tests/check/Makefile.am:
* tests/check/elements/deinterleave.c: (GST_START_TEST),
(deinterleave_chain_func), (deinterleave_pad_added),
(deinterleave_suite):
Add unit tests for the deinterleave element.
2008-05-14 07:32:44 +00:00
|
|
|
/* deinterleave */
|
2007-03-22 22:14:29 +00:00
|
|
|
for (srcs = self->srcpads, i = 0; srcs; srcs = srcs->next, i++) {
|
2007-01-07 22:03:54 +00:00
|
|
|
GstPad *pad = (GstPad *) srcs->data;
|
2012-01-30 15:40:19 +00:00
|
|
|
GstMapInfo write_info;
|
|
|
|
|
|
|
|
in = (guint8 *) read_info.data;
|
|
|
|
in += i * (GST_AUDIO_INFO_WIDTH (&self->audio_info) / 8);
|
2007-01-07 22:03:54 +00:00
|
|
|
if (buffers_out[i]) {
|
2012-01-30 15:40:19 +00:00
|
|
|
gst_buffer_map (buffers_out[i], &write_info, GST_MAP_WRITE);
|
|
|
|
out = (guint8 *) write_info.data;
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
self->func (out, in, channels, nframes);
|
2012-01-30 15:40:19 +00:00
|
|
|
gst_buffer_unmap (buffers_out[i], &write_info);
|
|
|
|
|
2007-01-07 22:03:54 +00:00
|
|
|
ret = gst_pad_push (pad, buffers_out[i]);
|
|
|
|
buffers_out[i] = NULL;
|
|
|
|
if (ret == GST_FLOW_OK)
|
|
|
|
pads_pushed++;
|
|
|
|
else if (ret == GST_FLOW_NOT_LINKED)
|
|
|
|
ret = GST_FLOW_OK;
|
|
|
|
else
|
|
|
|
goto push_failed;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
/* Return NOT_LINKED if no pad was linked */
|
2007-01-07 22:03:54 +00:00
|
|
|
if (!pads_pushed)
|
|
|
|
ret = GST_FLOW_NOT_LINKED;
|
|
|
|
|
2012-10-03 17:51:45 +00:00
|
|
|
GST_DEBUG_OBJECT (self, "Pushed on %d pads", pads_pushed);
|
|
|
|
|
gst/interleave/: Split definitions into separate header files for better documentation generation.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.h:
* gst/interleave/interleave.h:
* gst/interleave/plugin.h:
Split definitions into separate header files for better documentation
generation.
* gst/interleave/deinterleave.c: (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_sink_setcaps),
(gst_deinterleave_process):
Don't use alloca, allow caps changes as long as the number of channels
does not change, don't use g_warning, return NOT_NEGOTIATED as early
as possible and some other cleanup.
* gst/interleave/interleave.c: (gst_interleave_base_init),
(gst_interleave_class_init):
Do some random cleanup.
* tests/check/Makefile.am:
* tests/check/elements/deinterleave.c: (GST_START_TEST),
(deinterleave_chain_func), (deinterleave_pad_added),
(deinterleave_suite):
Add unit tests for the deinterleave element.
2008-05-14 07:32:44 +00:00
|
|
|
done:
|
2012-01-30 15:40:19 +00:00
|
|
|
gst_buffer_unmap (buf, &read_info);
|
2007-03-22 22:14:29 +00:00
|
|
|
gst_buffer_unref (buf);
|
gst/interleave/: Split definitions into separate header files for better documentation generation.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.h:
* gst/interleave/interleave.h:
* gst/interleave/plugin.h:
Split definitions into separate header files for better documentation
generation.
* gst/interleave/deinterleave.c: (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_sink_setcaps),
(gst_deinterleave_process):
Don't use alloca, allow caps changes as long as the number of channels
does not change, don't use g_warning, return NOT_NEGOTIATED as early
as possible and some other cleanup.
* gst/interleave/interleave.c: (gst_interleave_base_init),
(gst_interleave_class_init):
Do some random cleanup.
* tests/check/Makefile.am:
* tests/check/elements/deinterleave.c: (GST_START_TEST),
(deinterleave_chain_func), (deinterleave_pad_added),
(deinterleave_suite):
Add unit tests for the deinterleave element.
2008-05-14 07:32:44 +00:00
|
|
|
g_free (buffers_out);
|
2007-01-07 22:03:54 +00:00
|
|
|
return ret;
|
|
|
|
|
|
|
|
alloc_buffer_failed:
|
|
|
|
{
|
2007-03-22 22:14:29 +00:00
|
|
|
GST_WARNING ("gst_pad_alloc_buffer() returned %s", gst_flow_get_name (ret));
|
2007-01-07 22:03:54 +00:00
|
|
|
goto clean_buffers;
|
|
|
|
|
|
|
|
}
|
|
|
|
alloc_buffer_bad_size:
|
|
|
|
{
|
|
|
|
GST_WARNING ("called alloc_buffer(), but didn't get requested bytes");
|
|
|
|
ret = GST_FLOW_NOT_NEGOTIATED;
|
|
|
|
goto clean_buffers;
|
|
|
|
}
|
|
|
|
push_failed:
|
|
|
|
{
|
2007-03-22 22:14:29 +00:00
|
|
|
GST_DEBUG ("push() failed, flow = %s", gst_flow_get_name (ret));
|
2007-01-07 22:03:54 +00:00
|
|
|
goto clean_buffers;
|
|
|
|
}
|
|
|
|
clean_buffers:
|
|
|
|
{
|
2012-01-30 15:40:19 +00:00
|
|
|
gst_buffer_unmap (buf, &read_info);
|
2007-03-22 22:14:29 +00:00
|
|
|
for (i = 0; i < channels; i++) {
|
2007-01-07 22:03:54 +00:00
|
|
|
if (buffers_out[i])
|
|
|
|
gst_buffer_unref (buffers_out[i]);
|
2007-03-22 22:14:29 +00:00
|
|
|
}
|
|
|
|
gst_buffer_unref (buf);
|
gst/interleave/: Split definitions into separate header files for better documentation generation.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.h:
* gst/interleave/interleave.h:
* gst/interleave/plugin.h:
Split definitions into separate header files for better documentation
generation.
* gst/interleave/deinterleave.c: (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_sink_setcaps),
(gst_deinterleave_process):
Don't use alloca, allow caps changes as long as the number of channels
does not change, don't use g_warning, return NOT_NEGOTIATED as early
as possible and some other cleanup.
* gst/interleave/interleave.c: (gst_interleave_base_init),
(gst_interleave_class_init):
Do some random cleanup.
* tests/check/Makefile.am:
* tests/check/elements/deinterleave.c: (GST_START_TEST),
(deinterleave_chain_func), (deinterleave_pad_added),
(deinterleave_suite):
Add unit tests for the deinterleave element.
2008-05-14 07:32:44 +00:00
|
|
|
g_free (buffers_out);
|
2007-01-07 22:03:54 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static GstFlowReturn
|
2012-01-30 15:40:19 +00:00
|
|
|
gst_deinterleave_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
|
2007-01-07 22:03:54 +00:00
|
|
|
{
|
2012-01-30 15:40:19 +00:00
|
|
|
GstDeinterleave *self = GST_DEINTERLEAVE (parent);
|
2007-01-07 22:03:54 +00:00
|
|
|
GstFlowReturn ret;
|
|
|
|
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
g_return_val_if_fail (self->func != NULL, GST_FLOW_NOT_NEGOTIATED);
|
2012-01-30 15:40:19 +00:00
|
|
|
g_return_val_if_fail (GST_AUDIO_INFO_WIDTH (&self->audio_info) > 0,
|
|
|
|
GST_FLOW_NOT_NEGOTIATED);
|
|
|
|
g_return_val_if_fail (GST_AUDIO_INFO_CHANNELS (&self->audio_info) > 0,
|
|
|
|
GST_FLOW_NOT_NEGOTIATED);
|
2007-01-07 22:03:54 +00:00
|
|
|
|
|
|
|
ret = gst_deinterleave_process (self, buffer);
|
|
|
|
|
|
|
|
if (ret != GST_FLOW_OK)
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
GST_DEBUG_OBJECT (self, "flow return: %s", gst_flow_get_name (ret));
|
2007-01-07 22:03:54 +00:00
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2012-01-30 15:40:19 +00:00
|
|
|
static GstStateChangeReturn
|
|
|
|
gst_deinterleave_change_state (GstElement * element, GstStateChange transition)
|
2007-01-07 22:03:54 +00:00
|
|
|
{
|
2012-01-30 15:40:19 +00:00
|
|
|
GstStateChangeReturn ret;
|
|
|
|
GstDeinterleave *self = GST_DEINTERLEAVE (element);
|
|
|
|
|
|
|
|
switch (transition) {
|
|
|
|
case GST_STATE_CHANGE_NULL_TO_READY:
|
|
|
|
break;
|
|
|
|
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
|
|
|
gst_deinterleave_remove_pads (self);
|
|
|
|
|
|
|
|
self->func = NULL;
|
|
|
|
|
|
|
|
if (self->pending_events) {
|
|
|
|
g_list_foreach (self->pending_events, (GFunc) gst_mini_object_unref,
|
|
|
|
NULL);
|
|
|
|
g_list_free (self->pending_events);
|
|
|
|
self->pending_events = NULL;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing.
Original commit message from CVS:
* gst/interleave/Makefile.am:
* gst/interleave/deinterleave.c: (deinterleave_24),
(gst_deinterleave_finalize), (gst_deinterleave_base_init),
(gst_deinterleave_class_init), (gst_deinterleave_init),
(gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps),
(gst_deinterleave_set_process_function),
(gst_deinterleave_sink_setcaps), (__remove_channels),
(__set_channels), (gst_deinterleave_getcaps),
(gst_deinterleave_process), (gst_deinterleave_chain),
(gst_deinterleave_sink_activate_push):
* gst/interleave/deinterleave.h:
Add support for all raw audio formats and provide better negotiation
if the caps are changing.
Don't allow changes of the channel positions and set the position of
the corresponding channel on the src pad caps.
General cleanup and smaller bugfixes.
* tests/check/elements/deinterleave.c: (float_buffer_check_probe):
Check the channel positions on the output buffer caps.
2008-05-16 21:56:24 +00:00
|
|
|
}
|
2007-01-07 22:03:54 +00:00
|
|
|
|
2012-01-30 15:40:19 +00:00
|
|
|
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
|
2007-01-07 22:03:54 +00:00
|
|
|
|
2012-01-30 15:40:19 +00:00
|
|
|
switch (transition) {
|
|
|
|
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
|
|
|
|
break;
|
|
|
|
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
|
|
|
gst_deinterleave_remove_pads (self);
|
|
|
|
|
|
|
|
self->func = NULL;
|
|
|
|
|
|
|
|
if (self->pending_events) {
|
|
|
|
g_list_foreach (self->pending_events, (GFunc) gst_mini_object_unref,
|
|
|
|
NULL);
|
|
|
|
g_list_free (self->pending_events);
|
|
|
|
self->pending_events = NULL;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case GST_STATE_CHANGE_READY_TO_NULL:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return ret;
|
2007-01-07 22:03:54 +00:00
|
|
|
}
|