summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Kost <ensonic@users.sf.net>2010-01-31 22:16:18 +0200
committerStefan Kost <ensonic@users.sf.net>2010-01-31 22:25:51 +0200
commit6bff8711d0e087e8b20507dd92c25850cdff3c18 (patch)
tree61649ff52c73cf3d827b463a037dbea11f934a00
parentb3ac421b96eacbd13c74c64f446247a3d553f4b5 (diff)
signalprocessor: use the gst-controller, add some basic timestamping
Atleast for FX we now have timestamps and can sync the controller. Still need timestamps for sources.
-rw-r--r--gst-libs/gst/signalprocessor/Makefile.am11
-rw-r--r--gst-libs/gst/signalprocessor/gstsignalprocessor.c45
2 files changed, 53 insertions, 3 deletions
diff --git a/gst-libs/gst/signalprocessor/Makefile.am b/gst-libs/gst/signalprocessor/Makefile.am
index 5ec73f113..a9f2f70ec 100644
--- a/gst-libs/gst/signalprocessor/Makefile.am
+++ b/gst-libs/gst/signalprocessor/Makefile.am
@@ -4,7 +4,12 @@ libgstsignalprocessor_@GST_MAJORMINOR@includedir = $(includedir)/gstreamer-@GST_
4libgstsignalprocessor_@GST_MAJORMINOR@include_HEADERS = gstsignalprocessor.h 4libgstsignalprocessor_@GST_MAJORMINOR@include_HEADERS = gstsignalprocessor.h
5 5
6libgstsignalprocessor_@GST_MAJORMINOR@_la_SOURCES = gstsignalprocessor.c 6libgstsignalprocessor_@GST_MAJORMINOR@_la_SOURCES = gstsignalprocessor.c
7libgstsignalprocessor_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) 7libgstsignalprocessor_@GST_MAJORMINOR@_la_CFLAGS = \
8libgstsignalprocessor_@GST_MAJORMINOR@_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) -lgstaudio-@GST_MAJORMINOR@ 8 $(GST_PLUGINS_BASE_CFLAGS) \
9libgstsignalprocessor_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS) 9 $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS)
10libgstsignalprocessor_@GST_MAJORMINOR@_la_LIBADD = \
11 $(GST_PLUGINS_BASE_LIBS) -lgstaudio-@GST_MAJORMINOR@ \
12 $(GST_CONTROLLER_LIBS) $(GST_LIBS)
13libgstsignalprocessor_@GST_MAJORMINOR@_la_LDFLAGS = \
14 $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
10 15
diff --git a/gst-libs/gst/signalprocessor/gstsignalprocessor.c b/gst-libs/gst/signalprocessor/gstsignalprocessor.c
index eecabd954..bae230e5f 100644
--- a/gst-libs/gst/signalprocessor/gstsignalprocessor.c
+++ b/gst-libs/gst/signalprocessor/gstsignalprocessor.c
@@ -44,6 +44,7 @@
44#include <stdlib.h> 44#include <stdlib.h>
45#include <string.h> 45#include <string.h>
46 46
47#include <gst/controller/gstcontroller.h>
47#include <gst/audio/audio.h> 48#include <gst/audio/audio.h>
48#include "gstsignalprocessor.h" 49#include "gstsignalprocessor.h"
49 50
@@ -576,6 +577,15 @@ gst_signal_processor_event (GstPad * pad, GstEvent * event)
576 return ret; 577 return ret;
577} 578}
578 579
580/*
581 * gst_signal_processor_prepare:
582 * @self: the element
583 * nframes: wanted sample frames
584 *
585 * Checks if wan
586 *
587 * Returns: available sample frames
588 */
579static guint 589static guint
580gst_signal_processor_prepare (GstSignalProcessor * self, guint nframes) 590gst_signal_processor_prepare (GstSignalProcessor * self, guint nframes)
581{ 591{
@@ -584,6 +594,8 @@ gst_signal_processor_prepare (GstSignalProcessor * self, guint nframes)
584 GList *sinks, *srcs; 594 GList *sinks, *srcs;
585 guint samples_avail = nframes; 595 guint samples_avail = nframes;
586 guint i, in_group_index = 0, out_group_index = 0; 596 guint i, in_group_index = 0, out_group_index = 0;
597 gboolean is_gap = FALSE;
598 GstClockTime ts, tss = GST_CLOCK_TIME_NONE, tse = GST_CLOCK_TIME_NONE;
587 599
588 klass = GST_SIGNAL_PROCESSOR_GET_CLASS (self); 600 klass = GST_SIGNAL_PROCESSOR_GET_CLASS (self);
589 601
@@ -617,8 +629,32 @@ gst_signal_processor_prepare (GstSignalProcessor * self, guint nframes)
617 } 629 }
618 } 630 }
619 631
632 GST_LOG_OBJECT (self, "want %u samples, have %u samples", nframes,
633 samples_avail);
634
620 /* FIXME: return if samples_avail==0 ? */ 635 /* FIXME: return if samples_avail==0 ? */
621 636
637 if ((sinks = elem->sinkpads)) {
638 is_gap = TRUE;
639 while (sinks) {
640 GstSignalProcessorPad *sinkpad = (GstSignalProcessorPad *) sinks->data;
641
642 is_gap &= GST_BUFFER_FLAG_IS_SET (sinkpad->pen, GST_BUFFER_FLAG_GAP);
643 ts = GST_BUFFER_TIMESTAMP (sinkpad->pen);
644 if (GST_CLOCK_TIME_IS_VALID (ts)) {
645 tss = !GST_CLOCK_TIME_IS_VALID (tss) ? ts : MIN (tss, ts);
646 tse = !GST_CLOCK_TIME_IS_VALID (tse) ? ts : MAX (tse, ts);
647 }
648 sinks = sinks->next;
649 }
650 ts = (tss == tse) ? tss : GST_CLOCK_TIME_NONE;
651 GST_LOG_OBJECT (self, "is gap: %d, tss %" GST_TIME_FORMAT ", tse %"
652 GST_TIME_FORMAT, is_gap, GST_TIME_ARGS (tss), GST_TIME_ARGS (tse));
653 } else {
654 /* FIXME: calculate own timestamps */
655 ts = GST_CLOCK_TIME_NONE;
656 }
657
622 /* now assign output buffers. we can avoid allocation by reusing input 658 /* now assign output buffers. we can avoid allocation by reusing input
623 buffers, but only if process() can work in place, and if the input buffer 659 buffers, but only if process() can work in place, and if the input buffer
624 is the exact size of the number of samples we are processing. */ 660 is the exact size of the number of samples we are processing. */
@@ -682,9 +718,18 @@ gst_signal_processor_prepare (GstSignalProcessor * self, guint nframes)
682 self->pending_out++; 718 self->pending_out++;
683 } 719 }
684 720
721 /* set time stamp */
722 GST_BUFFER_TIMESTAMP (srcpad->pen) = ts;
723 /* FIXME: handle gap flag ? */
724
685 srcs = srcs->next; 725 srcs = srcs->next;
686 } 726 }
687 727
728 /* update controlled parameters */
729 if (samples_avail && GST_CLOCK_TIME_IS_VALID (ts)) {
730 gst_object_sync_values ((GObject *) self, ts);
731 }
732
688 return samples_avail; 733 return samples_avail;
689} 734}
690 735