mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-01 21:18:52 +00:00
Fix longstanding bug with esdsink seeking. esdsink still needs a clock, though.
Original commit message from CVS: Fix longstanding bug with esdsink seeking. esdsink still needs a clock, though.
This commit is contained in:
parent
0bad514d94
commit
7a95d860f1
2 changed files with 58 additions and 0 deletions
|
@ -89,6 +89,7 @@ static void gst_esdsink_close_audio (GstEsdsink *sink);
|
||||||
static GstElementStateReturn gst_esdsink_change_state (GstElement *element);
|
static GstElementStateReturn gst_esdsink_change_state (GstElement *element);
|
||||||
static GstPadLinkReturn gst_esdsink_sinkconnect (GstPad *pad, GstCaps *caps);
|
static GstPadLinkReturn gst_esdsink_sinkconnect (GstPad *pad, GstCaps *caps);
|
||||||
|
|
||||||
|
static void gst_esdsink_set_clock (GstElement *element, GstClock *clock);
|
||||||
static void gst_esdsink_chain (GstPad *pad, GstBuffer *buf);
|
static void gst_esdsink_chain (GstPad *pad, GstBuffer *buf);
|
||||||
|
|
||||||
static void gst_esdsink_set_property (GObject *object, guint prop_id,
|
static void gst_esdsink_set_property (GObject *object, guint prop_id,
|
||||||
|
@ -142,6 +143,8 @@ gst_esdsink_class_init (GstEsdsinkClass *klass)
|
||||||
gobject_class->get_property = gst_esdsink_get_property;
|
gobject_class->get_property = gst_esdsink_get_property;
|
||||||
|
|
||||||
gstelement_class->change_state = gst_esdsink_change_state;
|
gstelement_class->change_state = gst_esdsink_change_state;
|
||||||
|
gstelement_class->set_clock = gst_esdsink_set_clock;
|
||||||
|
//gstelement_class->get_clock = gst_esdsink_get_clock;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -153,6 +156,8 @@ gst_esdsink_init(GstEsdsink *esdsink)
|
||||||
gst_pad_set_chain_function(esdsink->sinkpad, GST_DEBUG_FUNCPTR(gst_esdsink_chain));
|
gst_pad_set_chain_function(esdsink->sinkpad, GST_DEBUG_FUNCPTR(gst_esdsink_chain));
|
||||||
gst_pad_set_link_function(esdsink->sinkpad, gst_esdsink_sinkconnect);
|
gst_pad_set_link_function(esdsink->sinkpad, gst_esdsink_sinkconnect);
|
||||||
|
|
||||||
|
GST_FLAG_SET (esdsink, GST_ELEMENT_EVENT_AWARE);
|
||||||
|
|
||||||
esdsink->mute = FALSE;
|
esdsink->mute = FALSE;
|
||||||
esdsink->fd = -1;
|
esdsink->fd = -1;
|
||||||
/* FIXME: get default from somewhere better than just putting them inline. */
|
/* FIXME: get default from somewhere better than just putting them inline. */
|
||||||
|
@ -187,6 +192,28 @@ gst_esdsink_sinkconnect (GstPad *pad, GstCaps *caps)
|
||||||
return GST_PAD_LINK_REFUSED;
|
return GST_PAD_LINK_REFUSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
static GstClock *
|
||||||
|
gst_esdsink_get_clock (GstElement *element)
|
||||||
|
{
|
||||||
|
GstEsdsink *esdsink;
|
||||||
|
|
||||||
|
esdsink = GET_ESDSINK (element);
|
||||||
|
|
||||||
|
return GST_CLOCK(esdsink->provided_clock);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_esdsink_set_clock (GstElement *element, GstClock *clock)
|
||||||
|
{
|
||||||
|
GstEsdsink *esdsink;
|
||||||
|
|
||||||
|
esdsink = GST_ESDSINK (element);
|
||||||
|
|
||||||
|
esdsink->clock = clock;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_esdsink_chain (GstPad *pad, GstBuffer *buf)
|
gst_esdsink_chain (GstPad *pad, GstBuffer *buf)
|
||||||
{
|
{
|
||||||
|
@ -199,6 +226,35 @@ gst_esdsink_chain (GstPad *pad, GstBuffer *buf)
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (GST_IS_EVENT(buf)){
|
||||||
|
GstEvent *event = GST_EVENT(buf);
|
||||||
|
|
||||||
|
g_print("got event\n");
|
||||||
|
|
||||||
|
switch(GST_EVENT_TYPE(event)){
|
||||||
|
case GST_EVENT_EOS:
|
||||||
|
break;
|
||||||
|
case GST_EVENT_DISCONTINUOUS:
|
||||||
|
{
|
||||||
|
gint64 value;
|
||||||
|
|
||||||
|
if (gst_event_discont_get_value (event, GST_FORMAT_TIME, &value)) {
|
||||||
|
if (!gst_clock_handle_discont (esdsink->clock, value)){
|
||||||
|
//gst_esdsink_clock_set_active (osssink->provided_clock, FALSE);
|
||||||
|
}
|
||||||
|
//esdsink->handled = 0;
|
||||||
|
}
|
||||||
|
//esdsink->resync = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
gst_pad_event_default(pad, event);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
gst_event_unref(event);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (GST_BUFFER_DATA (buf) != NULL) {
|
if (GST_BUFFER_DATA (buf) != NULL) {
|
||||||
if (!esdsink->mute && esdsink->fd >= 0) {
|
if (!esdsink->mute && esdsink->fd >= 0) {
|
||||||
GST_DEBUG ("esdsink: fd=%d data=%p size=%d",
|
GST_DEBUG ("esdsink: fd=%d data=%p size=%d",
|
||||||
|
|
|
@ -44,6 +44,8 @@ struct _GstEsdsink {
|
||||||
|
|
||||||
GstPad *sinkpad;
|
GstPad *sinkpad;
|
||||||
|
|
||||||
|
GstClock *clock;
|
||||||
|
|
||||||
gboolean mute;
|
gboolean mute;
|
||||||
int fd;
|
int fd;
|
||||||
gint format;
|
gint format;
|
||||||
|
|
Loading…
Reference in a new issue