element, GstStateChange transition);
static gboolean gst_audio_decoder_sink_eventfunc (GstAudioDecoder * dec,
GstEvent * event);
+static gboolean gst_audio_decoder_src_eventfunc (GstAudioDecoder * dec,
+ GstEvent * event);
static gboolean gst_audio_decoder_sink_event (GstPad * pad, GstObject * parent,
GstEvent * event);
static gboolean gst_audio_decoder_src_event (GstPad * pad, GstObject * parent,
"Perform packet loss concealment (if supported)",
DEFAULT_PLC, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- audiodecoder_class->event =
+ audiodecoder_class->sink_event =
GST_DEBUG_FUNCPTR (gst_audio_decoder_sink_eventfunc);
+ audiodecoder_class->src_event =
+ GST_DEBUG_FUNCPTR (gst_audio_decoder_src_eventfunc);
}
static void
GST_DEBUG_OBJECT (dec, "received event %d, %s", GST_EVENT_TYPE (event),
GST_EVENT_TYPE_NAME (event));
- if (klass->event)
- ret = klass->event (dec, event);
+ if (klass->sink_event)
+ ret = klass->sink_event (dec, event);
else {
gst_event_unref (event);
ret = FALSE;
}
static gboolean
-gst_audio_decoder_src_event (GstPad * pad, GstObject * parent, GstEvent * event)
+gst_audio_decoder_src_eventfunc (GstAudioDecoder * dec, GstEvent * event)
{
- GstAudioDecoder *dec;
- gboolean res = FALSE;
-
- dec = GST_AUDIO_DECODER (parent);
-
- GST_DEBUG_OBJECT (dec, "received event %d, %s", GST_EVENT_TYPE (event),
- GST_EVENT_TYPE_NAME (event));
+ gboolean res;
switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_SEEK:
/* ... though a non-time seek can be aided as well */
/* First bring the requested format to time */
if (!(res =
- gst_pad_query_convert (pad, format, cur, GST_FORMAT_TIME, &tcur)))
+ gst_pad_query_convert (dec->srcpad, format, cur, GST_FORMAT_TIME,
+ &tcur)))
goto convert_error;
if (!(res =
- gst_pad_query_convert (pad, format, stop, GST_FORMAT_TIME,
+ gst_pad_query_convert (dec->srcpad, format, stop, GST_FORMAT_TIME,
&tstop)))
goto convert_error;
break;
}
default:
- res = gst_pad_event_default (pad, parent, event);
+ res = gst_pad_event_default (dec->srcpad, GST_OBJECT_CAST (dec), event);
break;
}
done:
}
}
+static gboolean
+gst_audio_decoder_src_event (GstPad * pad, GstObject * parent, GstEvent * event)
+{
+ GstAudioDecoder *dec;
+ GstAudioDecoderClass *klass;
+ gboolean ret;
+
+ dec = GST_AUDIO_DECODER (parent);
+ klass = GST_AUDIO_DECODER_GET_CLASS (dec);
+
+ GST_DEBUG_OBJECT (dec, "received event %d, %s", GST_EVENT_TYPE (event),
+ GST_EVENT_TYPE_NAME (event));
+
+ if (klass->src_event)
+ ret = klass->src_event (dec, event);
+ else {
+ gst_event_unref (event);
+ ret = FALSE;
+ }
+
+ return ret;
+}
+
/*
* gst_audio_encoded_audio_convert:
* @fmt: audio format of the encoded audio
* any pending samples and not yet returned decoded data.
* @hard indicates whether a FLUSH is being processed,
* or otherwise a DISCONT (or conceptually similar).
- * @event: Optional.
+ * @sink_event: Optional.
* Event handler on the sink pad. Subclasses should chain up to
* the parent implementation to invoke the default handler.
+ * @src_event: Optional.
+ * Event handler on the src pad. Subclasses should chain up to
+ * the parent implementation to invoke the default handler.
* @pre_push: Optional.
* Called just prior to pushing (encoded data) buffer downstream.
* Subclass has full discretionary access to buffer,
GstFlowReturn (*pre_push) (GstAudioDecoder *dec,
GstBuffer **buffer);
- gboolean (*event) (GstAudioDecoder *dec,
+ gboolean (*sink_event) (GstAudioDecoder *dec,
+ GstEvent *event);
+ gboolean (*src_event) (GstAudioDecoder *dec,
GstEvent *event);
gboolean (*open) (GstAudioDecoder *dec);