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:
David Schleef 2003-07-04 07:32:19 +00:00
parent 0bad514d94
commit 7a95d860f1
2 changed files with 58 additions and 0 deletions

View file

@ -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",

View file

@ -44,6 +44,8 @@ struct _GstEsdsink {
GstPad *sinkpad; GstPad *sinkpad;
GstClock *clock;
gboolean mute; gboolean mute;
int fd; int fd;
gint format; gint format;