patches/gst-plugins-good-04-selector.diff
author rohinis
Tue, 29 Nov 2011 17:32:55 +0000
branchs11express-2010-11
changeset 22234 c23e64da3e06
parent 17776 3fe9eb67326b
permissions -rw-r--r--
2011-11-29 Rohini S <[email protected]> * patches/Python26-22-audio.diff: Fixes CVE-2010-1634 * specs/SUNWPython26.spec: Fixes CR 7085446
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
     1
--- /dev/null	2008-12-16 15:34:15.000000000 +0800
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
     2
+++ gst-plugins-good-0.10.21/gst/selector/Makefile.am	2008-12-16 15:09:01.090359516 +0800
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
     3
@@ -0,0 +1,24 @@
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
     4
+glib_gen_prefix = gst_selector
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
     5
+glib_gen_basename = gstselector
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
     6
+
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
     7
+include $(top_srcdir)/common/gst-glib-gen.mak
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
     8
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
     9
+built_sources = gstselector-marshal.c
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    10
+built_headers = gstselector-marshal.h
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    11
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    12
+BUILT_SOURCES = $(built_sources) $(built_headers)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    13
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    14
+CLEANFILES = $(BUILT_SOURCES)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    15
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    16
+EXTRA_DIST = gstselector-marshal.list
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    17
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    18
+plugin_LTLIBRARIES = libgstselector.la
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    19
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    20
+libgstselector_la_SOURCES = gstselector.c gstinputselector.c gstoutputselector.c
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    21
+nodist_libgstselector_la_SOURCES = $(built_sources)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    22
+libgstselector_la_CFLAGS = $(GST_CFLAGS)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    23
+libgstselector_la_LIBADD =
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    24
+libgstselector_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS)
15812
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
    25
+libgstselector_la_LIBTOOLFLAGS = --tag=disable-static
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    26
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    27
+noinst_HEADERS = gstinputselector.h gstoutputselector.h 
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    28
--- /dev/null	2008-12-16 15:34:15.000000000 +0800
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
    29
+++ gst-plugins-good-0.10.21/gst/selector/gstinputselector.c	2008-12-16 15:09:01.091207753 +0800
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
    30
@@ -0,0 +1,1455 @@
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    31
+/* GStreamer
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    32
+ * Copyright (C) 2003 Julien Moutte <[email protected]>
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    33
+ * Copyright (C) 2005 Ronald S. Bultje <[email protected]>
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    34
+ * Copyright (C) 2005 Jan Schmidt <[email protected]>
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    35
+ * Copyright (C) 2007 Wim Taymans <[email protected]>
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    36
+ * Copyright (C) 2007 Andy Wingo <[email protected]>
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    37
+ * Copyright (C) 2008 Nokia Corporation. (contact <[email protected]>)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    38
+ *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    39
+ * This library is free software; you can redistribute it and/or
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    40
+ * modify it under the terms of the GNU Library General Public
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    41
+ * License as published by the Free Software Foundation; either
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    42
+ * version 2 of the License, or (at your option) any later version.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    43
+ *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    44
+ * This library is distributed in the hope that it will be useful,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    45
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    46
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    47
+ * Library General Public License for more details.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    48
+ *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    49
+ * You should have received a copy of the GNU Library General Public
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    50
+ * License along with this library; if not, write to the
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    51
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    52
+ * Boston, MA 02111-1307, USA.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    53
+ */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    54
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    55
+/**
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    56
+ * SECTION:element-input-selector
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    57
+ * @see_also: #GstOutputSelector
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    58
+ *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    59
+ * Direct one out of N input streams to the output pad.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    60
+ */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    61
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    62
+#ifdef HAVE_CONFIG_H
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    63
+#include "config.h"
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    64
+#endif
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    65
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    66
+#include <string.h>
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    67
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    68
+#include "gstinputselector.h"
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    69
+#include "gstselector-marshal.h"
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    70
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    71
+GST_DEBUG_CATEGORY_STATIC (input_selector_debug);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    72
+#define GST_CAT_DEFAULT input_selector_debug
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    73
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    74
+static const GstElementDetails gst_input_selector_details =
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    75
+GST_ELEMENT_DETAILS ("Input selector",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    76
+    "Generic",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    77
+    "N-to-1 input stream selectoring",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    78
+    "Julien Moutte <[email protected]>\n"
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    79
+    "Jan Schmidt <[email protected]>\n"
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    80
+    "Wim Taymans <[email protected]>");
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    81
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    82
+static GstStaticPadTemplate gst_input_selector_sink_factory =
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    83
+GST_STATIC_PAD_TEMPLATE ("sink%d",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    84
+    GST_PAD_SINK,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    85
+    GST_PAD_REQUEST,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    86
+    GST_STATIC_CAPS_ANY);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    87
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    88
+static GstStaticPadTemplate gst_input_selector_src_factory =
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    89
+GST_STATIC_PAD_TEMPLATE ("src",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    90
+    GST_PAD_SRC,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    91
+    GST_PAD_ALWAYS,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    92
+    GST_STATIC_CAPS_ANY);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    93
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    94
+enum
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    95
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    96
+  PROP_0,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    97
+  PROP_N_PADS,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    98
+  PROP_ACTIVE_PAD,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
    99
