QtGStreamer 0.10.1
|
00001 /* 00002 Copyright (C) 2009-2010 George Kiagiadakis <kiagiadakis.george@gmail.com> 00003 Copyright (C) 2011 Collabora Ltd. 00004 @author George Kiagiadakis <george.kiagiadakis@collabora.co.uk> 00005 00006 This library is free software; you can redistribute it and/or modify 00007 it under the terms of the GNU Lesser General Public License as published 00008 by the Free Software Foundation; either version 2.1 of the License, or 00009 (at your option) any later version. 00010 00011 This program is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 GNU General Public License for more details. 00015 00016 You should have received a copy of the GNU Lesser General Public License 00017 along with this program. If not, see <http://www.gnu.org/licenses/>. 00018 */ 00019 #ifndef QGST_BIN_H 00020 #define QGST_BIN_H 00021 00022 #include "element.h" 00023 #include "childproxy.h" 00024 00025 #ifdef Q_CC_MSVC 00026 # pragma warning(push) 00027 # pragma warning(disable:4250) //Bin inherits QGst::Object::ref/unref via dominance 00028 #endif 00029 00030 #if !QGLIB_HAVE_CXX0X 00031 # include <boost/preprocessor.hpp> 00032 #endif 00033 00034 namespace QGst { 00035 00045 class QTGSTREAMER_EXPORT Bin : public Element, public ChildProxy 00046 { 00047 QGST_WRAPPER(Bin) 00048 public: 00050 static BinPtr create(const char *name = NULL); 00051 00053 enum BinFromDescriptionOption { //codegen: skip=true 00054 NoGhost = 0, 00055 Ghost = 1 00056 }; 00057 00066 static BinPtr fromDescription(const char *description, 00067 BinFromDescriptionOption ghostUnlinkedPads = Ghost); 00069 static inline BinPtr fromDescription(const QString & description, 00070 BinFromDescriptionOption ghostUnlinkedPads = Ghost); 00071 00078 bool add(const ElementPtr & element); 00079 00080 #if QGLIB_HAVE_CXX0X 00081 00082 # ifndef DOXYGEN_RUN 00083 private: 00084 inline void add() {} //terminate condition for the variadic template recursion 00085 public: 00086 # endif 00087 00095 template <typename First, typename Second, typename... Rest> 00096 inline void add(const First & first, const Second & second, const Rest & ... rest) 00097 { 00098 add(first); 00099 add(second); 00100 add(rest...); 00101 } 00102 00103 #else //QGLIB_HAVE_CXX0X 00104 00105 # ifndef QGST_BIN_ADD_MAX_ARGS 00106 # define QGST_BIN_ADD_MAX_ARGS 10 00107 # endif 00108 00109 # define QGST_BIN_ADD_DECLARATION(z, n, data) \ 00110 inline void add(BOOST_PP_ENUM_PARAMS(n, const ElementPtr & e)) \ 00111 { \ 00112 add(e0); \ 00113 add(BOOST_PP_ENUM_SHIFTED_PARAMS(n, e)); \ 00114 }; 00115 00116 BOOST_PP_REPEAT_FROM_TO(2, BOOST_PP_INC(QGST_BIN_ADD_MAX_ARGS), QGST_BIN_ADD_DECLARATION, dummy) 00117 00118 # undef QGST_BIN_ADD_DECLARATION 00119 00120 #endif //QGLIB_HAVE_CXX0X 00121 00127 bool remove(const ElementPtr & element); 00128 00132 enum RecursionType { //codegen: skip=true 00134 RecurseDown, 00138 RecurseUp 00139 }; 00140 00147 ElementPtr getElementByName(const char *name, RecursionType recursionType = RecurseDown) const; 00148 00150 ElementPtr getElementByInterface(QGlib::Type interfaceType) const; 00151 00158 template <typename T> QGlib::RefPointer<T> getElementByInterface() const; 00159 00163 PadPtr findUnlinkedPad(PadDirection direction) const; 00164 00165 bool recalculateLatency(); 00166 }; 00167 00168 inline BinPtr Bin::fromDescription(const QString & description, 00169 BinFromDescriptionOption ghostUnlinkedPads) 00170 { 00171 return fromDescription(description.toUtf8().constData(), ghostUnlinkedPads); 00172 } 00173 00174 template <typename T> 00175 QGlib::RefPointer<T> Bin::getElementByInterface() const 00176 { 00177 ElementPtr p = getElementByInterface(QGlib::GetType<T>()); 00178 return p.dynamicCast<T>(); 00179 } 00180 00181 } //namespace QGst 00182 00183 QGST_REGISTER_TYPE(QGst::Bin) 00184 00185 #ifdef Q_CC_MSVC 00186 # pragma warning(pop) 00187 #endif 00188 00189 #endif