diff options
Diffstat (limited to 'gst/segmentclip/gstaudiosegmentclip.c')
-rw-r--r-- | gst/segmentclip/gstaudiosegmentclip.c | 71 |
1 files changed, 32 insertions, 39 deletions
diff --git a/gst/segmentclip/gstaudiosegmentclip.c b/gst/segmentclip/gstaudiosegmentclip.c index 93602c5d2..0022a892e 100644 --- a/gst/segmentclip/gstaudiosegmentclip.c +++ b/gst/segmentclip/gstaudiosegmentclip.c @@ -27,14 +27,12 @@ #include "gstaudiosegmentclip.h" static GstStaticPadTemplate sink_pad_template = - GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS - ("audio/x-raw-int, width=(int)[1,MAX], channels=(int)[1,MAX],rate=(int)[1,MAX]; audio/x-raw-float, width=(int)[1,MAX], channels=(int)[1,MAX],rate=(int)[1,MAX]")); +GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_AUDIO_CAPS_MAKE (GST_AUDIO_FORMATS_ALL))); static GstStaticPadTemplate src_pad_template = - GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS - ("audio/x-raw-int, width=(int)[1,MAX], channels=(int)[1,MAX],rate=(int)[1,MAX]; audio/x-raw-float, width=(int)[1,MAX], channels=(int)[1,MAX],rate=(int)[1,MAX]")); +GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_AUDIO_CAPS_MAKE (GST_AUDIO_FORMATS_ALL))); static void gst_audio_segment_clip_reset (GstSegmentClip * self); static GstFlowReturn gst_audio_segment_clip_clip_buffer (GstSegmentClip * self, @@ -45,29 +43,13 @@ static gboolean gst_audio_segment_clip_set_caps (GstSegmentClip * self, GST_DEBUG_CATEGORY_STATIC (gst_audio_segment_clip_debug); #define GST_CAT_DEFAULT gst_audio_segment_clip_debug -GST_BOILERPLATE (GstAudioSegmentClip, gst_audio_segment_clip, GstSegmentClip, +G_DEFINE_TYPE (GstAudioSegmentClip, gst_audio_segment_clip, GST_TYPE_SEGMENT_CLIP); static void -gst_audio_segment_clip_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_set_details_simple (element_class, - "Audio buffer segment clipper", - "Filter/Audio", - "Clips audio buffers to the configured segment", - "Sebastian Dröge <sebastian.droege@collabora.co.uk>"); - - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&sink_pad_template)); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&src_pad_template)); -} - -static void gst_audio_segment_clip_class_init (GstAudioSegmentClipClass * klass) { + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstSegmentClipClass *segment_clip_klass = GST_SEGMENT_CLIP_CLASS (klass); GST_DEBUG_CATEGORY_INIT (gst_audio_segment_clip_debug, "audiosegmentclip", 0, @@ -78,11 +60,21 @@ gst_audio_segment_clip_class_init (GstAudioSegmentClipClass * klass) GST_DEBUG_FUNCPTR (gst_audio_segment_clip_set_caps); segment_clip_klass->clip_buffer = GST_DEBUG_FUNCPTR (gst_audio_segment_clip_clip_buffer); + + gst_element_class_set_details_simple (element_class, + "Audio buffer segment clipper", + "Filter/Audio", + "Clips audio buffers to the configured segment", + "Sebastian Dröge <sebastian.droege@collabora.co.uk>"); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_pad_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_pad_template)); } static void -gst_audio_segment_clip_init (GstAudioSegmentClip * self, - GstAudioSegmentClipClass * g_class) +gst_audio_segment_clip_init (GstAudioSegmentClip * self) { } @@ -107,7 +99,7 @@ gst_audio_segment_clip_clip_buffer (GstSegmentClip * base, GstBuffer * buffer, GstClockTime duration = GST_BUFFER_DURATION (buffer); guint64 offset = GST_BUFFER_OFFSET (buffer); guint64 offset_end = GST_BUFFER_OFFSET_END (buffer); - guint size = GST_BUFFER_SIZE (buffer); + guint size = gst_buffer_get_size (buffer); if (!self->rate || !self->framesize) { GST_ERROR_OBJECT (self, "Not negotiated yet"); @@ -139,7 +131,7 @@ gst_audio_segment_clip_clip_buffer (GstSegmentClip * base, GstBuffer * buffer, if (segment->format == GST_FORMAT_TIME) { if (segment->rate >= 0) { if (segment->stop != -1 && timestamp >= segment->stop) - return GST_FLOW_UNEXPECTED; + return GST_FLOW_EOS; } else { if (!GST_CLOCK_TIME_IS_VALID (duration)) duration = @@ -147,18 +139,18 @@ gst_audio_segment_clip_clip_buffer (GstSegmentClip * base, GstBuffer * buffer, self->framesize * self->rate); if (segment->start != -1 && timestamp + duration <= segment->start) - return GST_FLOW_UNEXPECTED; + return GST_FLOW_EOS; } } else { if (segment->rate >= 0) { if (segment->stop != -1 && offset != -1 && offset >= segment->stop) - return GST_FLOW_UNEXPECTED; + return GST_FLOW_EOS; } else if (offset != -1 || offset_end != -1) { if (offset_end == -1) offset_end = offset + size / self->framesize; if (segment->start != -1 && offset_end <= segment->start) - return GST_FLOW_UNEXPECTED; + return GST_FLOW_EOS; } } } @@ -171,18 +163,19 @@ gst_audio_segment_clip_set_caps (GstSegmentClip * base, GstCaps * caps) { GstAudioSegmentClip *self = GST_AUDIO_SEGMENT_CLIP (base); gboolean ret; - GstStructure *s; + GstAudioInfo info; gint rate, channels, width; - s = gst_caps_get_structure (caps, 0); - - ret = gst_structure_get_int (s, "rate", &rate); - ret = ret && gst_structure_get_int (s, "channels", &channels); - ret = ret && gst_structure_get_int (s, "width", &width); + gst_audio_info_init (&info); + ret = gst_audio_info_from_caps (&info, caps); if (ret) { - GST_DEBUG_OBJECT (self, "Configured: rate %d channels %d width %d", rate, - channels, width); + rate = GST_AUDIO_INFO_RATE (&info); + channels = GST_AUDIO_INFO_CHANNELS (&info); + width = GST_AUDIO_INFO_WIDTH (&info); + + GST_DEBUG_OBJECT (self, "Configured: rate %d channels %d width %d", + rate, channels, width); self->rate = rate; self->framesize = (width / 8) * channels; } |