diff options
author | Stefan Kost <ensonic@users.sf.net> | 2010-01-31 22:16:18 +0200 |
---|---|---|
committer | Stefan Kost <ensonic@users.sf.net> | 2010-01-31 22:25:51 +0200 |
commit | 6bff8711d0e087e8b20507dd92c25850cdff3c18 (patch) | |
tree | 61649ff52c73cf3d827b463a037dbea11f934a00 | |
parent | b3ac421b96eacbd13c74c64f446247a3d553f4b5 (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.am | 11 | ||||
-rw-r--r-- | gst-libs/gst/signalprocessor/gstsignalprocessor.c | 45 |
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_ | |||
4 | libgstsignalprocessor_@GST_MAJORMINOR@include_HEADERS = gstsignalprocessor.h | 4 | libgstsignalprocessor_@GST_MAJORMINOR@include_HEADERS = gstsignalprocessor.h |
5 | 5 | ||
6 | libgstsignalprocessor_@GST_MAJORMINOR@_la_SOURCES = gstsignalprocessor.c | 6 | libgstsignalprocessor_@GST_MAJORMINOR@_la_SOURCES = gstsignalprocessor.c |
7 | libgstsignalprocessor_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) | 7 | libgstsignalprocessor_@GST_MAJORMINOR@_la_CFLAGS = \ |
8 | libgstsignalprocessor_@GST_MAJORMINOR@_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) -lgstaudio-@GST_MAJORMINOR@ | 8 | $(GST_PLUGINS_BASE_CFLAGS) \ |
9 | libgstsignalprocessor_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS) | 9 | $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) |
10 | libgstsignalprocessor_@GST_MAJORMINOR@_la_LIBADD = \ | ||
11 | $(GST_PLUGINS_BASE_LIBS) -lgstaudio-@GST_MAJORMINOR@ \ | ||
12 | $(GST_CONTROLLER_LIBS) $(GST_LIBS) | ||
13 | libgstsignalprocessor_@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 | */ | ||
579 | static guint | 589 | static guint |
580 | gst_signal_processor_prepare (GstSignalProcessor * self, guint nframes) | 590 | gst_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 | ||