+  PROP_SELECT_ALL,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   100
+  PROP_LAST
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   101
+};
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   102
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   103
+#define DEFAULT_PAD_ALWAYS_OK	TRUE
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   104
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   105
+enum
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   106
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   107
+  PROP_PAD_0,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   108
+  PROP_PAD_RUNNING_TIME,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   109
+  PROP_PAD_TAGS,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   110
+  PROP_PAD_ACTIVE,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   111
+  PROP_PAD_ALWAYS_OK,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   112
+  PROP_PAD_LAST
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   113
+};
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   114
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   115
+enum
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   116
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   117
+  /* methods */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   118
+  SIGNAL_BLOCK,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   119
+  SIGNAL_SWITCH,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   120
+  LAST_SIGNAL
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   121
+};
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   122
+static guint gst_input_selector_signals[LAST_SIGNAL] = { 0 };
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   123
+
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   124
+static inline gboolean gst_input_selector_is_active_sinkpad (GstInputSelector *
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   125
+    sel, GstPad * pad);
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   126
+static GstPad *gst_input_selector_activate_sinkpad (GstInputSelector * sel,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   127
+    GstPad * pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   128
+static GstPad *gst_input_selector_get_linked_pad (GstPad * pad,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   129
+    gboolean strict);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   130
+static gboolean gst_input_selector_check_eos (GstElement * selector);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   131
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   132
+#define GST_TYPE_SELECTOR_PAD \
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   133
+  (gst_selector_pad_get_type())
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   134
+#define GST_SELECTOR_PAD(obj) \
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   135
+  (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SELECTOR_PAD, GstSelectorPad))
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   136
+#define GST_SELECTOR_PAD_CLASS(klass) \
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   137
+  (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_SELECTOR_PAD, GstSelectorPadClass))
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   138
+#define GST_IS_SELECTOR_PAD(obj) \
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   139
+  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SELECTOR_PAD))
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   140
+#define GST_IS_SELECTOR_PAD_CLASS(klass) \
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   141
+  (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SELECTOR_PAD))
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   142
+#define GST_SELECTOR_PAD_CAST(obj) \
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   143
+  ((GstSelectorPad *)(obj))
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   144
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   145
+typedef struct _GstSelectorPad GstSelectorPad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   146
+typedef struct _GstSelectorPadClass GstSelectorPadClass;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   147
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   148
+struct _GstSelectorPad
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   149
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   150
+  GstPad parent;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   151
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   152
+  gboolean active;              /* when buffer have passed the pad */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   153
+  gboolean eos;                 /* when EOS has been received */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   154
+  gboolean discont;             /* after switching we create a discont */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   155
+  gboolean always_ok;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   156
+  GstSegment segment;           /* the current segment on the pad */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   157
+  GstTagList *tags;             /* last tags received on the pad */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   158
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   159
+  gboolean segment_pending;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   160
+};
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   161
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   162
+struct _GstSelectorPadClass
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   163
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   164
+  GstPadClass parent;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   165
+};
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   166
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   167
+static void gst_selector_pad_class_init (GstSelectorPadClass * klass);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   168
+static void gst_selector_pad_init (GstSelectorPad * pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   169
+static void gst_selector_pad_finalize (GObject * object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   170
+static void gst_selector_pad_get_property (GObject * object,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   171
+    guint prop_id, GValue * value, GParamSpec * pspec);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   172
+static void gst_selector_pad_set_property (GObject * object,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   173
+    guint prop_id, const GValue * value, GParamSpec * pspec);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   174
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   175
+static GstPadClass *selector_pad_parent_class = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   176
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   177
+static gint64 gst_selector_pad_get_running_time (GstSelectorPad * pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   178
+static void gst_selector_pad_reset (GstSelectorPad * pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   179
+static gboolean gst_selector_pad_event (GstPad * pad, GstEvent * event);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   180
+static GstCaps *gst_selector_pad_getcaps (GstPad * pad);
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   181
+static gboolean gst_selector_pad_acceptcaps (GstPad * pad, GstCaps * caps);
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   182
+static GstIterator *gst_selector_pad_iterate_linked_pads (GstPad * pad);
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   183
+static GstFlowReturn gst_selector_pad_chain (GstPad * pad, GstBuffer * buf);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   184
+static GstFlowReturn gst_selector_pad_bufferalloc (GstPad * pad,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   185
+    guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   186
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   187
+static GType
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   188
+gst_selector_pad_get_type (void)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   189
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   190
+  static GType selector_pad_type = 0;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   191
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   192
+  if (!selector_pad_type) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   193
+    static const GTypeInfo selector_pad_info = {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   194
+      sizeof (GstSelectorPadClass),
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   195
+      NULL,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   196
+      NULL,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   197
+      (GClassInitFunc) gst_selector_pad_class_init,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   198
+      NULL,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   199
+      NULL,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   200
+      sizeof (GstSelectorPad),
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   201
+      0,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   202
+      (GInstanceInitFunc) gst_selector_pad_init,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   203
+    };
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   204
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   205
+    selector_pad_type =
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   206
+        g_type_register_static (GST_TYPE_PAD, "GstSelectorPad",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   207
+        &selector_pad_info, 0);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   208
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   209
+  return selector_pad_type;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   210
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   211
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   212
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   213
+gst_selector_pad_class_init (GstSelectorPadClass * klass)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   214
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   215
+  GObjectClass *gobject_class;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   216
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   217
+  gobject_class = (GObjectClass *) klass;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   218
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   219
+  selector_pad_parent_class = g_type_class_peek_parent (klass);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   220
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   221
+  gobject_class->finalize = gst_selector_pad_finalize;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   222
+
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   223
+  gobject_class->get_property = gst_selector_pad_get_property;
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   224
+  gobject_class->set_property = gst_selector_pad_set_property;
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   225
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   226
+  g_object_class_install_property (gobject_class, PROP_PAD_RUNNING_TIME,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   227
+      g_param_spec_int64 ("running-time", "Running time",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   228
+          "Running time of stream on pad", 0, G_MAXINT64, 0, G_PARAM_READABLE));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   229
+  g_object_class_install_property (gobject_class, PROP_PAD_TAGS,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   230
+      g_param_spec_boxed ("tags", "Tags",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   231
+          "The currently active tags on the pad", GST_TYPE_TAG_LIST,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   232
+          G_PARAM_READABLE));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   233
+  g_object_class_install_property (gobject_class, PROP_PAD_ACTIVE,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   234
+      g_param_spec_boolean ("active", "Active",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   235
+          "If the pad is currently active", FALSE, G_PARAM_READABLE));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   236
+  g_object_class_install_property (gobject_class, PROP_PAD_ALWAYS_OK,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   237
+      g_param_spec_boolean ("always-ok", "Always OK",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   238
+          "Make an inactive pad return OK instead of NOT_LINKED",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   239
+          DEFAULT_PAD_ALWAYS_OK, G_PARAM_READWRITE));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   240
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   241
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   242
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   243
+gst_selector_pad_init (GstSelectorPad * pad)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   244
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   245
+  pad->always_ok = DEFAULT_PAD_ALWAYS_OK;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   246
+  gst_selector_pad_reset (pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   247
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   248
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   249
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   250
+gst_selector_pad_finalize (GObject * object)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   251
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   252
+  GstSelectorPad *pad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   253
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   254
+  pad = GST_SELECTOR_PAD_CAST (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   255
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   256
+  if (pad->tags)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   257
+    gst_tag_list_free (pad->tags);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   258
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   259
+  G_OBJECT_CLASS (selector_pad_parent_class)->finalize (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   260
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   261
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   262
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   263
+gst_selector_pad_set_property (GObject * object, guint prop_id,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   264
+    const GValue * value, GParamSpec * pspec)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   265
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   266
+  GstSelectorPad *spad = GST_SELECTOR_PAD_CAST (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   267
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   268
+  switch (prop_id) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   269
+    case PROP_PAD_ALWAYS_OK:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   270
+      GST_OBJECT_LOCK (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   271
+      spad->always_ok = g_value_get_boolean (value);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   272
+      GST_OBJECT_UNLOCK (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   273
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   274
+    default:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   275
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   276
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   277
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   278
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   279
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   280
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   281
+gst_selector_pad_get_property (GObject * object, guint prop_id,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   282
+    GValue * value, GParamSpec * pspec)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   283
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   284
+  GstSelectorPad *spad = GST_SELECTOR_PAD_CAST (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   285
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   286
+  switch (prop_id) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   287
+    case PROP_PAD_RUNNING_TIME:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   288
+      g_value_set_int64 (value, gst_selector_pad_get_running_time (spad));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   289
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   290
+    case PROP_PAD_TAGS:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   291
+      GST_OBJECT_LOCK (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   292
+      g_value_set_boxed (value, spad->tags);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   293
+      GST_OBJECT_UNLOCK (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   294
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   295
+    case PROP_PAD_ACTIVE:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   296
+    {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   297
+      GstInputSelector *sel;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   298
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   299
+      sel = GST_INPUT_SELECTOR (gst_pad_get_parent (spad));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   300
+      g_value_set_boolean (value, gst_input_selector_is_active_sinkpad (sel,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   301
+              GST_PAD_CAST (spad)));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   302
+      gst_object_unref (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   303
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   304
+    }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   305
+    case PROP_PAD_ALWAYS_OK:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   306
+      GST_OBJECT_LOCK (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   307
+      g_value_set_boolean (value, spad->always_ok);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   308
+      GST_OBJECT_UNLOCK (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   309
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   310
+    default:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   311
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   312
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   313
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   314
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   315
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   316
+static gint64
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   317
+gst_selector_pad_get_running_time (GstSelectorPad * pad)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   318
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   319
+  gint64 ret = 0;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   320
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   321
+  GST_OBJECT_LOCK (pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   322
+  if (pad->active) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   323
+    gint64 last_stop = pad->segment.last_stop;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   324
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   325
+    if (last_stop >= 0)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   326
+      ret = gst_segment_to_running_time (&pad->segment, GST_FORMAT_TIME,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   327
+          last_stop);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   328
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   329
+  GST_OBJECT_UNLOCK (pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   330
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   331
+  GST_DEBUG_OBJECT (pad, "running time: %" GST_TIME_FORMAT,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   332
+      GST_TIME_ARGS (ret));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   333
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   334
+  return ret;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   335
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   336
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   337
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   338
+gst_selector_pad_reset (GstSelectorPad * pad)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   339
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   340
+  GST_OBJECT_LOCK (pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   341
+  pad->active = FALSE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   342
+  pad->eos = FALSE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   343
+  pad->segment_pending = FALSE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   344
+  pad->discont = FALSE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   345
+  gst_segment_init (&pad->segment, GST_FORMAT_UNDEFINED);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   346
+  GST_OBJECT_UNLOCK (pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   347
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   348
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   349
+/* strictly get the linked pad from the sinkpad. If the pad is active we return
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   350
+ * the srcpad else we return NULL */
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   351
+static GstIterator *
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   352
+gst_selector_pad_iterate_linked_pads (GstPad * pad)
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   353
+{
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   354
+  GstInputSelector *sel = GST_INPUT_SELECTOR (gst_pad_get_parent (pad));
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   355
+  GstPad *otherpad;
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   356
+  GstIterator *it;
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   357
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   358
+  otherpad = gst_input_selector_get_linked_pad (pad, TRUE);
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   359
+  it = gst_iterator_new_single (GST_TYPE_PAD, otherpad,
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   360
+      (GstCopyFunction) gst_object_ref, (GFreeFunc) gst_object_unref);
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   361
+
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   362
+  if (otherpad)
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   363
+    gst_object_unref (otherpad);
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   364
+  gst_object_unref (sel);
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   365
+
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   366
+  return it;
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   367
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   368
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   369
+static gboolean
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   370
+gst_selector_pad_event (GstPad * pad, GstEvent * event)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   371
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   372
+  gboolean res = TRUE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   373
+  gboolean forward = TRUE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   374
+  GstInputSelector *sel;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   375
+  GstSelectorPad *selpad;
15812
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   376
+  GstPad *prev_active_sinkpad;
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   377
+  GstPad *active_sinkpad;
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   378
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   379
+  sel = GST_INPUT_SELECTOR (gst_pad_get_parent (pad));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   380
+  selpad = GST_SELECTOR_PAD_CAST (pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   381
+
15812
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   382
+  GST_INPUT_SELECTOR_LOCK (sel);
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   383
+  prev_active_sinkpad = sel->active_sinkpad;
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   384
+  active_sinkpad = gst_input_selector_activate_sinkpad (sel, pad);
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   385
+
15812
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   386
+  /* only forward if we are dealing with the active sinkpad or if select_all
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   387
+   * is enabled */
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   388
+  if (pad != active_sinkpad && !sel->select_all)
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   389
+    forward = FALSE;
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   390
+  GST_INPUT_SELECTOR_UNLOCK (sel);
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   391
+
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   392
+  if (prev_active_sinkpad != active_sinkpad && pad == active_sinkpad)
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   393
+    g_object_notify (G_OBJECT (sel), "active-pad");
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   394
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   395
+  switch (GST_EVENT_TYPE (event)) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   396
+    case GST_EVENT_FLUSH_START:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   397
+      /* FIXME, flush out the waiter */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   398
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   399
+    case GST_EVENT_FLUSH_STOP:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   400
+      GST_INPUT_SELECTOR_LOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   401
+      gst_selector_pad_reset (selpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   402
+      sel->pending_close = FALSE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   403
+      GST_INPUT_SELECTOR_UNLOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   404
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   405
+    case GST_EVENT_NEWSEGMENT:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   406
+    {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   407
+      gboolean update;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   408
+      GstFormat format;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   409
+      gdouble rate, arate;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   410
+      gint64 start, stop, time;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   411
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   412
+      gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   413
+          &start, &stop, &time);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   414
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   415
+      GST_DEBUG_OBJECT (pad,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   416
+          "configured NEWSEGMENT update %d, rate %lf, applied rate %lf, "
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   417
+          "format %d, "
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   418
+          "%" G_GINT64_FORMAT " -- %" G_GINT64_FORMAT ", time %"
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   419
+          G_GINT64_FORMAT, update, rate, arate, format, start, stop, time);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   420
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   421
+      GST_INPUT_SELECTOR_LOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   422
+      GST_OBJECT_LOCK (selpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   423
+      gst_segment_set_newsegment_full (&selpad->segment, update,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   424
+          rate, arate, format, start, stop, time);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   425
+      GST_OBJECT_UNLOCK (selpad);
15812
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   426
+
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   427
+      /* If we aren't forwarding the event (because the pad is not the
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   428
+       * active_sinkpad, and select_all is not set, then set the flag on the
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   429
+       * that says a segment needs sending if/when that pad is activated.
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   430
+       * For all other cases, we send the event immediately, which makes
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   431
+       * sparse streams and other segment updates work correctly downstream.
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   432
+       */
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   433
+      if (!forward)
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   434
+        selpad->segment_pending = TRUE;
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   435
+
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   436
+      GST_INPUT_SELECTOR_UNLOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   437
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   438
+    }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   439
+    case GST_EVENT_TAG:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   440
+    {
15812
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   441
+      GstTagList *tags, *oldtags, *newtags;
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   442
+
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   443
+      gst_event_parse_tag (event, &tags);
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   444
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   445
+      GST_OBJECT_LOCK (selpad);
15812
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   446
+      oldtags = selpad->tags;
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   447
+
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   448
+      newtags = gst_tag_list_merge (oldtags, tags, GST_TAG_MERGE_REPLACE);
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   449
+      selpad->tags = newtags;
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   450
+      if (oldtags)
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   451
+        gst_tag_list_free (oldtags);
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   452
+      GST_DEBUG_OBJECT (pad, "received tags %" GST_PTR_FORMAT, newtags);
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   453
+      GST_OBJECT_UNLOCK (selpad);
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   454
+
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   455
+      g_object_notify (G_OBJECT (selpad), "tags");
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   456
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   457
+    }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   458
+    case GST_EVENT_EOS:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   459
+      selpad->eos = TRUE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   460
+      GST_DEBUG_OBJECT (pad, "received EOS");
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   461
+      /* don't forward eos in select_all mode until all sink pads have eos */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   462
+      if (sel->select_all && !gst_input_selector_check_eos (GST_ELEMENT (sel))) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   463
+        forward = FALSE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   464
+      }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   465
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   466
+    default:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   467
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   468
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   469
+  if (forward) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   470
+    GST_DEBUG_OBJECT (pad, "forwarding event");
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   471
+    res = gst_pad_push_event (sel->srcpad, event);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   472
+  } else
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   473
+    gst_event_unref (event);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   474
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   475
+  gst_object_unref (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   476
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   477
+  return res;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   478
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   479
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   480
+static GstCaps *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   481
+gst_selector_pad_getcaps (GstPad * pad)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   482
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   483
+  GstInputSelector *sel;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   484
+  GstCaps *caps;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   485
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   486
+  sel = GST_INPUT_SELECTOR (gst_pad_get_parent (pad));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   487
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   488
+  GST_DEBUG_OBJECT (sel, "Getting caps of srcpad peer");
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   489
+  caps = gst_pad_peer_get_caps (sel->srcpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   490
+  if (caps == NULL)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   491
+    caps = gst_caps_new_any ();
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   492
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   493
+  gst_object_unref (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   494
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   495
+  return caps;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   496
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   497
+
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   498
+static gboolean
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   499
+gst_selector_pad_acceptcaps (GstPad * pad, GstCaps * caps)
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   500
+{
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   501
+  GstInputSelector *sel;
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   502
+  gboolean res;
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   503
+
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   504
+  sel = GST_INPUT_SELECTOR (gst_pad_get_parent (pad));
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   505
+
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   506
+  GST_DEBUG_OBJECT (sel, "Checking acceptcaps of srcpad peer");
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   507
+  res = gst_pad_peer_accept_caps (sel->srcpad, caps);
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   508
+  gst_object_unref (sel);
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   509
+
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   510
+  return res;
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   511
+}
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   512
+
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   513
+static GstFlowReturn
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   514
+gst_selector_pad_bufferalloc (GstPad * pad, guint64 offset,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   515
+    guint size, GstCaps * caps, GstBuffer ** buf)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   516
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   517
+  GstInputSelector *sel;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   518
+  GstFlowReturn result;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   519
+  GstPad *active_sinkpad;
15812
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   520
+  GstPad *prev_active_sinkpad;
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   521
+  GstSelectorPad *selpad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   522
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   523
+  sel = GST_INPUT_SELECTOR (gst_pad_get_parent (pad));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   524
+  selpad = GST_SELECTOR_PAD_CAST (pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   525
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   526
+  GST_DEBUG_OBJECT (pad, "received alloc");
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   527
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   528
+  GST_INPUT_SELECTOR_LOCK (sel);
15812
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   529
+  prev_active_sinkpad = sel->active_sinkpad;
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   530
+  active_sinkpad = gst_input_selector_activate_sinkpad (sel, pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   531
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   532
+  if (pad != active_sinkpad)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   533
+    goto not_active;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   534
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   535
+  GST_INPUT_SELECTOR_UNLOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   536
+
15812
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   537
+  if (prev_active_sinkpad != active_sinkpad && pad == active_sinkpad)
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   538
+    g_object_notify (G_OBJECT (sel), "active-pad");
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   539
+
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   540
+  result = gst_pad_alloc_buffer (sel->srcpad, offset, size, caps, buf);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   541
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   542
+done:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   543
+  gst_object_unref (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   544
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   545
+  return result;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   546
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   547
+  /* ERRORS */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   548
+not_active:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   549
+  {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   550
+    GST_INPUT_SELECTOR_UNLOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   551
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   552
+    /* unselected pad, perform fallback alloc or return unlinked when
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   553
+     * asked */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   554
+    GST_OBJECT_LOCK (selpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   555
+    if (selpad->always_ok) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   556
+      GST_DEBUG_OBJECT (pad, "Not selected, performing fallback allocation");
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   557
+      *buf = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   558
+      result = GST_FLOW_OK;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   559
+    } else {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   560
+      GST_DEBUG_OBJECT (pad, "Not selected, return NOT_LINKED");
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   561
+      result = GST_FLOW_NOT_LINKED;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   562
+    }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   563
+    GST_OBJECT_UNLOCK (selpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   564
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   565
+    goto done;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   566
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   567
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   568
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   569
+/* must be called with the SELECTOR_LOCK, will block while the pad is blocked 
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   570
+ * or return TRUE when flushing */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   571
+static gboolean
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   572
+gst_input_selector_wait (GstInputSelector * self, GstPad * pad)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   573
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   574
+  while (self->blocked && !self->flushing) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   575
+    /* we can be unlocked here when we are shutting down (flushing) or when we
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   576
+     * get unblocked */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   577
+    GST_INPUT_SELECTOR_WAIT (self);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   578
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   579
+  return self->flushing;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   580
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   581
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   582
+static GstFlowReturn
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   583
+gst_selector_pad_chain (GstPad * pad, GstBuffer * buf)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   584
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   585
+  GstInputSelector *sel;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   586
+  GstFlowReturn res;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   587
+  GstPad *active_sinkpad;
15812
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   588
+  GstPad *prev_active_sinkpad;
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   589
+  GstSelectorPad *selpad;
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   590
+  GstClockTime start_time;
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   591
+  GstSegment *seg;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   592
+  GstEvent *close_event = NULL, *start_event = NULL;
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   593
+  GstCaps *caps;
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   594
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   595
+  sel = GST_INPUT_SELECTOR (gst_pad_get_parent (pad));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   596
+  selpad = GST_SELECTOR_PAD_CAST (pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   597
+  seg = &selpad->segment;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   598
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   599
+  GST_INPUT_SELECTOR_LOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   600
+  /* wait or check for flushing */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   601
+  if (gst_input_selector_wait (sel, pad))
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   602
+    goto flushing;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   603
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   604
+  GST_DEBUG_OBJECT (pad, "getting active pad");
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   605
+
15812
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   606
+  prev_active_sinkpad = sel->active_sinkpad;
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   607
+  active_sinkpad = gst_input_selector_activate_sinkpad (sel, pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   608
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   609
+  /* update the segment on the srcpad */
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   610
+  start_time = GST_BUFFER_TIMESTAMP (buf);
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   611
+  if (GST_CLOCK_TIME_IS_VALID (start_time)) {
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   612
+    GST_DEBUG_OBJECT (pad, "received start time %" GST_TIME_FORMAT,
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   613
+        GST_TIME_ARGS (start_time));
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   614
+    if (GST_BUFFER_DURATION_IS_VALID (buf))
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   615
+      GST_DEBUG_OBJECT (pad, "received end time %" GST_TIME_FORMAT,
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   616
+          GST_TIME_ARGS (start_time + GST_BUFFER_DURATION (buf)));
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   617
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   618
+    GST_OBJECT_LOCK (pad);
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   619
+    gst_segment_set_last_stop (seg, seg->format, start_time);
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   620
+    GST_OBJECT_UNLOCK (pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   621
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   622
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   623
+  /* Ignore buffers from pads except the selected one */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   624
+  if (pad != active_sinkpad)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   625
+    goto ignore;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   626
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   627
+  if (G_UNLIKELY (sel->pending_close)) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   628
+    GstSegment *cseg = &sel->segment;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   629
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   630
+    GST_DEBUG_OBJECT (sel,
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   631
+        "pushing close NEWSEGMENT update %d, rate %lf, applied rate %lf, "
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   632
+        "format %d, "
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   633
+        "%" G_GINT64_FORMAT " -- %" G_GINT64_FORMAT ", time %"
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   634
+        G_GINT64_FORMAT, TRUE, cseg->rate, cseg->applied_rate, cseg->format,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   635
+        cseg->start, cseg->stop, cseg->time);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   636
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   637
+    /* create update segment */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   638
+    close_event = gst_event_new_new_segment_full (TRUE, cseg->rate,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   639
+        cseg->applied_rate, cseg->format, cseg->start, cseg->stop, cseg->time);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   640
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   641
+    sel->pending_close = FALSE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   642
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   643
+  /* if we have a pending segment, push it out now */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   644
+  if (G_UNLIKELY (selpad->segment_pending)) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   645
+    GST_DEBUG_OBJECT (pad,
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   646
+        "pushing pending NEWSEGMENT update %d, rate %lf, applied rate %lf, "
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   647
+        "format %d, "
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   648
+        "%" G_GINT64_FORMAT " -- %" G_GINT64_FORMAT ", time %"
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   649
+        G_GINT64_FORMAT, FALSE, seg->rate, seg->applied_rate, seg->format,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   650
+        seg->start, seg->stop, seg->time);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   651
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   652
+    start_event = gst_event_new_new_segment_full (FALSE, seg->rate,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   653
+        seg->applied_rate, seg->format, seg->start, seg->stop, seg->time);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   654
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   655
+    selpad->segment_pending = FALSE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   656
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   657
+  GST_INPUT_SELECTOR_UNLOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   658
+
15812
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   659
+  if (prev_active_sinkpad != active_sinkpad && pad == active_sinkpad)
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   660
+    g_object_notify (G_OBJECT (sel), "active-pad");
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   661
+
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   662
+  if (close_event)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   663
+    gst_pad_push_event (sel->srcpad, close_event);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   664
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   665
+  if (start_event)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   666
+    gst_pad_push_event (sel->srcpad, start_event);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   667
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   668
+  if (selpad->discont) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   669
+    buf = gst_buffer_make_metadata_writable (buf);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   670
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   671
+    GST_DEBUG_OBJECT (pad, "Marking discont buffer %p", buf);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   672
+    GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   673
+    selpad->discont = FALSE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   674
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   675
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   676
+  /* forward */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   677
+  GST_DEBUG_OBJECT (pad, "Forwarding buffer %p from pad %s:%s", buf,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   678
+      GST_DEBUG_PAD_NAME (pad));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   679
+
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   680
+  if ((caps = GST_BUFFER_CAPS (buf))) {
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   681
+    if (GST_PAD_CAPS (sel->srcpad) != caps)
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   682
+      gst_pad_set_caps (sel->srcpad, caps);
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   683
+  }
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   684
+
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   685
+  res = gst_pad_push (sel->srcpad, buf);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   686
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   687
+done:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   688
+  gst_object_unref (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   689
+  return res;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   690
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   691
+  /* dropped buffers */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   692
+ignore:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   693
+  {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   694
+    GST_DEBUG_OBJECT (pad, "Pad not active, discard buffer %p", buf);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   695
+    /* when we drop a buffer, we're creating a discont on this pad */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   696
+    selpad->discont = TRUE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   697
+    GST_INPUT_SELECTOR_UNLOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   698
+    gst_buffer_unref (buf);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   699
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   700
+    /* figure out what to return upstream */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   701
+    GST_OBJECT_LOCK (selpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   702
+    if (selpad->always_ok)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   703
+      res = GST_FLOW_OK;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   704
+    else
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   705
+      res = GST_FLOW_NOT_LINKED;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   706
+    GST_OBJECT_UNLOCK (selpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   707
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   708
+    goto done;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   709
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   710
+flushing:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   711
+  {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   712
+    GST_DEBUG_OBJECT (pad, "We are flushing, discard buffer %p", buf);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   713
+    GST_INPUT_SELECTOR_UNLOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   714
+    gst_buffer_unref (buf);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   715
+    res = GST_FLOW_WRONG_STATE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   716
+    goto done;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   717
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   718
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   719
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   720
+static void gst_input_selector_init (GstInputSelector * sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   721
+static void gst_input_selector_base_init (GstInputSelectorClass * klass);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   722
+static void gst_input_selector_class_init (GstInputSelectorClass * klass);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   723
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   724
+static void gst_input_selector_dispose (GObject * object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   725
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   726
+static void gst_input_selector_set_property (GObject * object,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   727
+    guint prop_id, const GValue * value, GParamSpec * pspec);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   728
+static void gst_input_selector_get_property (GObject * object,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   729
+    guint prop_id, GValue * value, GParamSpec * pspec);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   730
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   731
+static GstPad *gst_input_selector_request_new_pad (GstElement * element,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   732
+    GstPadTemplate * templ, const gchar * unused);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   733
+static void gst_input_selector_release_pad (GstElement * element, GstPad * pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   734
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   735
+static GstStateChangeReturn gst_input_selector_change_state (GstElement *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   736
+    element, GstStateChange transition);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   737
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   738
+static GstCaps *gst_input_selector_getcaps (GstPad * pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   739
+static gboolean gst_input_selector_event (GstPad * pad, GstEvent * event);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   740
+static gboolean gst_input_selector_query (GstPad * pad, GstQuery * query);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   741
+static gint64 gst_input_selector_block (GstInputSelector * self);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   742
+static void gst_input_selector_switch (GstInputSelector * self,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   743
+    GstPad * pad, gint64 stop_time, gint64 start_time);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   744
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   745
+static GstElementClass *parent_class = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   746
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   747
+GType
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   748
+gst_input_selector_get_type (void)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   749
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   750
+  static GType input_selector_type = 0;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   751
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   752
+  if (!input_selector_type) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   753
+    static const GTypeInfo input_selector_info = {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   754
+      sizeof (GstInputSelectorClass),
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   755
+      (GBaseInitFunc) gst_input_selector_base_init,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   756
+      NULL,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   757
+      (GClassInitFunc) gst_input_selector_class_init,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   758
+      NULL,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   759
+      NULL,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   760
+      sizeof (GstInputSelector),
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   761
+      0,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   762
+      (GInstanceInitFunc) gst_input_selector_init,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   763
+    };
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   764
+    input_selector_type =
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   765
+        g_type_register_static (GST_TYPE_ELEMENT,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   766
+        "GstInputSelector", &input_selector_info, 0);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   767
+    GST_DEBUG_CATEGORY_INIT (input_selector_debug,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   768
+        "input-selector", 0, "An input stream selector element");
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   769
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   770
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   771
+  return input_selector_type;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   772
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   773
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   774
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   775
+gst_input_selector_base_init (GstInputSelectorClass * klass)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   776
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   777
+  GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   778
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   779
+  gst_element_class_set_details (element_class, &gst_input_selector_details);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   780
+  gst_element_class_add_pad_template (element_class,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   781
+      gst_static_pad_template_get (&gst_input_selector_sink_factory));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   782
+  gst_element_class_add_pad_template (element_class,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   783
+      gst_static_pad_template_get (&gst_input_selector_src_factory));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   784
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   785
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   786
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   787
+gst_input_selector_class_init (GstInputSelectorClass * klass)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   788
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   789
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   790
+  GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   791
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   792
+  parent_class = g_type_class_peek_parent (klass);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   793
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   794
+  gobject_class->dispose = gst_input_selector_dispose;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   795
+
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   796
+  gobject_class->set_property = gst_input_selector_set_property;
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   797
+  gobject_class->get_property = gst_input_selector_get_property;
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   798
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   799
+  g_object_class_install_property (gobject_class, PROP_N_PADS,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   800
+      g_param_spec_uint ("n-pads", "Number of Pads",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   801
+          "The number of sink pads", 0, G_MAXUINT, 0, G_PARAM_READABLE));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   802
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   803
+  g_object_class_install_property (gobject_class, PROP_ACTIVE_PAD,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   804
+      g_param_spec_object ("active-pad", "Active pad",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   805
+          "The currently active sink pad", GST_TYPE_PAD, G_PARAM_READWRITE));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   806
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   807
+  g_object_class_install_property (gobject_class, PROP_SELECT_ALL,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   808
+      g_param_spec_boolean ("select-all", "Select all mode",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   809
+          "Forwards data from all input pads", FALSE, G_PARAM_READWRITE));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   810
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   811
+  /**
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   812
+   * GstInputSelector::block:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   813
+   * @inputselector: the #GstInputSelector
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   814
+   *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   815
+   * Block all sink pads in preparation for a switch. Returns the stop time of
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   816
+   * the current switch segment, as a running time, or 0 if there is no current
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   817
+   * active pad or the current active pad never received data.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   818
+   */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   819
+  gst_input_selector_signals[SIGNAL_BLOCK] =
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   820
+      g_signal_new ("block", G_TYPE_FROM_CLASS (klass),
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   821
+      G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   822
+      G_STRUCT_OFFSET (GstInputSelectorClass, block), NULL, NULL,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   823
+      gst_selector_marshal_INT64__VOID, G_TYPE_INT64, 0);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   824
+  /**
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   825
+   * GstInputSelector::switch:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   826
+   * @inputselector: the #GstInputSelector
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   827
+   * @pad:            the pad to switch to
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   828
+   * @stop_time:      running time at which to close the previous segment, or -1
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   829
+   *                  to use the running time of the previously active sink pad
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   830
+   * @start_time:     running time at which to start the new segment, or -1 to
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   831
+   *                  use the running time of the newly active sink pad
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   832
+   *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   833
+   * Switch to a new feed. The segment opened by the previously active pad, if
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   834
+   * any, will be closed, and a new segment opened before data flows again.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   835
+   *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   836
+   * This signal must be emitted when the element has been blocked via the <link
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   837
+   * linkend="GstInputSelector-block">block</link> signal.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   838
+   *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   839
+   * If you have a stream with only one switch element, such as an audio-only
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   840
+   * stream, a stream switch should be performed by first emitting the block
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   841
+   * signal, and then emitting the switch signal with -1 for the stop and start
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   842
+   * time values.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   843
+   *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   844
+   * The intention of the @stop_time and @start_time arguments is to allow
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   845
+   * multiple switch elements to switch and maintain stream synchronization.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   846
+   * When switching a stream with multiple feeds, you will need as many switch
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   847
+   * elements as you have feeds. For example, a feed with audio and video will
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   848
+   * have one switch element between the audio feeds and one for video.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   849
+   *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   850
+   * A switch over multiple switch elements should be performed as follows:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   851
+   * First, emit the <link linkend="GstInputSelector-block">block</link>
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   852
+   * signal, collecting the returned values. The maximum running time returned
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   853
+   * by block should then be used as the time at which to close the previous
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   854
+   * segment.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   855
+   *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   856
+   * Then, query the running times of the new audio and video pads that you will
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   857
+   * switch to. Naturally, these pads are on separate switch elements. Take the
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   858
+   * minimum running time for those streams and use it for the time at which to
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   859
+   * open the new segment.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   860
+   *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   861
+   * If @pad is the same as the current active pad, the element will cancel any
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   862
+   * previous block without adjusting segments.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   863
+   *
15812
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   864
+   * <note><simpara>
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   865
+   * the signal changed from accepting the pad name to the pad object.
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   866
+   * </simpara></note>
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   867
+   *
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   868
+   * Since: 0.10.7
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   869
+   */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   870
+  gst_input_selector_signals[SIGNAL_SWITCH] =
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   871
+      g_signal_new ("switch", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   872
+      G_STRUCT_OFFSET (GstInputSelectorClass, switch_),
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   873
+      NULL, NULL, gst_selector_marshal_VOID__OBJECT_INT64_INT64,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   874
+      G_TYPE_NONE, 3, GST_TYPE_PAD, G_TYPE_INT64, G_TYPE_INT64);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   875
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   876
+  gstelement_class->request_new_pad = gst_input_selector_request_new_pad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   877
+  gstelement_class->release_pad = gst_input_selector_release_pad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   878
+  gstelement_class->change_state = gst_input_selector_change_state;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   879
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   880
+  klass->block = GST_DEBUG_FUNCPTR (gst_input_selector_block);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   881
+  /* note the underscore because switch is a keyword otherwise */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   882
+  klass->switch_ = GST_DEBUG_FUNCPTR (gst_input_selector_switch);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   883
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   884
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   885
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   886
+gst_input_selector_init (GstInputSelector * sel)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   887
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   888
+  sel->srcpad = gst_pad_new ("src", GST_PAD_SRC);
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   889
+  gst_pad_set_iterate_internal_links_function (sel->srcpad,
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   890
+      GST_DEBUG_FUNCPTR (gst_selector_pad_iterate_linked_pads));
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   891
+  gst_pad_set_getcaps_function (sel->srcpad,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   892
+      GST_DEBUG_FUNCPTR (gst_input_selector_getcaps));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   893
+  gst_pad_set_query_function (sel->srcpad,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   894
+      GST_DEBUG_FUNCPTR (gst_input_selector_query));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   895
+  gst_pad_set_event_function (sel->srcpad,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   896
+      GST_DEBUG_FUNCPTR (gst_input_selector_event));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   897
+  gst_element_add_pad (GST_ELEMENT (sel), sel->srcpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   898
+  /* sinkpad management */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   899
+  sel->active_sinkpad = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   900
+  sel->padcount = 0;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   901
+  gst_segment_init (&sel->segment, GST_FORMAT_UNDEFINED);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   902
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   903
+  sel->lock = g_mutex_new ();
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   904
+  sel->cond = g_cond_new ();
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   905
+  sel->blocked = FALSE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   906
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   907
+  sel->select_all = FALSE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   908
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   909
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   910
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   911
+gst_input_selector_dispose (GObject * object)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   912
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   913
+  GstInputSelector *sel = GST_INPUT_SELECTOR (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   914
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   915
+  if (sel->active_sinkpad) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   916
+    gst_object_unref (sel->active_sinkpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   917
+    sel->active_sinkpad = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   918
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   919
+  if (sel->lock) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   920
+    g_mutex_free (sel->lock);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   921
+    sel->lock = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   922
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   923
+  if (sel->cond) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   924
+    g_cond_free (sel->cond);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   925
+    sel->cond = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   926
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   927
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   928
+  G_OBJECT_CLASS (parent_class)->dispose (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   929
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   930
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   931
+/* Solve the following equation for B.timestamp, and set that as the segment
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   932
+ * stop:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   933
+ * B.running_time = (B.timestamp - NS.start) / NS.abs_rate + NS.accum
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   934
+ */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   935
+static gint64
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   936
+gst_segment_get_timestamp (GstSegment * segment, gint64 running_time)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   937
+{
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   938
+  if (running_time <= segment->accum)
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   939
+    return segment->start;
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   940
+  else
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
   941
+    return (running_time - segment->accum) * segment->abs_rate + segment->start;
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   942
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   943
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   944
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   945
+gst_segment_set_stop (GstSegment * segment, gint64 running_time)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   946
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   947
+  segment->stop = gst_segment_get_timestamp (segment, running_time);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   948
+  segment->last_stop = -1;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   949
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   950
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   951
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   952
+gst_segment_set_start (GstSegment * segment, gint64 running_time)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   953
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   954
+  gint64 new_start, duration;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   955
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   956
+  new_start = gst_segment_get_timestamp (segment, running_time);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   957
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   958
+  /* this is the duration we skipped */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   959
+  duration = new_start - segment->start;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   960
+  /* add the duration to the accumulated segment time */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   961
+  segment->accum += duration;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   962
+  /* move position in the segment */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   963
+  segment->time += duration;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   964
+  segment->start += duration;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   965
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   966
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   967
+/* this function must be called with the SELECTOR_LOCK. It returns TRUE when the
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   968
+ * active pad changed. */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   969
+static gboolean
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   970
+gst_input_selector_set_active_pad (GstInputSelector * self,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   971
+    GstPad * pad, gint64 stop_time, gint64 start_time)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   972
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   973
+  GstSelectorPad *old, *new;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   974
+  GstPad **active_pad_p;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   975
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   976
+  if (pad == self->active_sinkpad)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   977
+    return FALSE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   978
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   979
+  old = GST_SELECTOR_PAD_CAST (self->active_sinkpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   980
+  new = GST_SELECTOR_PAD_CAST (pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   981
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   982
+  GST_DEBUG_OBJECT (self, "setting active pad to %s:%s",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   983
+      GST_DEBUG_PAD_NAME (new));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   984
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   985
+  if (stop_time == -1 && old) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   986
+    /* no stop time given, get the latest running_time on the active pad to 
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   987
+     * close and open the new segment */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   988
+    stop_time = start_time = gst_selector_pad_get_running_time (old);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   989
+    GST_DEBUG_OBJECT (self, "using start/stop of %" G_GINT64_FORMAT,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   990
+        start_time);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   991
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   992
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   993
+  if (old && old->active && !self->pending_close && stop_time >= 0) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   994
+    /* schedule a last_stop update if one isn't already scheduled, and a
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   995
+       segment has been pushed before. */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   996
+    memcpy (&self->segment, &old->segment, sizeof (self->segment));
15812
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
   997
+
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   998
+    GST_DEBUG_OBJECT (self, "setting stop_time to %" G_GINT64_FORMAT,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
   999
+        stop_time);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1000
+    gst_segment_set_stop (&self->segment, stop_time);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1001
+    self->pending_close = TRUE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1002
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1003
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1004
+  if (new && new->active && start_time >= 0) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1005
+    GST_DEBUG_OBJECT (self, "setting start_time to %" G_GINT64_FORMAT,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1006
+        start_time);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1007
+    /* schedule a new segment push */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1008
+    gst_segment_set_start (&new->segment, start_time);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1009
+    new->segment_pending = TRUE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1010
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1011
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1012
+  active_pad_p = &self->active_sinkpad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1013
+  gst_object_replace ((GstObject **) active_pad_p, GST_OBJECT_CAST (pad));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1014
+  GST_DEBUG_OBJECT (self, "New active pad is %" GST_PTR_FORMAT,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1015
+      self->active_sinkpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1016
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1017
+  return TRUE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1018
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1019
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1020
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1021
+gst_input_selector_set_property (GObject * object, guint prop_id,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1022
+    const GValue * value, GParamSpec * pspec)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1023
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1024
+  GstInputSelector *sel = GST_INPUT_SELECTOR (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1025
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1026
+  switch (prop_id) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1027
+    case PROP_ACTIVE_PAD:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1028
+    {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1029
+      GstPad *pad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1030
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1031
+      pad = g_value_get_object (value);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1032
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1033
+      GST_INPUT_SELECTOR_LOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1034
+      gst_input_selector_set_active_pad (sel, pad,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1035
+          GST_CLOCK_TIME_NONE, GST_CLOCK_TIME_NONE);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1036
+      GST_INPUT_SELECTOR_UNLOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1037
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1038
+    }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1039
+    case PROP_SELECT_ALL:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1040
+      GST_INPUT_SELECTOR_LOCK (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1041
+      sel->select_all = g_value_get_boolean (value);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1042
+      GST_INPUT_SELECTOR_UNLOCK (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1043
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1044
+    default:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1045
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1046
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1047
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1048
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1049
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1050
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1051
+gst_input_selector_get_property (GObject * object, guint prop_id,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1052
+    GValue * value, GParamSpec * pspec)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1053
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1054
+  GstInputSelector *sel = GST_INPUT_SELECTOR (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1055
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1056
+  switch (prop_id) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1057
+    case PROP_N_PADS:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1058
+      GST_INPUT_SELECTOR_LOCK (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1059
+      g_value_set_uint (value, sel->n_pads);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1060
+      GST_INPUT_SELECTOR_UNLOCK (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1061
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1062
+    case PROP_ACTIVE_PAD:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1063
+      GST_INPUT_SELECTOR_LOCK (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1064
+      g_value_set_object (value, sel->active_sinkpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1065
+      GST_INPUT_SELECTOR_UNLOCK (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1066
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1067
+    case PROP_SELECT_ALL:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1068
+      GST_INPUT_SELECTOR_LOCK (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1069
+      g_value_set_boolean (value, sel->select_all);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1070
+      GST_INPUT_SELECTOR_UNLOCK (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1071
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1072
+    default:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1073
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1074
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1075
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1076
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1077
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1078
+static GstPad *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1079
+gst_input_selector_get_linked_pad (GstPad * pad, gboolean strict)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1080
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1081
+  GstInputSelector *sel;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1082
+  GstPad *otherpad = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1083
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1084
+  sel = GST_INPUT_SELECTOR (gst_pad_get_parent (pad));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1085
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1086
+  GST_INPUT_SELECTOR_LOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1087
+  if (pad == sel->srcpad)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1088
+    otherpad = sel->active_sinkpad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1089
+  else if (pad == sel->active_sinkpad || !strict)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1090
+    otherpad = sel->srcpad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1091
+  if (otherpad)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1092
+    gst_object_ref (otherpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1093
+  GST_INPUT_SELECTOR_UNLOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1094
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1095
+  gst_object_unref (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1096
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1097
+  return otherpad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1098
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1099
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1100
+static gboolean
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1101
+gst_input_selector_event (GstPad * pad, GstEvent * event)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1102
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1103
+  gboolean res = FALSE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1104
+  GstPad *otherpad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1105
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1106
+  otherpad = gst_input_selector_get_linked_pad (pad, TRUE);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1107
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1108
+  if (otherpad) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1109
+    res = gst_pad_push_event (otherpad, event);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1110
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1111
+    gst_object_unref (otherpad);
15812
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  1112
+  } else
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  1113
+    gst_event_unref (event);
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1114
+  return res;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1115
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1116
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1117
+/* query on the srcpad. We override this function because by default it will
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1118
+ * only forward the query to one random sinkpad */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1119
+static gboolean
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1120
+gst_input_selector_query (GstPad * pad, GstQuery * query)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1121
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1122
+  gboolean res = TRUE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1123
+  GstInputSelector *sel;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1124
+  GstPad *otherpad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1125
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1126
+  sel = GST_INPUT_SELECTOR (gst_pad_get_parent (pad));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1127
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1128
+  otherpad = gst_input_selector_get_linked_pad (pad, TRUE);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1129
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1130
+  switch (GST_QUERY_TYPE (query)) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1131
+    case GST_QUERY_LATENCY:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1132
+    {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1133
+      GList *walk;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1134
+      GstClockTime resmin, resmax;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1135
+      gboolean reslive;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1136
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1137
+      resmin = 0;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1138
+      resmax = -1;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1139
+      reslive = FALSE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1140
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1141
+      /* assume FALSE, we become TRUE if one query succeeds */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1142
+      res = FALSE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1143
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1144
+      /* perform the query on all sinkpads and combine the results. We take the
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1145
+       * max of min and the min of max for the result latency. */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1146
+      GST_INPUT_SELECTOR_LOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1147
+      for (walk = GST_ELEMENT_CAST (sel)->sinkpads; walk;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1148
+          walk = g_list_next (walk)) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1149
+        GstPad *sinkpad = GST_PAD_CAST (walk->data);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1150
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1151
+        if (gst_pad_peer_query (sinkpad, query)) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1152
+          GstClockTime min, max;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1153
+          gboolean live;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1154
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1155
+          /* one query succeeded, we succeed too */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1156
+          res = TRUE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1157
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1158
+          gst_query_parse_latency (query, &live, &min, &max);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1159
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1160
+          GST_DEBUG_OBJECT (sinkpad,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1161
+              "peer latency min %" GST_TIME_FORMAT ", max %" GST_TIME_FORMAT
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1162
+              ", live %d", GST_TIME_ARGS (min), GST_TIME_ARGS (max), live);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1163
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1164
+          if (live) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1165
+            if (min > resmin)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1166
+              resmin = min;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1167
+            if (resmax == -1)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1168
+              resmax = max;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1169
+            else if (max < resmax)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1170
+              resmax = max;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1171
+            if (reslive == FALSE)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1172
+              reslive = live;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1173
+          }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1174
+        }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1175
+      }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1176
+      GST_INPUT_SELECTOR_UNLOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1177
+      if (res) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1178
+        gst_query_set_latency (query, reslive, resmin, resmax);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1179
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1180
+        GST_DEBUG_OBJECT (sel,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1181
+            "total latency min %" GST_TIME_FORMAT ", max %" GST_TIME_FORMAT
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1182
+            ", live %d", GST_TIME_ARGS (resmin), GST_TIME_ARGS (resmax),
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1183
+            reslive);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1184
+      }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1185
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1186
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1187
+    }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1188
+    default:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1189
+      if (otherpad)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1190
+        res = gst_pad_peer_query (otherpad, query);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1191
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1192
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1193
+  if (otherpad)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1194
+    gst_object_unref (otherpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1195
+  gst_object_unref (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1196
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1197
+  return res;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1198
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1199
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1200
+static GstCaps *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1201
+gst_input_selector_getcaps (GstPad * pad)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1202
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1203
+  GstPad *otherpad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1204
+  GstObject *parent;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1205
+  GstCaps *caps;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1206
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1207
+  parent = gst_object_get_parent (GST_OBJECT (pad));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1208
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1209
+  otherpad = gst_input_selector_get_linked_pad (pad, FALSE);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1210
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1211
+  if (!otherpad) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1212
+    if (GST_INPUT_SELECTOR (parent)->select_all) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1213
+      GST_DEBUG_OBJECT (parent,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1214
+          "Pad %s:%s not linked, returning merge of caps",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1215
+          GST_DEBUG_PAD_NAME (pad));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1216
+      caps = gst_pad_proxy_getcaps (pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1217
+    } else {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1218
+      GST_DEBUG_OBJECT (parent,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1219
+          "Pad %s:%s not linked, returning ANY", GST_DEBUG_PAD_NAME (pad));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1220
+      caps = gst_caps_new_any ();
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1221
+    }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1222
+  } else {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1223
+    GST_DEBUG_OBJECT (parent,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1224
+        "Pad %s:%s is linked (to %s:%s), returning peer caps",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1225
+        GST_DEBUG_PAD_NAME (pad), GST_DEBUG_PAD_NAME (otherpad));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1226
+    /* if the peer has caps, use those. If the pad is not linked, this function
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1227
+     * returns NULL and we return ANY */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1228
+    if (!(caps = gst_pad_peer_get_caps (otherpad)))
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1229
+      caps = gst_caps_new_any ();
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1230
+    gst_object_unref (otherpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1231
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1232
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1233
+  gst_object_unref (parent);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1234
+  return caps;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1235
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1236
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1237
+/* check if the pad is the active sinkpad */
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1238
+static inline gboolean
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1239
+gst_input_selector_is_active_sinkpad (GstInputSelector * sel, GstPad * pad)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1240
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1241
+  gboolean res;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1242
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1243
+  GST_INPUT_SELECTOR_LOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1244
+  res = (pad == sel->active_sinkpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1245
+  GST_INPUT_SELECTOR_UNLOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1246
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1247
+  return res;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1248
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1249
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1250
+/* Get or create the active sinkpad, must be called with SELECTOR_LOCK */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1251
+static GstPad *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1252
+gst_input_selector_activate_sinkpad (GstInputSelector * sel, GstPad * pad)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1253
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1254
+  GstPad *active_sinkpad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1255
+  GstSelectorPad *selpad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1256
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1257
+  selpad = GST_SELECTOR_PAD_CAST (pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1258
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1259
+  selpad->active = TRUE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1260
+  active_sinkpad = sel->active_sinkpad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1261
+  if (active_sinkpad == NULL || sel->select_all) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1262
+    /* first pad we get activity on becomes the activated pad by default, if we
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1263
+     * select all, we also remember the last used pad. */
15812
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  1264
+    if (sel->active_sinkpad)
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  1265
+      gst_object_unref (sel->active_sinkpad);
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1266
+    active_sinkpad = sel->active_sinkpad = gst_object_ref (pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1267
+    GST_DEBUG_OBJECT (sel, "Activating pad %s:%s", GST_DEBUG_PAD_NAME (pad));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1268
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1269
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1270
+  return active_sinkpad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1271
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1272
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1273
+static GstPad *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1274
+gst_input_selector_request_new_pad (GstElement * element,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1275
+    GstPadTemplate * templ, const gchar * unused)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1276
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1277
+  GstInputSelector *sel;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1278
+  gchar *name = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1279
+  GstPad *sinkpad = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1280
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1281
+  g_return_val_if_fail (templ->direction == GST_PAD_SINK, NULL);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1282
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1283
+  sel = GST_INPUT_SELECTOR (element);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1284
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1285
+  GST_INPUT_SELECTOR_LOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1286
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1287
+  GST_LOG_OBJECT (sel, "Creating new pad %d", sel->padcount);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1288
+  name = g_strdup_printf ("sink%d", sel->padcount++);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1289
+  sinkpad = g_object_new (GST_TYPE_SELECTOR_PAD,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1290
+      "name", name, "direction", templ->direction, "template", templ, NULL);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1291
+  g_free (name);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1292
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1293
+  sel->n_pads++;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1294
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1295
+  gst_pad_set_event_function (sinkpad,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1296
+      GST_DEBUG_FUNCPTR (gst_selector_pad_event));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1297
+  gst_pad_set_getcaps_function (sinkpad,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1298
+      GST_DEBUG_FUNCPTR (gst_selector_pad_getcaps));
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1299
+  gst_pad_set_acceptcaps_function (sinkpad,
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1300
+      GST_DEBUG_FUNCPTR (gst_selector_pad_acceptcaps));
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1301
+  gst_pad_set_chain_function (sinkpad,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1302
+      GST_DEBUG_FUNCPTR (gst_selector_pad_chain));
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1303
+  gst_pad_set_iterate_internal_links_function (sinkpad,
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1304
+      GST_DEBUG_FUNCPTR (gst_selector_pad_iterate_linked_pads));
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1305
+  gst_pad_set_bufferalloc_function (sinkpad,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1306
+      GST_DEBUG_FUNCPTR (gst_selector_pad_bufferalloc));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1307
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1308
+  gst_pad_set_active (sinkpad, TRUE);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1309
+  gst_element_add_pad (GST_ELEMENT (sel), sinkpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1310
+  GST_INPUT_SELECTOR_UNLOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1311
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1312
+  return sinkpad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1313
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1314
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1315
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1316
+gst_input_selector_release_pad (GstElement * element, GstPad * pad)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1317
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1318
+  GstInputSelector *sel;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1319
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1320
+  sel = GST_INPUT_SELECTOR (element);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1321
+  GST_LOG_OBJECT (sel, "Releasing pad %s:%s", GST_DEBUG_PAD_NAME (pad));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1322
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1323
+  GST_INPUT_SELECTOR_LOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1324
+  /* if the pad was the active pad, makes us select a new one */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1325
+  if (sel->active_sinkpad == pad) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1326
+    GST_DEBUG_OBJECT (sel, "Deactivating pad %s:%s", GST_DEBUG_PAD_NAME (pad));
15812
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  1327
+    gst_object_unref (sel->active_sinkpad);
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1328
+    sel->active_sinkpad = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1329
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1330
+  sel->n_pads--;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1331
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1332
+  gst_pad_set_active (pad, FALSE);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1333
+  gst_element_remove_pad (GST_ELEMENT (sel), pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1334
+  GST_INPUT_SELECTOR_UNLOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1335
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1336
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1337
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1338
+gst_input_selector_reset (GstInputSelector * sel)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1339
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1340
+  GList *walk;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1341
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1342
+  GST_INPUT_SELECTOR_LOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1343
+  /* clear active pad */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1344
+  if (sel->active_sinkpad) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1345
+    gst_object_unref (sel->active_sinkpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1346
+    sel->active_sinkpad = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1347
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1348
+  /* reset segment */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1349
+  gst_segment_init (&sel->segment, GST_FORMAT_UNDEFINED);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1350
+  sel->pending_close = FALSE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1351
+  /* reset each of our sinkpads state */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1352
+  for (walk = GST_ELEMENT_CAST (sel)->sinkpads; walk; walk = g_list_next (walk)) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1353
+    GstSelectorPad *selpad = GST_SELECTOR_PAD_CAST (walk->data);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1354
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1355
+    gst_selector_pad_reset (selpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1356
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1357
+    if (selpad->tags) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1358
+      gst_tag_list_free (selpad->tags);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1359
+      selpad->tags = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1360
+    }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1361
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1362
+  GST_INPUT_SELECTOR_UNLOCK (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1363
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1364
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1365
+static GstStateChangeReturn
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1366
+gst_input_selector_change_state (GstElement * element,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1367
+    GstStateChange transition)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1368
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1369
+  GstInputSelector *self = GST_INPUT_SELECTOR (element);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1370
+  GstStateChangeReturn result;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1371
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1372
+  switch (transition) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1373
+    case GST_STATE_CHANGE_READY_TO_PAUSED:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1374
+      GST_INPUT_SELECTOR_LOCK (self);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1375
+      self->blocked = FALSE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1376
+      self->flushing = FALSE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1377
+      GST_INPUT_SELECTOR_UNLOCK (self);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1378
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1379
+    case GST_STATE_CHANGE_PAUSED_TO_READY:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1380
+      /* first unlock before we call the parent state change function, which
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1381
+       * tries to acquire the stream lock when going to ready. */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1382
+      GST_INPUT_SELECTOR_LOCK (self);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1383
+      self->blocked = FALSE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1384
+      self->flushing = TRUE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1385
+      GST_INPUT_SELECTOR_BROADCAST (self);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1386
+      GST_INPUT_SELECTOR_UNLOCK (self);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1387
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1388
+    default:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1389
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1390
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1391
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1392
+  result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1393
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1394
+  switch (transition) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1395
+    case GST_STATE_CHANGE_PAUSED_TO_READY:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1396
+      gst_input_selector_reset (self);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1397
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1398
+    default:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1399
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1400
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1401
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1402
+  return result;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1403
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1404
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1405
+static gint64
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1406
+gst_input_selector_block (GstInputSelector * self)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1407
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1408
+  gint64 ret = 0;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1409
+  GstSelectorPad *spad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1410
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1411
+  GST_INPUT_SELECTOR_LOCK (self);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1412
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1413
+  if (self->blocked)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1414
+    GST_WARNING_OBJECT (self, "switch already blocked");
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1415
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1416
+  self->blocked = TRUE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1417
+  spad = GST_SELECTOR_PAD_CAST (self->active_sinkpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1418
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1419
+  if (spad)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1420
+    ret = gst_selector_pad_get_running_time (spad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1421
+  else
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1422
+    GST_DEBUG_OBJECT (self, "no active pad while blocking");
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1423
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1424
+  GST_INPUT_SELECTOR_UNLOCK (self);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1425
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1426
+  return ret;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1427
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1428
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1429
+/* stop_time and start_time are running times */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1430
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1431
+gst_input_selector_switch (GstInputSelector * self, GstPad * pad,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1432
+    gint64 stop_time, gint64 start_time)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1433
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1434
+  gboolean changed;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1435
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1436
+  g_return_if_fail (self->blocked == TRUE);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1437
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1438
+  GST_INPUT_SELECTOR_LOCK (self);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1439
+  changed =
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1440
+      gst_input_selector_set_active_pad (self, pad, stop_time, start_time);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1441
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1442
+  self->blocked = FALSE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1443
+  GST_INPUT_SELECTOR_BROADCAST (self);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1444
+  GST_INPUT_SELECTOR_UNLOCK (self);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1445
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1446
+  if (changed)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1447
+    g_object_notify (G_OBJECT (self), "active-pad");
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1448
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1449
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1450
+static gboolean
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1451
+gst_input_selector_check_eos (GstElement * selector)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1452
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1453
+  GstIterator *it = gst_element_iterate_sink_pads (selector);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1454
+  GstIteratorResult ires;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1455
+  gpointer item;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1456
+  gboolean done = FALSE, is_eos = FALSE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1457
+  GstSelectorPad *pad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1458
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1459
+  while (!done) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1460
+    ires = gst_iterator_next (it, &item);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1461
+    switch (ires) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1462
+      case GST_ITERATOR_DONE:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1463
+        GST_INFO_OBJECT (selector, "all sink pads have eos");
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1464
+        done = TRUE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1465
+        is_eos = TRUE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1466
+        break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1467
+      case GST_ITERATOR_OK:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1468
+        pad = GST_SELECTOR_PAD_CAST (item);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1469
+        if (!pad->eos) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1470
+          done = TRUE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1471
+        }
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1472
+        gst_object_unref (pad);
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1473
+        break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1474
+      case GST_ITERATOR_RESYNC:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1475
+        gst_iterator_resync (it);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1476
+        break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1477
+      default:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1478
+        done = TRUE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1479
+        break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1480
+    }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1481
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1482
+  gst_iterator_free (it);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1483
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1484
+  return is_eos;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1485
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1486
--- /dev/null	2008-12-16 15:34:15.000000000 +0800
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1487
+++ gst-plugins-good-0.10.21/gst/selector/gstinputselector.h	2008-12-16 15:09:01.086278737 +0800
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1488
@@ -0,0 +1,84 @@
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1489
+/* GStreamer
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1490
+ * Copyright (C) 2003 Julien Moutte <[email protected]>
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1491
+ * Copyright (C) 2005 Ronald S. Bultje <[email protected]>
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1492
+ * Copyright (C) 2008 Nokia Corporation. (contact <[email protected]>)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1493
+ *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1494
+ * This library is free software; you can redistribute it and/or
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1495
+ * modify it under the terms of the GNU Library General Public
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1496
+ * License as published by the Free Software Foundation; either
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1497
+ * version 2 of the License, or (at your option) any later version.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1498
+ *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1499
+ * This library is distributed in the hope that it will be useful,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1500
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1501
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1502
+ * Library General Public License for more details.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1503
+ *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1504
+ * You should have received a copy of the GNU Library General Public
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1505
+ * License along with this library; if not, write to the
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1506
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1507
+ * Boston, MA 02111-1307, USA.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1508
+ */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1509
+ 
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1510
+#ifndef __GST_INPUT_SELECTOR_H__
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1511
+#define __GST_INPUT_SELECTOR_H__
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1512
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1513
+#include <gst/gst.h>
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1514
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1515
+G_BEGIN_DECLS
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1516
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1517
+#define GST_TYPE_INPUT_SELECTOR \
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1518
+  (gst_input_selector_get_type())
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1519
+#define GST_INPUT_SELECTOR(obj) \
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1520
+  (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_INPUT_SELECTOR, GstInputSelector))
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1521
+#define GST_INPUT_SELECTOR_CLASS(klass) \
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1522
+  (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_INPUT_SELECTOR, GstInputSelectorClass))
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1523
+#define GST_IS_INPUT_SELECTOR(obj) \
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1524
+  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_INPUT_SELECTOR))
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1525
+#define GST_IS_INPUT_SELECTOR_CLASS(klass) \
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1526
+  (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_INPUT_SELECTOR))
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1527
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1528
+typedef struct _GstInputSelector GstInputSelector;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1529
+typedef struct _GstInputSelectorClass GstInputSelectorClass;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1530
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1531
+#define GST_INPUT_SELECTOR_GET_LOCK(sel) (((GstInputSelector*)(sel))->lock)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1532
+#define GST_INPUT_SELECTOR_GET_COND(sel) (((GstInputSelector*)(sel))->cond)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1533
+#define GST_INPUT_SELECTOR_LOCK(sel) (g_mutex_lock (GST_INPUT_SELECTOR_GET_LOCK(sel)))
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1534
+#define GST_INPUT_SELECTOR_UNLOCK(sel) (g_mutex_unlock (GST_INPUT_SELECTOR_GET_LOCK(sel)))
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1535
+#define GST_INPUT_SELECTOR_WAIT(sel) (g_cond_wait (GST_INPUT_SELECTOR_GET_COND(sel), \
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1536
+			GST_INPUT_SELECTOR_GET_LOCK(sel)))
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1537
+#define GST_INPUT_SELECTOR_BROADCAST(sel) (g_cond_broadcast (GST_INPUT_SELECTOR_GET_COND(sel)))
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1538
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1539
+struct _GstInputSelector {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1540
+  GstElement element;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1541
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1542
+  GstPad *srcpad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1543
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1544
+  GstPad *active_sinkpad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1545
+  guint n_pads;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1546
+  guint padcount;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1547
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1548
+  GstSegment segment;      /* the output segment */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1549
+  gboolean pending_close;  /* if we should push a close first */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1550
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1551
+  GMutex *lock;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1552
+  GCond *cond;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1553
+  gboolean blocked;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1554
+  gboolean flushing;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1555
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1556
+  /* select all mode, send data from all input pads forward */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1557
+  gboolean select_all;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1558
+};
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1559
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1560
+struct _GstInputSelectorClass {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1561
+  GstElementClass parent_class;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1562
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1563
+  gint64 (*block)	(GstInputSelector *self);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1564
+  void (*switch_)	(GstInputSelector *self, GstPad *pad,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1565
+                         gint64 stop_time, gint64 start_time);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1566
+};
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1567
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1568
+GType gst_input_selector_get_type (void);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1569
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1570
+G_END_DECLS
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1571
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1572
+#endif /* __GST_INPUT_SELECTOR_H__ */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1573
--- /dev/null	2008-12-16 15:34:15.000000000 +0800
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1574
+++ gst-plugins-good-0.10.21/gst/selector/gstoutputselector.c	2008-12-16 15:09:01.089181384 +0800
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1575
@@ -0,0 +1,510 @@
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1576
+/* GStreamer
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1577
+ * Copyright (C) 2008 Nokia Corporation. (contact <[email protected]>)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1578
+ *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1579
+ * This library is free software; you can redistribute it and/or
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1580
+ * modify it under the terms of the GNU Library General Public
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1581
+ * License as published by the Free Software Foundation; either
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1582
+ * version 2 of the License, or (at your option) any later version.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1583
+ *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1584
+ * This library is distributed in the hope that it will be useful,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1585
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1586
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1587
+ * Library General Public License for more details.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1588
+ *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1589
+ * You should have received a copy of the GNU Library General Public
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1590
+ * License along with this library; if not, write to the
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1591
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1592
+ * Boston, MA 02111-1307, USA.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1593
+ */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1594
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1595
+/**
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1596
+ * SECTION:element-output-selector
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1597
+ * @see_also: #GstOutputSelector, #GstInputSelector
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1598
+ *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1599
+ * Direct input stream to one out of N output pads.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1600
+ */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1601
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1602
+#ifdef HAVE_CONFIG_H
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1603
+#include "config.h"
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1604
+#endif
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1605
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1606
+#include <string.h>
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1607
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1608
+#include "gstoutputselector.h"
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1609
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1610
+GST_DEBUG_CATEGORY_STATIC (output_selector_debug);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1611
+#define GST_CAT_DEFAULT output_selector_debug
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1612
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1613
+static const GstElementDetails gst_output_selector_details =
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1614
+GST_ELEMENT_DETAILS ("Output selector",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1615
+    "Generic",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1616
+    "1-to-N output stream selectoring",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1617
+    "Stefan Kost <[email protected]>");
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1618
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1619
+static GstStaticPadTemplate gst_output_selector_sink_factory =
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1620
+GST_STATIC_PAD_TEMPLATE ("sink",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1621
+    GST_PAD_SINK,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1622
+    GST_PAD_ALWAYS,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1623
+    GST_STATIC_CAPS_ANY);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1624
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1625
+static GstStaticPadTemplate gst_output_selector_src_factory =
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1626
+GST_STATIC_PAD_TEMPLATE ("src%d",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1627
+    GST_PAD_SRC,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1628
+    GST_PAD_REQUEST,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1629
+    GST_STATIC_CAPS_ANY);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1630
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1631
+enum
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1632
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1633
+  PROP_0,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1634
+  PROP_ACTIVE_PAD,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1635
+  PROP_RESEND_LATEST,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1636
+  PROP_LAST
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1637
+};
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1638
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1639
+GST_BOILERPLATE (GstOutputSelector, gst_output_selector, GstElement,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1640
+    GST_TYPE_ELEMENT);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1641
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1642
+static void gst_output_selector_dispose (GObject * object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1643
+static void gst_output_selector_set_property (GObject * object,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1644
+    guint prop_id, const GValue * value, GParamSpec * pspec);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1645
+static void gst_output_selector_get_property (GObject * object,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1646
+    guint prop_id, GValue * value, GParamSpec * pspec);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1647
+static GstPad *gst_output_selector_request_new_pad (GstElement * element,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1648
+    GstPadTemplate * templ, const gchar * unused);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1649
+static void gst_output_selector_release_pad (GstElement * element,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1650
+    GstPad * pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1651
+static GstFlowReturn gst_output_selector_chain (GstPad * pad, GstBuffer * buf);
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1652
+static GstFlowReturn gst_output_selector_buffer_alloc (GstPad * pad,
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1653
+    guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf);
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1654
+static GstStateChangeReturn gst_output_selector_change_state (GstElement *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1655
+    element, GstStateChange transition);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1656
+static gboolean gst_output_selector_handle_sink_event (GstPad * pad,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1657
+    GstEvent * event);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1658
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1659
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1660
+gst_output_selector_base_init (gpointer g_class)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1661
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1662
+  GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1663
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1664
+  gst_element_class_set_details (element_class, &gst_output_selector_details);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1665
+  gst_element_class_add_pad_template (element_class,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1666
+      gst_static_pad_template_get (&gst_output_selector_sink_factory));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1667
+  gst_element_class_add_pad_template (element_class,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1668
+      gst_static_pad_template_get (&gst_output_selector_src_factory));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1669
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1670
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1671
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1672
+gst_output_selector_class_init (GstOutputSelectorClass * klass)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1673
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1674
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1675
+  GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1676
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1677
+  parent_class = g_type_class_peek_parent (klass);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1678
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1679
+  gobject_class->dispose = gst_output_selector_dispose;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1680
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1681
+  gobject_class->set_property =
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1682
+      GST_DEBUG_FUNCPTR (gst_output_selector_set_property);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1683
+  gobject_class->get_property =
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1684
+      GST_DEBUG_FUNCPTR (gst_output_selector_get_property);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1685
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1686
+  g_object_class_install_property (gobject_class, PROP_ACTIVE_PAD,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1687
+      g_param_spec_object ("active-pad", "Active pad",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1688
+          "Currently active src pad", GST_TYPE_PAD, G_PARAM_READWRITE));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1689
+  g_object_class_install_property (gobject_class, PROP_RESEND_LATEST,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1690
+      g_param_spec_boolean ("resend-latest", "Resend latest buffer",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1691
+          "Resend latest buffer after a switch to a new pad", FALSE,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1692
+          G_PARAM_READWRITE));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1693
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1694
+  gstelement_class->request_new_pad =
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1695
+      GST_DEBUG_FUNCPTR (gst_output_selector_request_new_pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1696
+  gstelement_class->release_pad =
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1697
+      GST_DEBUG_FUNCPTR (gst_output_selector_release_pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1698
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1699
+  gstelement_class->change_state = gst_output_selector_change_state;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1700
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1701
+  GST_DEBUG_CATEGORY_INIT (output_selector_debug,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1702
+      "output-selector", 0, "An output stream selector element");
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1703
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1704
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1705
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1706
+gst_output_selector_init (GstOutputSelector * sel,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1707
+    GstOutputSelectorClass * g_class)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1708
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1709
+  sel->sinkpad =
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1710
+      gst_pad_new_from_static_template (&gst_output_selector_sink_factory,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1711
+      "sink");
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1712
+  gst_pad_set_chain_function (sel->sinkpad,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1713
+      GST_DEBUG_FUNCPTR (gst_output_selector_chain));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1714
+  gst_pad_set_event_function (sel->sinkpad,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1715
+      GST_DEBUG_FUNCPTR (gst_output_selector_handle_sink_event));
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1716
+  gst_pad_set_bufferalloc_function (sel->sinkpad,
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1717
+      GST_DEBUG_FUNCPTR (gst_output_selector_buffer_alloc));
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1718
+  /*
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1719
+     gst_pad_set_setcaps_function (sel->sinkpad,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1720
+     GST_DEBUG_FUNCPTR (gst_pad_proxy_setcaps));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1721
+     gst_pad_set_getcaps_function (sel->sinkpad,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1722
+     GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1723
+   */
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1724
+
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1725
+  gst_element_add_pad (GST_ELEMENT (sel), sel->sinkpad);
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1726
+
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1727
+  /* srcpad management */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1728
+  sel->active_srcpad = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1729
+  sel->nb_srcpads = 0;
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1730
+  gst_segment_init (&sel->segment, GST_FORMAT_TIME);
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1731
+  sel->pending_srcpad = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1732
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1733
+  sel->resend_latest = FALSE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1734
+  sel->latest_buffer = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1735
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1736
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1737
+static void
15812
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  1738
+gst_output_selector_reset (GstOutputSelector * osel)
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1739
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1740
+  if (osel->pending_srcpad != NULL) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1741
+    gst_object_unref (osel->pending_srcpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1742
+    osel->pending_srcpad = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1743
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1744
+  if (osel->latest_buffer != NULL) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1745
+    gst_buffer_unref (osel->latest_buffer);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1746
+    osel->latest_buffer = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1747
+  }
15812
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  1748
+  gst_segment_init (&osel->segment, GST_FORMAT_UNDEFINED);
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  1749
+}
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  1750
+
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  1751
+static void
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  1752
+gst_output_selector_dispose (GObject * object)
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  1753
+{
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  1754
+  GstOutputSelector *osel = GST_OUTPUT_SELECTOR (object);
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  1755
+
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  1756
+  gst_output_selector_reset (osel);
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1757
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1758
+  G_OBJECT_CLASS (parent_class)->dispose (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1759
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1760
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1761
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1762
+gst_output_selector_set_property (GObject * object, guint prop_id,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1763
+    const GValue * value, GParamSpec * pspec)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1764
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1765
+  GstOutputSelector *sel = GST_OUTPUT_SELECTOR (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1766
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1767
+  switch (prop_id) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1768
+    case PROP_ACTIVE_PAD:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1769
+    {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1770
+      GstPad *next_pad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1771
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1772
+      next_pad = g_value_get_object (value);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1773
+
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1774
+      GST_INFO_OBJECT (sel, "Activating pad %s:%s",
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1775
+          GST_DEBUG_PAD_NAME (next_pad));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1776
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1777
+      GST_OBJECT_LOCK (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1778
+      if (next_pad != sel->active_srcpad) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1779
+        /* switch to new srcpad in next chain run */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1780
+        if (sel->pending_srcpad != NULL) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1781
+          GST_INFO ("replacing pending switch");
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1782
+          gst_object_unref (sel->pending_srcpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1783
+        }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1784
+        if (next_pad)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1785
+          gst_object_ref (next_pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1786
+        sel->pending_srcpad = next_pad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1787
+      } else {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1788
+        GST_INFO ("pad already active");
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1789
+        if (sel->pending_srcpad != NULL) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1790
+          gst_object_unref (sel->pending_srcpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1791
+          sel->pending_srcpad = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1792
+        }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1793
+      }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1794
+      GST_OBJECT_UNLOCK (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1795
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1796
+    }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1797
+    case PROP_RESEND_LATEST:{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1798
+      sel->resend_latest = g_value_get_boolean (value);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1799
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1800
+    }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1801
+    default:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1802
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1803
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1804
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1805
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1806
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1807
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1808
+gst_output_selector_get_property (GObject * object, guint prop_id,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1809
+    GValue * value, GParamSpec * pspec)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1810
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1811
+  GstOutputSelector *sel = GST_OUTPUT_SELECTOR (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1812
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1813
+  switch (prop_id) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1814
+    case PROP_ACTIVE_PAD:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1815
+      GST_OBJECT_LOCK (object);
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1816
+      g_value_set_object (value,
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1817
+          sel->pending_srcpad ? sel->pending_srcpad : sel->active_srcpad);
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1818
+      GST_OBJECT_UNLOCK (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1819
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1820
+    case PROP_RESEND_LATEST:{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1821
+      GST_OBJECT_LOCK (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1822
+      g_value_set_boolean (value, sel->resend_latest);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1823
+      GST_OBJECT_UNLOCK (object);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1824
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1825
+    }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1826
+    default:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1827
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1828
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1829
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1830
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1831
+
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1832
+static GstFlowReturn
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1833
+gst_output_selector_buffer_alloc (GstPad * pad, guint64 offset, guint size,
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1834
+    GstCaps * caps, GstBuffer ** buf)
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1835
+{
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1836
+  GstOutputSelector *sel;
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1837
+  GstFlowReturn res;
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1838
+  GstPad *allocpad;
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1839
+
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1840
+  sel = GST_OUTPUT_SELECTOR (GST_PAD_PARENT (pad));
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1841
+  res = GST_FLOW_NOT_LINKED;
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1842
+
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1843
+  GST_OBJECT_LOCK (sel);
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1844
+  allocpad = sel->pending_srcpad ? sel->pending_srcpad : sel->active_srcpad;
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1845
+  if (allocpad) {
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1846
+    /* if we had a previous pad we used for allocating a buffer, continue using
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1847
+     * it. */
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1848
+    GST_DEBUG_OBJECT (sel, "using pad %s:%s for alloc",
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1849
+        GST_DEBUG_PAD_NAME (allocpad));
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1850
+    gst_object_ref (allocpad);
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1851
+    GST_OBJECT_UNLOCK (sel);
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1852
+
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1853
+    res = gst_pad_alloc_buffer (allocpad, offset, size, caps, buf);
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1854
+    gst_object_unref (allocpad);
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1855
+
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1856
+    GST_OBJECT_LOCK (sel);
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1857
+  } else {
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1858
+    /* fallback case, allocate a buffer of our own, add pad caps. */
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1859
+    GST_DEBUG_OBJECT (pad, "fallback buffer alloc");
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1860
+    *buf = NULL;
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1861
+    res = GST_FLOW_OK;
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1862
+  }
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1863
+  GST_OBJECT_UNLOCK (sel);
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1864
+
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1865
+  GST_DEBUG_OBJECT (sel, "buffer alloc finished: %s", gst_flow_get_name (res));
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1866
+
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1867
+  return res;
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1868
+}
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1869
+
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1870
+static GstPad *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1871
+gst_output_selector_request_new_pad (GstElement * element,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1872
+    GstPadTemplate * templ, const gchar * name)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1873
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1874
+  gchar *padname;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1875
+  GstPad *srcpad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1876
+  GstOutputSelector *osel;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1877
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1878
+  osel = GST_OUTPUT_SELECTOR (element);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1879
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1880
+  GST_DEBUG_OBJECT (osel, "requesting pad");
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1881
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1882
+  GST_OBJECT_LOCK (osel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1883
+  padname = g_strdup_printf ("src%d", osel->nb_srcpads++);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1884
+  srcpad = gst_pad_new_from_template (templ, padname);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1885
+  GST_OBJECT_UNLOCK (osel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1886
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1887
+  gst_pad_set_active (srcpad, TRUE);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1888
+  gst_element_add_pad (GST_ELEMENT (osel), srcpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1889
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1890
+  /* Set the first requested src pad as active by default */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1891
+  if (osel->active_srcpad == NULL) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1892
+    osel->active_srcpad = srcpad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1893
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1894
+  g_free (padname);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1895
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1896
+  return srcpad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1897
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1898
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1899
+static void
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1900
+gst_output_selector_release_pad (GstElement * element, GstPad * pad)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1901
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1902
+  GstOutputSelector *osel;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1903
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1904
+  osel = GST_OUTPUT_SELECTOR (element);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1905
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1906
+  GST_DEBUG_OBJECT (osel, "releasing pad");
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1907
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1908
+  gst_pad_set_active (pad, FALSE);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1909
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1910
+  gst_element_remove_pad (GST_ELEMENT_CAST (osel), pad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1911
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1912
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1913
+static gboolean
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1914
+gst_output_selector_switch (GstOutputSelector * osel)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1915
+{
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1916
+  gboolean res = FALSE;
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1917
+  GstEvent *ev = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1918
+  GstSegment *seg = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1919
+  gint64 start = 0, position = 0;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1920
+
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1921
+  /* Switch */
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1922
+  GST_OBJECT_LOCK (GST_OBJECT (osel));
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1923
+  GST_INFO ("switching to pad %" GST_PTR_FORMAT, osel->pending_srcpad);
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1924
+  if (gst_pad_is_linked (osel->pending_srcpad)) {
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1925
+    osel->active_srcpad = osel->pending_srcpad;
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1926
+    res = TRUE;
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1927
+  }
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1928
+  gst_object_unref (osel->pending_srcpad);
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1929
+  osel->pending_srcpad = NULL;
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1930
+  GST_OBJECT_UNLOCK (GST_OBJECT (osel));
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1931
+
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1932
+  /* Send NEWSEGMENT event and latest buffer if switching succeeded */
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1933
+  if (res) {
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1934
+    /* Send NEWSEGMENT to the pad we are going to switch to */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1935
+    seg = &osel->segment;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1936
+    /* If resending then mark newsegment start and position accordingly */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1937
+    if (osel->resend_latest && osel->latest_buffer &&
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1938
+        GST_BUFFER_TIMESTAMP_IS_VALID (osel->latest_buffer)) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1939
+      start = position = GST_BUFFER_TIMESTAMP (osel->latest_buffer);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1940
+    } else {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1941
+      start = position = seg->last_stop;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1942
+    }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1943
+    ev = gst_event_new_new_segment (TRUE, seg->rate,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1944
+        seg->format, start, seg->stop, position);
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1945
+    if (!gst_pad_push_event (osel->active_srcpad, ev)) {
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1946
+      GST_WARNING_OBJECT (osel,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1947
+          "newsegment handling failed in %" GST_PTR_FORMAT,
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1948
+          osel->active_srcpad);
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1949
+    }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1950
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1951
+    /* Resend latest buffer to newly switched pad */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1952
+    if (osel->resend_latest && osel->latest_buffer) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1953
+      GST_INFO ("resending latest buffer");
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1954
+      gst_pad_push (osel->active_srcpad, osel->latest_buffer);
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1955
+      osel->latest_buffer = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1956
+    }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1957
+  } else {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1958
+    GST_WARNING_OBJECT (osel, "switch failed, pad not linked");
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1959
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1960
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1961
+  return res;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1962
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1963
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1964
+static GstFlowReturn
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1965
+gst_output_selector_chain (GstPad * pad, GstBuffer * buf)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1966
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1967
+  GstFlowReturn res;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1968
+  GstOutputSelector *osel;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1969
+  GstClockTime last_stop, duration;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1970
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1971
+  osel = GST_OUTPUT_SELECTOR (gst_pad_get_parent (pad));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1972
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1973
+  if (osel->pending_srcpad) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1974
+    /* Do the switch */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1975
+    gst_output_selector_switch (osel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1976
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1977
+
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1978
+  if (osel->latest_buffer) {
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1979
+    gst_buffer_unref (osel->latest_buffer);
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1980
+    osel->latest_buffer = NULL;
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1981
+  }
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1982
+
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1983
+  if (osel->resend_latest) {
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1984
+    /* Keep reference to latest buffer to resend it after switch */
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1985
+    osel->latest_buffer = gst_buffer_ref (buf);
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  1986
+  }
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1987
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1988
+  /* Keep track of last stop and use it in NEWSEGMENT start after 
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1989
+     switching to a new src pad */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1990
+  last_stop = GST_BUFFER_TIMESTAMP (buf);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1991
+  if (GST_CLOCK_TIME_IS_VALID (last_stop)) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1992
+    duration = GST_BUFFER_DURATION (buf);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1993
+    if (GST_CLOCK_TIME_IS_VALID (duration)) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1994
+      last_stop += duration;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1995
+    }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1996
+    GST_LOG_OBJECT (osel, "setting last stop %" GST_TIME_FORMAT,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1997
+        GST_TIME_ARGS (last_stop));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1998
+    gst_segment_set_last_stop (&osel->segment, osel->segment.format, last_stop);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  1999
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2000
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2001
+  GST_LOG_OBJECT (osel, "pushing buffer to %" GST_PTR_FORMAT,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2002
+      osel->active_srcpad);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2003
+  res = gst_pad_push (osel->active_srcpad, buf);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2004
+  gst_object_unref (osel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2005
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2006
+  return res;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2007
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2008
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2009
+static GstStateChangeReturn
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2010
+gst_output_selector_change_state (GstElement * element,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2011
+    GstStateChange transition)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2012
+{
15812
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2013
+  GstOutputSelector *sel;
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2014
+  GstStateChangeReturn result;
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2015
+
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2016
+  sel = GST_OUTPUT_SELECTOR (element);
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2017
+
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2018
+  switch (transition) {
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2019
+    case GST_STATE_CHANGE_READY_TO_PAUSED:
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2020
+      break;
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2021
+    default:
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2022
+      break;
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2023
+  }
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2024
+
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2025
+  result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2026
+
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2027
+  switch (transition) {
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2028
+    case GST_STATE_CHANGE_PAUSED_TO_READY:
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2029
+      gst_output_selector_reset (sel);
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2030
+      break;
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2031
+    default:
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2032
+      break;
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2033
+  }
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2034
+
44dccb98fc14 2009-05-26 Brian Cameron <[email protected]>
yippi
parents: 15203
diff changeset
  2035
+  return result;
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2036
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2037
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2038
+static gboolean
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2039
+gst_output_selector_handle_sink_event (GstPad * pad, GstEvent * event)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2040
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2041
+  gboolean res = TRUE;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2042
+  GstOutputSelector *sel;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2043
+  GstPad *output_pad = NULL;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2044
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2045
+  sel = GST_OUTPUT_SELECTOR (gst_pad_get_parent (pad));
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2046
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2047
+  switch (GST_EVENT_TYPE (event)) {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2048
+    case GST_EVENT_NEWSEGMENT:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2049
+    {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2050
+      gboolean update;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2051
+      GstFormat format;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2052
+      gdouble rate, arate;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2053
+      gint64 start, stop, time;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2054
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2055
+      gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2056
+          &start, &stop, &time);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2057
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2058
+      GST_DEBUG_OBJECT (sel,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2059
+          "configured NEWSEGMENT update %d, rate %lf, applied rate %lf, "
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2060
+          "format %d, " "%" G_GINT64_FORMAT " -- %" G_GINT64_FORMAT ", time %"
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2061
+          G_GINT64_FORMAT, update, rate, arate, format, start, stop, time);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2062
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2063
+      gst_segment_set_newsegment_full (&sel->segment, update,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2064
+          rate, arate, format, start, stop, time);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2065
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2066
+      /* Send newsegment to all src pads */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2067
+      gst_pad_event_default (pad, event);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2068
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2069
+    }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2070
+    case GST_EVENT_EOS:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2071
+      /* Send eos to all src pads */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2072
+      gst_pad_event_default (pad, event);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2073
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2074
+    default:
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2075
+      /* Send other events to pending or active src pad */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2076
+      output_pad =
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2077
+          sel->pending_srcpad ? sel->pending_srcpad : sel->active_srcpad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2078
+      res = gst_pad_push_event (output_pad, event);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2079
+      break;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2080
+  }
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2081
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2082
+  gst_object_unref (sel);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2083
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2084
+  return res;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2085
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2086
--- /dev/null	2008-12-16 15:34:15.000000000 +0800
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  2087
+++ gst-plugins-good-0.10.21/gst/selector/gstoutputselector.h	2008-12-16 15:09:01.073579304 +0800
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2088
@@ -0,0 +1,66 @@
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2089
+/* GStreamer
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2090
+ * Copyright (C) 2008 Nokia Corporation. (contact <[email protected]>)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2091
+ *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2092
+ * This library is free software; you can redistribute it and/or
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2093
+ * modify it under the terms of the GNU Library General Public
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2094
+ * License as published by the Free Software Foundation; either
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2095
+ * version 2 of the License, or (at your option) any later version.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2096
+ *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2097
+ * This library is distributed in the hope that it will be useful,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2098
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2099
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2100
+ * Library General Public License for more details.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2101
+ *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2102
+ * You should have received a copy of the GNU Library General Public
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2103
+ * License along with this library; if not, write to the
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2104
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2105
+ * Boston, MA 02111-1307, USA.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2106
+ */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2107
+ 
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2108
+#ifndef __GST_OUTPUT_SELECTOR_H__
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2109
+#define __GST_OUTPUT_SELECTOR_H__
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2110
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2111
+#include <gst/gst.h>
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2112
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2113
+G_BEGIN_DECLS
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2114
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2115
+#define GST_TYPE_OUTPUT_SELECTOR \
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2116
+  (gst_output_selector_get_type())
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2117
+#define GST_OUTPUT_SELECTOR(obj) \
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2118
+  (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_OUTPUT_SELECTOR, GstOutputSelector))
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2119
+#define GST_OUTPUT_SELECTOR_CLASS(klass) \
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2120
+  (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_OUTPUT_SELECTOR, GstOutputSelectorClass))
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2121
+#define GST_IS_OUTPUT_SELECTOR(obj) \
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2122
+  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_OUTPUT_SELECTOR))
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2123
+#define GST_IS_OUTPUT_SELECTOR_CLASS(klass) \
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2124
+  (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_OUTPUT_SELECTOR))
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2125
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2126
+typedef struct _GstOutputSelector GstOutputSelector;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2127
+typedef struct _GstOutputSelectorClass GstOutputSelectorClass;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2128
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2129
+struct _GstOutputSelector {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2130
+  GstElement element;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2131
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2132
+  GstPad *sinkpad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2133
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2134
+  GstPad *active_srcpad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2135
+  GstPad *pending_srcpad;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2136
+  guint nb_srcpads;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2137
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2138
+  GstSegment segment;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2139
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2140
+  /* resend latest buffer after switch */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2141
+  gboolean resend_latest;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2142
+  GstBuffer *latest_buffer;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2143
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2144
+};
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2145
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2146
+struct _GstOutputSelectorClass {
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2147
+  GstElementClass parent_class;
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2148
+};
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2149
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2150
+GType gst_output_selector_get_type (void);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2151
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2152
+G_END_DECLS
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2153
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2154
+#endif /* __GST_OUTPUT_SELECTOR_H__ */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2155
--- /dev/null	2008-12-16 15:34:15.000000000 +0800
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  2156
+++ gst-plugins-good-0.10.21/gst/selector/gstselector.c	2008-12-16 15:09:01.090104873 +0800
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2157
@@ -0,0 +1,44 @@
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2158
+/* GStreamer
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2159
+ * Copyright (C) 2008 Nokia Corporation. (contact <[email protected]>)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2160
+ *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2161
+ * This library is free software; you can redistribute it and/or
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2162
+ * modify it under the terms of the GNU Library General Public
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2163
+ * License as published by the Free Software Foundation; either
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2164
+ * version 2 of the License, or (at your option) any later version.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2165
+ *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2166
+ * This library is distributed in the hope that it will be useful,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2167
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2168
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2169
+ * Library General Public License for more details.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2170
+ *
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2171
+ * You should have received a copy of the GNU Library General Public
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2172
+ * License along with this library; if not, write to the
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2173
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2174
+ * Boston, MA 02111-1307, USA.
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2175
+ */
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2176
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2177
+#ifdef HAVE_CONFIG_H
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2178
+#include "config.h"
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2179
+#endif
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2180
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2181
+#include <gst/gst.h>
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2182
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2183
+#include "gstinputselector.h"
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2184
+#include "gstoutputselector.h"
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2185
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2186
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2187
+static gboolean
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2188
+plugin_init (GstPlugin * plugin)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2189
+{
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2190
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2191
+  return gst_element_register (plugin, "input-selector",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2192
+      GST_RANK_NONE, GST_TYPE_INPUT_SELECTOR) &&
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2193
+      gst_element_register (plugin, "output-selector",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2194
+      GST_RANK_NONE, GST_TYPE_OUTPUT_SELECTOR);
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2195
+}
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2196
+
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2197
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2198
+    GST_VERSION_MINOR,
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2199
+    "selector",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2200
+    "input/output stream selector elements",
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2201
+    plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2202
--- /dev/null	2008-12-20 18:00:51.000000000 +0800
17776
3fe9eb67326b 2010-03-29 Brian Cameron <[email protected]>
yippi
parents: 17680
diff changeset
  2203
+++ gst-plugins-good-0.10.21/gst/selector/gstselector-marshal.list	2008-12-16 15:09:01.089768915 +0800
15203
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2204
@@ -0,0 +1,2 @@
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2205
+INT64:VOID
5acfa57a5c09 rename gst-plugins-good-06-selector.diff to *-04-*
davelam
parents:
diff changeset
  2206
+VOID:OBJECT,INT64,INT64
17680
5f8f8e10b79b 2010-03-11 Christian Kelly <[email protected]>
chrisk
parents: 16441
diff changeset
  2207
diff -ruN gst-plugins-good-0.10.21.rig/configure.ac gst-plugins-good-0.10.21/configure.ac
5f8f8e10b79b 2010-03-11 Christian Kelly <[email protected]>
chrisk
parents: 16441
diff changeset
  2208
--- gst-plugins-good-0.10.21.rig/configure.ac	2010-03-11 23:23:18.783135772 +0000
5f8f8e10b79b 2010-03-11 Christian Kelly <[email protected]>
chrisk
parents: 16441
diff changeset
  2209
+++ gst-plugins-good-0.10.21/configure.ac	2010-03-11 23:24:00.041240170 +0000
5f8f8e10b79b 2010-03-11 Christian Kelly <[email protected]>
chrisk
parents: 16441
diff changeset
  2210
@@ -316,6 +316,7 @@
5f8f8e10b79b 2010-03-11 Christian Kelly <[email protected]>
chrisk
parents: 16441
diff changeset
  2211
 AG_GST_CHECK_PLUGIN(rtp)
5f8f8e10b79b 2010-03-11 Christian Kelly <[email protected]>
chrisk
parents: 16441
diff changeset
  2212
 AG_GST_CHECK_PLUGIN(rtpmanager)
5f8f8e10b79b 2010-03-11 Christian Kelly <[email protected]>
chrisk
parents: 16441
diff changeset
  2213
 AG_GST_CHECK_PLUGIN(rtsp)
5f8f8e10b79b 2010-03-11 Christian Kelly <[email protected]>
chrisk
parents: 16441
diff changeset
  2214
+AG_GST_CHECK_PLUGIN(selector)
5f8f8e10b79b 2010-03-11 Christian Kelly <[email protected]>
chrisk
parents: 16441
diff changeset
  2215
 AG_GST_CHECK_PLUGIN(shapewipe)
5f8f8e10b79b 2010-03-11 Christian Kelly <[email protected]>
chrisk
parents: 16441
diff changeset
  2216
 AG_GST_CHECK_PLUGIN(smpte)
5f8f8e10b79b 2010-03-11 Christian Kelly <[email protected]>
chrisk
parents: 16441
diff changeset
  2217
 AG_GST_CHECK_PLUGIN(spectrum)
5f8f8e10b79b 2010-03-11 Christian Kelly <[email protected]>
chrisk
parents: 16441
diff changeset
  2218
@@ -1104,6 +1105,7 @@
5f8f8e10b79b 2010-03-11 Christian Kelly <[email protected]>
chrisk
parents: 16441
diff changeset
  2219
 gst/rtp/Makefile
5f8f8e10b79b 2010-03-11 Christian Kelly <[email protected]>
chrisk
parents: 16441
diff changeset
  2220
 gst/rtpmanager/Makefile
5f8f8e10b79b 2010-03-11 Christian Kelly <[email protected]>
chrisk
parents: 16441
diff changeset
  2221
 gst/rtsp/Makefile
5f8f8e10b79b 2010-03-11 Christian Kelly <[email protected]>
chrisk
parents: 16441
diff changeset
  2222
+gst/selector/Makefile
5f8f8e10b79b 2010-03-11 Christian Kelly <[email protected]>
chrisk
parents: 16441
diff changeset
  2223
 gst/shapewipe/Makefile
5f8f8e10b79b 2010-03-11 Christian Kelly <[email protected]>
chrisk
parents: 16441
diff changeset
  2224
 gst/smpte/Makefile
5f8f8e10b79b 2010-03-11 Christian Kelly <[email protected]>
chrisk
parents: 16441
diff changeset
  2225
 gst/spectrum/Makefile