00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef QGST_ELEMENT_H
00018 #define QGST_ELEMENT_H
00019
00020 #include "object.h"
00021 #include "caps.h"
00022 #include "clocktime.h"
00023
00024 #if !QGLIB_HAVE_CXX0X
00025 # include <boost/preprocessor.hpp>
00026 #endif
00027
00028 namespace QGst {
00029
00033 class QTGSTREAMER_EXPORT Element : public Object
00034 {
00035 QGST_WRAPPER(Element)
00036 public:
00037 State currentState() const;
00038 State pendingState() const;
00039 StateChangeReturn getState(State *state, State *pending, ClockTime timeout) const;
00040 StateChangeReturn setState(State state);
00041 bool syncStateWithParent();
00042
00043 bool stateIsLocked() const;
00044 bool setStateLocked(bool locked);
00045
00046 bool addPad(const PadPtr & pad);
00047 PadPtr getStaticPad(const char *name);
00048 PadPtr getRequestPad(const char *name);
00049 void releaseRequestPad(const PadPtr & pad);
00050
00051 ClockPtr clock() const;
00052 bool setClock(const ClockPtr & clock);
00053
00054 bool link(const char *srcPadName, const ElementPtr & dest,
00055 const char *sinkPadName, const CapsPtr & filter = CapsPtr());
00056 bool link(const char *srcPadName, const ElementPtr & dest,
00057 const CapsPtr & filter = CapsPtr());
00058 bool link(const ElementPtr & dest, const char *sinkPadName,
00059 const CapsPtr & filter = CapsPtr());
00060 bool link(const ElementPtr & dest, const CapsPtr & filter = CapsPtr());
00061
00062 void unlink(const char *srcPadName, const ElementPtr & dest,
00063 const char *sinkPadName = NULL);
00064 void unlink(const ElementPtr & dest, const char *sinkPadName = NULL);
00065
00066 #ifndef DOXYGEN_RUN
00067 private:
00068 static inline bool linkMany(const ElementPtr & first, const ElementPtr & second)
00069 {
00070 return first->link(second);
00071 }
00072
00073 static inline void unlinkMany(const ElementPtr & first, const ElementPtr & second)
00074 {
00075 first->unlink(second);
00076 }
00077 public:
00078 #endif
00079
00080 #if QGLIB_HAVE_CXX0X
00081
00087 template <typename First, typename Second, typename Third, typename... Rest>
00088 static inline bool linkMany(const First & first, const Second & second,
00089 const Third & third, const Rest & ... rest)
00090 {
00091 if (!first->link(second)) return false;
00092 return linkMany(second, third, rest...);
00093 }
00094
00101 template <typename First, typename Second, typename Third, typename... Rest>
00102 static inline void unlinkMany(const First & first, const Second & second,
00103 const Third & third, const Rest & ... rest)
00104 {
00105 first->unlink(second);
00106 unlinkMany(second, third, rest...);
00107 }
00108 #else //QGLIB_HAVE_CXX0X
00109
00110 # ifndef QGST_ELEMENT_LINK_MANY_MAX_ARGS
00111 # define QGST_ELEMENT_LINK_MANY_MAX_ARGS 10
00112 # endif
00113
00114 # ifndef QGST_ELEMENT_UNLINK_MANY_MAX_ARGS
00115 # define QGST_ELEMENT_UNLINK_MANY_MAX_ARGS 10
00116 # endif
00117
00118 # define QGST_ELEMENT_LINK_MANY_DECLARATION(z, n, data) \
00119 static inline bool linkMany(BOOST_PP_ENUM_PARAMS(n, const ElementPtr & e)) \
00120 { \
00121 if (!e0->link(e1)) return false; \
00122 return linkMany(BOOST_PP_ENUM_SHIFTED_PARAMS(n, e)); \
00123 };
00124
00125 # define QGST_ELEMENT_UNLINK_MANY_DECLARATION(z, n, data) \
00126 static inline void unlinkMany(BOOST_PP_ENUM_PARAMS(n, const ElementPtr & e)) \
00127 { \
00128 e0->unlink(e1); \
00129 unlinkMany(BOOST_PP_ENUM_SHIFTED_PARAMS(n, e)); \
00130 };
00131
00132 BOOST_PP_REPEAT_FROM_TO(3, BOOST_PP_INC(QGST_ELEMENT_LINK_MANY_MAX_ARGS),
00133 QGST_ELEMENT_LINK_MANY_DECLARATION, dummy)
00134 BOOST_PP_REPEAT_FROM_TO(3, BOOST_PP_INC(QGST_ELEMENT_UNLINK_MANY_MAX_ARGS),
00135 QGST_ELEMENT_UNLINK_MANY_DECLARATION, dummy)
00136
00137 # undef QGST_ELEMENT_LINK_MANY_DECLARATION
00138 # undef QGST_ELEMENT_UNLINK_MANY_DECLARATION
00139
00140 #endif //QGLIB_HAVE_CXX0X
00141
00142 bool query(const QueryPtr & query);
00143 bool sendEvent(const EventPtr & event);
00144 bool seek(Format format, SeekFlags flags, quint64 position);
00145 };
00146
00147 }
00148
00149 QGST_REGISTER_TYPE(QGst::Element)
00150
00151 #endif // QGST_ELEMENT_H