mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
gst-libs/gst/audio/gstbaseaudiosink.c
Original commit message from CVS: 2007-01-12 Andy Wingo <wingo@pobox.com> * gst-libs/gst/audio/gstbaseaudiosink.c (gst_base_audio_sink_fixate): Implement, stolen from baseaudiosrc. (gst_base_audio_sink_activate_pull): Remove the handwavey nego stuff, as the base class handles this now. Actually tell the ring buffer to start. (gst_base_audio_sink_callback): Cast the ring buffer correctly. How did this work before? Maybe I'm not as awesome a programmer as I think. * gst-libs/gst/audio/gstbaseaudiosrc.c (gst_base_audio_src_fixate): Rework as a basesrc vmethod instead of a pad function.
This commit is contained in:
parent
b93a9176db
commit
d853b23819
3 changed files with 49 additions and 29 deletions
15
ChangeLog
15
ChangeLog
|
@ -1,3 +1,18 @@
|
||||||
|
2007-01-12 Andy Wingo <wingo@pobox.com>
|
||||||
|
|
||||||
|
* gst-libs/gst/audio/gstbaseaudiosink.c
|
||||||
|
(gst_base_audio_sink_fixate): Implement, stolen from baseaudiosrc.
|
||||||
|
(gst_base_audio_sink_activate_pull): Remove the handwavey nego
|
||||||
|
stuff, as the base class handles this now. Actually tell the ring
|
||||||
|
buffer to start.
|
||||||
|
(gst_base_audio_sink_callback): Cast the ring buffer correctly.
|
||||||
|
How did this work before? Maybe I'm not as awesome a programmer as
|
||||||
|
I think.
|
||||||
|
|
||||||
|
* gst-libs/gst/audio/gstbaseaudiosrc.c
|
||||||
|
(gst_base_audio_src_fixate): Rework as a basesrc vmethod instead
|
||||||
|
of a pad function.
|
||||||
|
|
||||||
2007-01-12 Tim-Philipp Müller <tim at centricular dot net>
|
2007-01-12 Tim-Philipp Müller <tim at centricular dot net>
|
||||||
|
|
||||||
* gst-libs/gst/utils/missing-plugins.c: (copy_and_clean_caps):
|
* gst-libs/gst/utils/missing-plugins.c: (copy_and_clean_caps):
|
||||||
|
|
|
@ -104,6 +104,7 @@ static void gst_base_audio_sink_get_times (GstBaseSink * bsink,
|
||||||
GstBuffer * buffer, GstClockTime * start, GstClockTime * end);
|
GstBuffer * buffer, GstClockTime * start, GstClockTime * end);
|
||||||
static gboolean gst_base_audio_sink_setcaps (GstBaseSink * bsink,
|
static gboolean gst_base_audio_sink_setcaps (GstBaseSink * bsink,
|
||||||
GstCaps * caps);
|
GstCaps * caps);
|
||||||
|
static void gst_base_audio_sink_fixate (GstBaseSink * bsink, GstCaps * caps);
|
||||||
|
|
||||||
/* static guint gst_base_audio_sink_signals[LAST_SIGNAL] = { 0 }; */
|
/* static guint gst_base_audio_sink_signals[LAST_SIGNAL] = { 0 }; */
|
||||||
|
|
||||||
|
@ -155,6 +156,7 @@ gst_base_audio_sink_class_init (GstBaseAudioSinkClass * klass)
|
||||||
gstbasesink_class->get_times =
|
gstbasesink_class->get_times =
|
||||||
GST_DEBUG_FUNCPTR (gst_base_audio_sink_get_times);
|
GST_DEBUG_FUNCPTR (gst_base_audio_sink_get_times);
|
||||||
gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_base_audio_sink_setcaps);
|
gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_base_audio_sink_setcaps);
|
||||||
|
gstbasesink_class->fixate = GST_DEBUG_FUNCPTR (gst_base_audio_sink_fixate);
|
||||||
gstbasesink_class->async_play =
|
gstbasesink_class->async_play =
|
||||||
GST_DEBUG_FUNCPTR (gst_base_audio_sink_async_play);
|
GST_DEBUG_FUNCPTR (gst_base_audio_sink_async_play);
|
||||||
gstbasesink_class->activate_pull =
|
gstbasesink_class->activate_pull =
|
||||||
|
@ -375,6 +377,32 @@ acquire_error:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_base_audio_sink_fixate (GstBaseSink * bsink, GstCaps * caps)
|
||||||
|
{
|
||||||
|
GstStructure *s;
|
||||||
|
gint width, depth;
|
||||||
|
|
||||||
|
s = gst_caps_get_structure (caps, 0);
|
||||||
|
|
||||||
|
/* fields for all formats */
|
||||||
|
gst_structure_fixate_field_nearest_int (s, "rate", 44100);
|
||||||
|
gst_structure_fixate_field_nearest_int (s, "channels", 2);
|
||||||
|
gst_structure_fixate_field_nearest_int (s, "width", 16);
|
||||||
|
|
||||||
|
/* fields for int */
|
||||||
|
if (gst_structure_has_field (s, "depth")) {
|
||||||
|
gst_structure_get_int (s, "width", &width);
|
||||||
|
/* round width to nearest multiple of 8 for the depth */
|
||||||
|
depth = GST_ROUND_UP_8 (width);
|
||||||
|
gst_structure_fixate_field_nearest_int (s, "depth", depth);
|
||||||
|
}
|
||||||
|
if (gst_structure_has_field (s, "signed"))
|
||||||
|
gst_structure_fixate_field_boolean (s, "signed", TRUE);
|
||||||
|
if (gst_structure_has_field (s, "endianness"))
|
||||||
|
gst_structure_fixate_field_nearest_int (s, "endianness", G_BYTE_ORDER);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_base_audio_sink_get_times (GstBaseSink * bsink, GstBuffer * buffer,
|
gst_base_audio_sink_get_times (GstBaseSink * bsink, GstBuffer * buffer,
|
||||||
GstClockTime * start, GstClockTime * end)
|
GstClockTime * start, GstClockTime * end)
|
||||||
|
@ -824,29 +852,9 @@ gst_base_audio_sink_activate_pull (GstBaseSink * basesink, gboolean active)
|
||||||
GstBaseAudioSink *sink = GST_BASE_AUDIO_SINK (basesink);
|
GstBaseAudioSink *sink = GST_BASE_AUDIO_SINK (basesink);
|
||||||
|
|
||||||
if (active) {
|
if (active) {
|
||||||
GstCaps *sinkcaps, *peercaps, *caps;
|
|
||||||
|
|
||||||
gst_ring_buffer_set_callback (sink->ringbuffer,
|
gst_ring_buffer_set_callback (sink->ringbuffer,
|
||||||
gst_base_audio_sink_callback, sink);
|
gst_base_audio_sink_callback, sink);
|
||||||
|
ret = gst_ring_buffer_start (sink->ringbuffer);
|
||||||
/* need to spawn a thread to start pulling. that's the ring buffer thread,
|
|
||||||
which is started in ring_buffer_acquire(), which is called due to a sink
|
|
||||||
setcaps(). So we need to setcaps, which is tough because we don't know
|
|
||||||
exactly what caps we'll be getting. We can guess, though, and that's as
|
|
||||||
good as we're going to get without the user telling us explicitly e.g.
|
|
||||||
via a capsfilter before the sink. */
|
|
||||||
sinkcaps = gst_pad_get_caps (basesink->sinkpad);
|
|
||||||
peercaps = gst_pad_peer_get_caps (basesink->sinkpad);
|
|
||||||
caps = gst_caps_intersect (sinkcaps, peercaps);
|
|
||||||
gst_caps_unref (sinkcaps);
|
|
||||||
gst_caps_unref (peercaps);
|
|
||||||
gst_caps_truncate (caps);
|
|
||||||
gst_pad_fixate_caps (basesink->sinkpad, caps);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (sink, "initializing pull-mode ringbuffer with caps %"
|
|
||||||
GST_PTR_FORMAT, caps);
|
|
||||||
ret = gst_pad_set_caps (basesink->sinkpad, caps);
|
|
||||||
gst_caps_unref (caps);
|
|
||||||
} else {
|
} else {
|
||||||
gst_ring_buffer_set_callback (sink->ringbuffer, NULL, NULL);
|
gst_ring_buffer_set_callback (sink->ringbuffer, NULL, NULL);
|
||||||
/* stop thread */
|
/* stop thread */
|
||||||
|
@ -865,8 +873,8 @@ gst_base_audio_sink_callback (GstRingBuffer * rbuf, guint8 * data, guint len,
|
||||||
GstBuffer *buf;
|
GstBuffer *buf;
|
||||||
GstFlowReturn ret;
|
GstFlowReturn ret;
|
||||||
|
|
||||||
basesink = GST_BASE_SINK (data);
|
basesink = GST_BASE_SINK (user_data);
|
||||||
sink = GST_BASE_AUDIO_SINK (data);
|
sink = GST_BASE_AUDIO_SINK (user_data);
|
||||||
|
|
||||||
/* would be nice to arrange for pad_alloc_buffer to return data -- as it is we
|
/* would be nice to arrange for pad_alloc_buffer to return data -- as it is we
|
||||||
will copy twice, once into data, once into DMA */
|
will copy twice, once into data, once into DMA */
|
||||||
|
|
|
@ -67,8 +67,6 @@ static void gst_base_audio_src_set_property (GObject * object, guint prop_id,
|
||||||
static void gst_base_audio_src_get_property (GObject * object, guint prop_id,
|
static void gst_base_audio_src_get_property (GObject * object, guint prop_id,
|
||||||
GValue * value, GParamSpec * pspec);
|
GValue * value, GParamSpec * pspec);
|
||||||
|
|
||||||
static void gst_base_audio_src_fixate (GstPad * pad, GstCaps * caps);
|
|
||||||
|
|
||||||
static GstStateChangeReturn gst_base_audio_src_change_state (GstElement *
|
static GstStateChangeReturn gst_base_audio_src_change_state (GstElement *
|
||||||
element, GstStateChange transition);
|
element, GstStateChange transition);
|
||||||
|
|
||||||
|
@ -86,6 +84,7 @@ static gboolean gst_base_audio_src_event (GstBaseSrc * bsrc, GstEvent * event);
|
||||||
static void gst_base_audio_src_get_times (GstBaseSrc * bsrc,
|
static void gst_base_audio_src_get_times (GstBaseSrc * bsrc,
|
||||||
GstBuffer * buffer, GstClockTime * start, GstClockTime * end);
|
GstBuffer * buffer, GstClockTime * start, GstClockTime * end);
|
||||||
static gboolean gst_base_audio_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps);
|
static gboolean gst_base_audio_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps);
|
||||||
|
static void gst_base_audio_src_fixate (GstBaseSrc * bsrc, GstCaps * caps);
|
||||||
|
|
||||||
/* static guint gst_base_audio_src_signals[LAST_SIGNAL] = { 0 }; */
|
/* static guint gst_base_audio_src_signals[LAST_SIGNAL] = { 0 }; */
|
||||||
|
|
||||||
|
@ -136,6 +135,7 @@ gst_base_audio_src_class_init (GstBaseAudioSrcClass * klass)
|
||||||
gstbasesrc_class->create = GST_DEBUG_FUNCPTR (gst_base_audio_src_create);
|
gstbasesrc_class->create = GST_DEBUG_FUNCPTR (gst_base_audio_src_create);
|
||||||
gstbasesrc_class->check_get_range =
|
gstbasesrc_class->check_get_range =
|
||||||
GST_DEBUG_FUNCPTR (gst_base_audio_src_check_get_range);
|
GST_DEBUG_FUNCPTR (gst_base_audio_src_check_get_range);
|
||||||
|
gstbasesrc_class->fixate = GST_DEBUG_FUNCPTR (gst_base_audio_src_fixate);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -151,9 +151,6 @@ gst_base_audio_src_init (GstBaseAudioSrc * baseaudiosrc,
|
||||||
baseaudiosrc->clock = gst_audio_clock_new ("clock",
|
baseaudiosrc->clock = gst_audio_clock_new ("clock",
|
||||||
(GstAudioClockGetTimeFunc) gst_base_audio_src_get_time, baseaudiosrc);
|
(GstAudioClockGetTimeFunc) gst_base_audio_src_get_time, baseaudiosrc);
|
||||||
|
|
||||||
gst_pad_set_fixatecaps_function (GST_BASE_SRC_PAD (baseaudiosrc),
|
|
||||||
gst_base_audio_src_fixate);
|
|
||||||
|
|
||||||
/* we are always a live source */
|
/* we are always a live source */
|
||||||
gst_base_src_set_live (GST_BASE_SRC (baseaudiosrc), TRUE);
|
gst_base_src_set_live (GST_BASE_SRC (baseaudiosrc), TRUE);
|
||||||
/* we operate in time */
|
/* we operate in time */
|
||||||
|
@ -292,7 +289,7 @@ gst_base_audio_src_get_property (GObject * object, guint prop_id,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_base_audio_src_fixate (GstPad * pad, GstCaps * caps)
|
gst_base_audio_src_fixate (GstBaseSrc * bsrc, GstCaps * caps)
|
||||||
{
|
{
|
||||||
GstStructure *s;
|
GstStructure *s;
|
||||||
gint width, depth;
|
gint width, depth;
|
||||||
|
|
Loading…
Reference in a new issue