audiodecoder: add method to set output caps

Add a method to configure the output caps. Subclasses can't use
gst_pad_set_caps() anymore because then we won't see the caps.
Unbreak the padtemplate registration, the GTypeClass that is configured in the
object during _init is not the right one, we need to use the klass passed as the
argument to the init function..
This commit is contained in:
Wim Taymans 2011-09-28 15:35:56 +02:00
parent 19346c2c3b
commit 19626cf27a
2 changed files with 49 additions and 8 deletions

View file

@ -287,9 +287,38 @@ static gboolean gst_audio_decoder_sink_query (GstPad * pad, GstQuery * query);
static const GstQueryType *gst_audio_decoder_get_query_types (GstPad * pad);
static void gst_audio_decoder_reset (GstAudioDecoder * dec, gboolean full);
static GstElementClass *parent_class = NULL;
static void gst_audio_decoder_class_init (GstAudioDecoderClass * klass);
static void gst_audio_decoder_init (GstAudioDecoder * dec,
GstAudioDecoderClass * klass);
GType
gst_audio_decoder_get_type (void)
{
static volatile gsize audio_decoder_type = 0;
if (g_once_init_enter (&audio_decoder_type)) {
GType _type;
static const GTypeInfo audio_decoder_info = {
sizeof (GstAudioDecoderClass),
NULL,
NULL,
(GClassInitFunc) gst_audio_decoder_class_init,
NULL,
NULL,
sizeof (GstAudioDecoder),
0,
(GInstanceInitFunc) gst_audio_decoder_init,
};
_type = g_type_register_static (GST_TYPE_ELEMENT,
"GstAudioDecoder", &audio_decoder_info, G_TYPE_FLAG_ABSTRACT);
g_once_init_leave (&audio_decoder_type, _type);
}
return audio_decoder_type;
}
#define gst_audio_decoder_parent_class parent_class
G_DEFINE_TYPE (GstAudioDecoder, gst_audio_decoder, GST_TYPE_ELEMENT);
static void
gst_audio_decoder_class_init (GstAudioDecoderClass * klass)
@ -333,9 +362,8 @@ gst_audio_decoder_class_init (GstAudioDecoderClass * klass)
}
static void
gst_audio_decoder_init (GstAudioDecoder * dec)
gst_audio_decoder_init (GstAudioDecoder * dec, GstAudioDecoderClass * klass)
{
GstAudioDecoderClass *klass = GST_AUDIO_DECODER_GET_CLASS (dec);
GstPadTemplate *pad_template;
GST_DEBUG_OBJECT (dec, "gst_audio_decoder_init");
@ -455,10 +483,18 @@ gst_audio_decoder_finalize (GObject * object)
G_OBJECT_CLASS (parent_class)->finalize (object);
}
/* automagically perform sanity checking of src caps;
* also extracts output data format */
/**
* gst_audio_decoder_set_outcaps:
* @dec: a #GstAudioDecoder
* @caps: #GstCaps
*
* Configure output @caps on the srcpad of @dec. Also perform
* sanity checking of @caps and extracts output data format
*
* Returns: %TRUE on success.
* */
gboolean
gst_audio_decoder_src_setcaps (GstAudioDecoder * dec, GstCaps * caps)
gst_audio_decoder_set_outcaps (GstAudioDecoder * dec, GstCaps * caps)
{
gboolean res = TRUE;
guint old_rate;
@ -486,6 +522,8 @@ gst_audio_decoder_src_setcaps (GstAudioDecoder * dec, GstCaps * caps)
done:
GST_AUDIO_DECODER_STREAM_UNLOCK (dec);
res = gst_pad_set_caps (dec->srcpad, caps);
gst_object_unref (dec);
return res;
@ -543,7 +581,7 @@ gst_audio_decoder_setup (GstAudioDecoder * dec)
gst_query_unref (query);
/* normalize to bool */
dec->priv->agg = ! !res;
dec->priv->agg = !!res;
}
/* mini aggregator combining output buffers into fewer larger ones,

View file

@ -234,6 +234,9 @@ struct _GstAudioDecoderClass
GType gst_audio_decoder_get_type (void);
gboolean gst_audio_decoder_set_outcaps (GstAudioDecoder * dec,
GstCaps * caps);
GstFlowReturn gst_audio_decoder_finish_frame (GstAudioDecoder * dec,
GstBuffer * buf, gint frames);