From 2b0ea4650bf074257792f1e1d0c13c5ba8044f23 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Fri, 31 Aug 2007 14:57:49 +0200 Subject: [PATCH 1/8] reworked factory to get better separation of concerns. But custom allocation can't be done as I intended --- src/common/factory.hpp | 155 +++++++++++++++--------- src/tool/try.cpp | 9 +- tests/components/common/factorytest.cpp | 7 +- 3 files changed, 105 insertions(+), 66 deletions(-) diff --git a/src/common/factory.hpp b/src/common/factory.hpp index bb2a28fee..2c24d697b 100644 --- a/src/common/factory.hpp +++ b/src/common/factory.hpp @@ -30,51 +30,10 @@ namespace cinelerra { - - namespace factory{ class VanillaAllocator; }//////////////////////////////////TODO - - /** - * Configurable template for creating Factory classes. - * These encapsulate the creating of new objects, indeed - * delegating the memory allocation to the backend layer. - * The clients get just a smart-pointer or similar handle - * to the created object, which will manage the ownership. - * - * The provided default implementation uses just std::auto_ptr, - * but delegates the allocation to cinelerra's backend-layer. - * - */ - template - < - class T, // the product to be created - template class SMP = std::auto_ptr,// smart-pointer actually returned - class ALO = factory::VanillaAllocator // Allocator facility to be used //////////////TODO - > - class Factory : protected ALO - { - public: - /** Object creating facility. - * Intended to be over/written/ with a variant taking - * the appropriate number of parameters and using the - * (privately inherited) functions of the allocator. - * Note: non-virtual. - */ - SMP operator() (){ return SMP (new T ); }; - - typedef SMP ptype; - - private: - void operator= (const Factory&); // copy prohibited - }; - - - - /* -- some example and default instantiiations -- */ - namespace factory { /** - * Example Allocator using just the normal C++ memory management. + * Example NOP Allocator using just the normal C++ memory management. * The intended use is for a Factory instance to iherit from this class. * Specialized Allocators typically overload operator new and delete. */ @@ -88,42 +47,124 @@ namespace cinelerra void* operator new (size_t siz) { return malloc (siz); }; void operator delete (void* p) { if (p) free (p); }; }; + + typedef VanillaAllocator DefaultALO; // Allocator facility to be used by default //////////////TODO + /** + * Wrapping any object created by the Factory into some smart ptr class. + * The Factory class inherits this functionallity, so it can be exchanged + * independently from the actual object creation behaviour. For example, + * an Factory implementing some elaborate subclass creation scheme could + * be intantiated to either procuce auto-ptrs or shared-ptrs. + */ + template + < class T, // the product to be created + class SMP =std::auto_ptr // smart-pointer actually returned + > + class Wrapper + { + protected: + SMP wrap (T* product) { return SMP (product); } + + public: + typedef SMP PType; + }; + + + /** + * Basic Factory Template, for definig flexible Factory classes. + * These encapsulate the logic for creating of new objects, maybe + * delegating the memory allocation to the backend layer. Usually, + * the clients get just a smart-pointer or similar handle to the + * created object, which will manage the ownership. + * + * The provided default implementation uses just std::auto_ptr, + * but delegates the allocation to cinelerra's backend-layer. + * + * @todo actually do the delgation of memory management instead of using VanillaAllocator! + */ + template + < class T, // the product to be created + class WR = Wrapper, // used for fabricating the wrapper + class ALO = DefaultALO // Allocator facility to be used + > + class Factory : public WR, protected ALO + { + public: + /** Object creating facility. + * Intended to be over/written/ with a variant taking + * the appropriate number of parameters and using the + * (privately inherited) functions of the allocator. + * Note: non-virtual. + */ + typename WR::PType operator() () { return wrap (new T ); } + + }; + + + + + /* -- some example and default instantiiations -- */ using std::tr1::shared_ptr; - /** a frequently used instantiation of the Factory, - * using the refcounting shared_ptr from Boost - * and for allocation just our default Allocator + /** + * a frequently used instantiation of the Wrapper, + * utilizingthe refcounting shared_ptr from Boost. */ template - class RefcountPtr : public Factory + class Wrapper > { - /** let the smart-Ptr use the custom operator delete, + /** let the smart-ptr use the custom operator delete, * which may be defined in our Allocator baseclass. */ static void destroy (T* victim) { delete victim; }; + protected: + shared_ptr wrap (T* product) { return shared_ptr (product, &destroy ); } public: - shared_ptr operator() () { return shared_ptr (new T, &destroy ); } + typedef shared_ptr PType; }; - - - /** another convienience instantiiation: auto_ptr-Factory, - * actually creating a subclass of the returned type + + + /** + * Shortcut: commonly used (partial) instantiation of the Factory, + * generating refcounting shared_ptr wrapped Objects. */ - template - class SubclassPtr : public Factory + template + < class T, // the product to be created + class ALO = DefaultALO // Allocator facility to be used + > + class RefcountPtr : public Factory >, ALO> { - typedef std::auto_ptr aP; - public: - aP operator() (){ return aP (new TImpl ); }; + typedef shared_ptr PType; + }; + + + /** + * another convienience instantiiation: auto_ptr-to-Impl-Factory. + * Creating an implementation subclass and wraps into auto_ptr. + */ + template + < class T, // Interface class + class TImpl, // Implementation class to be created + class ALO = DefaultALO // Allocator facility to be used + > + class PImplPtr : public Factory, ALO> + { + public: + typedef std::auto_ptr PType; + PType operator() (){ return wrap (new TImpl); }; }; } // namespace factory + /// @note Factory can be usable as-is (wraps into std::auto_ptr) + using factory::Factory; + + } // namespace cinelerra #endif diff --git a/src/tool/try.cpp b/src/tool/try.cpp index b948ada31..7d3a0783f 100644 --- a/src/tool/try.cpp +++ b/src/tool/try.cpp @@ -4,25 +4,22 @@ */ // 8/07 - how to control NOBUG?? +// execute with NOBUG_LOG='ttt:TRACE' bin/try #include -#define NOBUG_LOG_LIMIT LOG_ERR #include -NOBUG_DECLARE_FLAG(ttt); - -NOBUG_DEFINE_FLAG(ttt); +//NOBUG_CPP_DEFINE_FLAG(ttt); +NOBUG_CPP_DEFINE_FLAG_LIMIT(ttt, LOG_WARNING); int main (int argc, char* argv[]) { NOBUG_INIT; - NOBUG_INIT_FLAG_LIMIT(ttt, LOG_WARNING); - TRACE(ttt,"trace"); INFO(ttt,"info"); NOTICE(ttt,"notice"); diff --git a/tests/components/common/factorytest.cpp b/tests/components/common/factorytest.cpp index b3038faf4..8358ed2a3 100644 --- a/tests/components/common/factorytest.cpp +++ b/tests/components/common/factorytest.cpp @@ -68,6 +68,8 @@ namespace cinelerra } + /// @todo: make it possible to have a private destructor + public: ~TargetObj() throw() { delete heapData_; @@ -107,7 +109,6 @@ namespace cinelerra */ class ObjFactory : public factory::RefcountPtr { - static void destroy (TargetObj* victim) { delete victim; }; public: /** specialized Factory method for creating TargetObj instances. * Here, we invoke a special constructor, but basically we could @@ -115,14 +116,14 @@ namespace cinelerra * registering objects etc. Further, we could have used a * custom allocator or a special deleter function. */ - ptype operator() (uint param){ return ptype (new TargetObj (param), &destroy); }; + PType operator() (uint param) { return wrap (new TargetObj(param) ); } }; /** shorthand for the created smart-pointer class, * here it's a (refcounting) boost::shared_ptr */ - typedef ObjFactory::ptype pTarget; + typedef ObjFactory::PType pTarget; ObjFactory TargetObj::create; From b11ac46b76357f837efb426abe62fe41dbab4fbe Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Fri, 31 Aug 2007 16:25:04 +0200 Subject: [PATCH 2/8] added possibility to pass a custom deleter function down to shared_ptr. Note: actually all of this seems against the spirit of C++ (and OO in general). This is a do-it-yourself aproach which adds far to much complexity (accidental, not fundamental complexity). So I checked it in for the record, but will abandon this aproach and rely on overloading of operator new / delete if necessary (and when we really need it) --- src/common/factory.hpp | 38 ++++++++++++++++++++----- tests/components/common/factorytest.cpp | 10 +++++-- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/common/factory.hpp b/src/common/factory.hpp index 2c24d697b..1adc44e69 100644 --- a/src/common/factory.hpp +++ b/src/common/factory.hpp @@ -65,9 +65,13 @@ namespace cinelerra { protected: SMP wrap (T* product) { return SMP (product); } + public: typedef SMP PType; + + typedef void (*DelHandler) (T* victim); ///< custom deleter function + void setDelHandler (DelHandler) {}; ///< if non-standard deleting is necessary }; @@ -99,6 +103,12 @@ namespace cinelerra */ typename WR::PType operator() () { return wrap (new T ); } + protected: + /** this custom deleter function can be used if the + * operator delete call needs to be in the current scope. + * @see RefcountPtr + */ + static void destroy (T* victim) { delete victim; }; }; @@ -110,26 +120,34 @@ namespace cinelerra /** * a frequently used instantiation of the Wrapper, - * utilizingthe refcounting shared_ptr from Boost. + * utilizing the refcounting shared_ptr from Boost. */ template class Wrapper > { - /** let the smart-ptr use the custom operator delete, - * which may be defined in our Allocator baseclass. - */ - static void destroy (T* victim) { delete victim; }; protected: - shared_ptr wrap (T* product) { return shared_ptr (product, &destroy ); } + shared_ptr wrap (T* product) { return shared_ptr (product, destroy_ ); } + public: typedef shared_ptr PType; + + + Wrapper () : destroy_(&stdDelete) { } + + typedef void (*DelHandler) (T* victim); ///< custom deleter function + void setDelHandler (DelHandler d) { this->destroy_ = d; } ///< custom deleter used by shard_ptr + + private: + DelHandler destroy_; + static void stdDelete (T* victim) { delete victim; }; ///< by default just delete objects normally }; /** * Shortcut: commonly used (partial) instantiation of the Factory, - * generating refcounting shared_ptr wrapped Objects. + * generating refcounting shared_ptr wrapped Objects. Built upon + * the corresponding special intstantiation of the Wrapper template. */ template < class T, // the product to be created @@ -139,6 +157,12 @@ namespace cinelerra { public: typedef shared_ptr PType; + + /** especially the shared_ptr will use Factory::destroy, + * so it is sufficient to make Factory a friend if the + * Target class to be produced has private ctor/dtors + */ + RefcountPtr() { setDelHandler(&this->destroy); } }; diff --git a/tests/components/common/factorytest.cpp b/tests/components/common/factorytest.cpp index 8358ed2a3..877c9ff8e 100644 --- a/tests/components/common/factorytest.cpp +++ b/tests/components/common/factorytest.cpp @@ -68,8 +68,6 @@ namespace cinelerra } - /// @todo: make it possible to have a private destructor - public: ~TargetObj() throw() { delete heapData_; @@ -117,6 +115,14 @@ namespace cinelerra * custom allocator or a special deleter function. */ PType operator() (uint param) { return wrap (new TargetObj(param) ); } + + ObjFactory () { setDelHandler(&destroy); } + + protected: + /** define a custom deleter function, so the actual destrucor call + * happenes within the scope of ObjFactory, which is friend of TargetObj + */ + static void destroy (TargetObj* victim) { delete victim; }; }; From b1ea774ef1c2125a92cea69d4555e200aee16789 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Fri, 31 Aug 2007 16:53:23 +0200 Subject: [PATCH 3/8] removed all custom allocator / deleter stuff (it's the wrong aproach) --- src/common/factory.hpp | 79 +++++-------------------- tests/components/common/factorytest.cpp | 8 +-- 2 files changed, 15 insertions(+), 72 deletions(-) diff --git a/src/common/factory.hpp b/src/common/factory.hpp index 1adc44e69..c9948fcc6 100644 --- a/src/common/factory.hpp +++ b/src/common/factory.hpp @@ -32,24 +32,6 @@ namespace cinelerra { namespace factory { - /** - * Example NOP Allocator using just the normal C++ memory management. - * The intended use is for a Factory instance to iherit from this class. - * Specialized Allocators typically overload operator new and delete. - */ - class VanillaAllocator {}; - - /** - * Example Allocator using plain C memory management. - */ - class MallocAllocator - { - void* operator new (size_t siz) { return malloc (siz); }; - void operator delete (void* p) { if (p) free (p); }; - }; - - typedef VanillaAllocator DefaultALO; // Allocator facility to be used by default //////////////TODO - /** * Wrapping any object created by the Factory into some smart ptr class. * The Factory class inherits this functionallity, so it can be exchanged @@ -66,12 +48,8 @@ namespace cinelerra protected: SMP wrap (T* product) { return SMP (product); } - public: typedef SMP PType; - - typedef void (*DelHandler) (T* victim); ///< custom deleter function - void setDelHandler (DelHandler) {}; ///< if non-standard deleting is necessary }; @@ -82,38 +60,29 @@ namespace cinelerra * the clients get just a smart-pointer or similar handle to the * created object, which will manage the ownership. * - * The provided default implementation uses just std::auto_ptr, - * but delegates the allocation to cinelerra's backend-layer. - * - * @todo actually do the delgation of memory management instead of using VanillaAllocator! + * The provided default implementation uses just std::auto_ptr. */ template - < class T, // the product to be created - class WR = Wrapper, // used for fabricating the wrapper - class ALO = DefaultALO // Allocator facility to be used + < class T, // the product to be created + class WR = Wrapper // used for fabricating the wrapper > - class Factory : public WR, protected ALO + class Factory : public WR { public: /** Object creating facility. * Intended to be over/written/ with a variant taking - * the appropriate number of parameters and using the - * (privately inherited) functions of the allocator. + * the appropriate number of parameters and maybe + * using some special custom allocator. * Note: non-virtual. */ typename WR::PType operator() () { return wrap (new T ); } - protected: - /** this custom deleter function can be used if the - * operator delete call needs to be in the current scope. - * @see RefcountPtr - */ - static void destroy (T* victim) { delete victim; }; }; + /* -- some example and default instantiiations -- */ using std::tr1::shared_ptr; @@ -125,22 +94,11 @@ namespace cinelerra template class Wrapper > { - protected: - shared_ptr wrap (T* product) { return shared_ptr (product, destroy_ ); } + shared_ptr wrap (T* product) { return shared_ptr (product); } public: typedef shared_ptr PType; - - - Wrapper () : destroy_(&stdDelete) { } - - typedef void (*DelHandler) (T* victim); ///< custom deleter function - void setDelHandler (DelHandler d) { this->destroy_ = d; } ///< custom deleter used by shard_ptr - - private: - DelHandler destroy_; - static void stdDelete (T* victim) { delete victim; }; ///< by default just delete objects normally }; @@ -149,20 +107,11 @@ namespace cinelerra * generating refcounting shared_ptr wrapped Objects. Built upon * the corresponding special intstantiation of the Wrapper template. */ - template - < class T, // the product to be created - class ALO = DefaultALO // Allocator facility to be used - > - class RefcountPtr : public Factory >, ALO> + template + class RefcountPtr : public Factory > > { public: typedef shared_ptr PType; - - /** especially the shared_ptr will use Factory::destroy, - * so it is sufficient to make Factory a friend if the - * Target class to be produced has private ctor/dtors - */ - RefcountPtr() { setDelHandler(&this->destroy); } }; @@ -171,14 +120,14 @@ namespace cinelerra * Creating an implementation subclass and wraps into auto_ptr. */ template - < class T, // Interface class - class TImpl, // Implementation class to be created - class ALO = DefaultALO // Allocator facility to be used + < class T, // Interface class + class TImpl // Implementation class to be created > - class PImplPtr : public Factory, ALO> + class PImplPtr : public Factory > { public: typedef std::auto_ptr PType; + PType operator() (){ return wrap (new TImpl); }; }; diff --git a/tests/components/common/factorytest.cpp b/tests/components/common/factorytest.cpp index 877c9ff8e..d680c9767 100644 --- a/tests/components/common/factorytest.cpp +++ b/tests/components/common/factorytest.cpp @@ -76,6 +76,7 @@ namespace cinelerra } friend class ObjFactory; + friend class std::tr1::_Sp_deleter; public: @@ -116,13 +117,6 @@ namespace cinelerra */ PType operator() (uint param) { return wrap (new TargetObj(param) ); } - ObjFactory () { setDelHandler(&destroy); } - - protected: - /** define a custom deleter function, so the actual destrucor call - * happenes within the scope of ObjFactory, which is friend of TargetObj - */ - static void destroy (TargetObj* victim) { delete victim; }; }; From c0dcccebd9e848c43d7908729120ec97e09e5450 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Fri, 31 Aug 2007 20:32:26 +0200 Subject: [PATCH 4/8] Factory impl now complete (hopfully). Added Tests/Examples for the more advanced use cases * using custom allocation (e.g. C-style malloc) * using placement new * creating Objects via private ctor * example for the 'PImpl' pattern --- src/common/factory.hpp | 4 +- tests/50components.tests | 28 ++ tests/SConscript | 5 +- .../components/common/factoryspecialtest.cpp | 327 ++++++++++++++++++ tests/components/common/factorytest.cpp | 66 +--- tests/components/common/testtargetobj.hpp | 111 ++++++ 6 files changed, 486 insertions(+), 55 deletions(-) create mode 100644 tests/components/common/factoryspecialtest.cpp create mode 100644 tests/components/common/testtargetobj.hpp diff --git a/src/common/factory.hpp b/src/common/factory.hpp index c9948fcc6..691ba25db 100644 --- a/src/common/factory.hpp +++ b/src/common/factory.hpp @@ -118,6 +118,8 @@ namespace cinelerra /** * another convienience instantiiation: auto_ptr-to-Impl-Factory. * Creating an implementation subclass and wraps into auto_ptr. + * @warning the TImpl object will typically be destoyed by the + * smart ptr using an T*, so ~T() needs to be virtual. */ template < class T, // Interface class @@ -128,7 +130,7 @@ namespace cinelerra public: typedef std::auto_ptr PType; - PType operator() (){ return wrap (new TImpl); }; + PType operator() (){ return wrap (static_cast (new TImpl)); }; }; diff --git a/tests/50components.tests b/tests/50components.tests index afab5f280..f0f2746c5 100644 --- a/tests/50components.tests +++ b/tests/50components.tests @@ -71,6 +71,34 @@ out: dtor ~TargetObj(5) successfull END +TEST "Factory_special_test" Factory_special_test 5 < Testgroup=ALL diff --git a/tests/SConscript b/tests/SConscript index 3bf0f7396..63fd423ab 100644 --- a/tests/SConscript +++ b/tests/SConscript @@ -65,7 +65,10 @@ artifacts['testsuite'] = ts = [ SingleTestExecutableSubdir(env, dir) for dir in # - the product of running the Testsuite is the ",testlog" # - it depends on all artifacts defined as "ts" above # -runTs = env.Command(',testlog', ts, "./test.sh", chdir=1) +testEnv = env.Clone() +testEnv.Append(ENV = {'VALGRINDFLAGS' : 'DISABLE'}) + +runTs = testEnv.Command(',testlog', ts, "./test.sh", chdir=1) diff --git a/tests/components/common/factoryspecialtest.cpp b/tests/components/common/factoryspecialtest.cpp new file mode 100644 index 000000000..d02d2f851 --- /dev/null +++ b/tests/components/common/factoryspecialtest.cpp @@ -0,0 +1,327 @@ +/* + Factory-Special(Test) - testing the more advanced features of factory + + Copyright (C) CinelerraCV + 2007, Christian Thaeter + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +* *****************************************************/ + + +#include "common/testtargetobj.hpp" +#include "common/factory.hpp" + +#include "common/test/run.hpp" +#include "common/util.hpp" +#include "nobugcfg.h" + +#include +#include +#include + +using boost::lexical_cast; +using boost::format; +using util::isnil; +using std::string; +using std::cout; + + +namespace cinelerra + { + namespace test + { + + /** + * Example Allocator using plain C memory management. + */ + class MallocAllocator + { + public: + void* operator new (size_t siz) { return malloc (siz); }; + void operator delete (void* p) { if (p) free (p); }; + }; + + + /** + * Simple subclass used for custom alloc and as Interface class + */ + class TargetO : public TestTargetObj + { + long additional_member; + + public: + TargetO (uint cnt) : TestTargetObj(cnt) {} + virtual ~TargetO () {}; + + /** Example Base/Interface function */ + virtual void funky() + { + cout << string(*this) << "\n"; + } + }; + + + /** + * Subclass of the Interface class TargetO, could be an implementation class. + */ + class ImplObj : public TargetO + { + public: + ImplObj () : TargetO(12) {} + + /** Example Implementation function */ + virtual void funky() + { + cout << ".....ImplObj::funky() called\n"; + TargetO::funky(); + } + }; + + + /** + * Another special Subclass, using custom allocation. + */ + class MallocO : public TestTargetObj, public MallocAllocator + { + public: + MallocO () : TestTargetObj (7) {} + }; + + + + class Factory2; + + /** + * Special Subclass prohibiting public use of ctor + */ + class ParanoidObj : public TestTargetObj + { + private: + ParanoidObj (uint cnt) : TestTargetObj(cnt) {} + ~ParanoidObj () {} + + friend class Factory2; + }; + + + + + /* ===== several specialized Factories ====== */ + + using std::tr1::shared_ptr; + + /** + * Factory creating refcounting TargetO pointers + * and using placement Allocation. + */ + class Factory1 : public Factory + { + public: + typedef shared_ptr PType; + + /** specialized Factory method + * doing placement new and invoking + * a special constructor. */ + PType operator() (uint param) { return wrap (new(alloc()) TargetO(param) ); } + + protected: + PType wrap (TargetO* tO) { return PType (tO, &destroy); } ///< note: providing custom deleter func + + static void destroy (TargetO* victim) { victim->~TargetO(); } ///< call dtor but don't delete mem + static void* alloc () { return buff; } ///< returning raw mem for new object + static char buff[]; ///< we place our (single) instance here + }; + char Factory1::buff[sizeof(TargetO)]; + + + + /** + * Factory usable if object can be constructed only by friends + */ + class Factory2 : public Factory + { + public: + typedef shared_ptr PType; + + /** allowed to call ctor because + * it's a friend of ParanoidObj. + * Note passing custom deleter. + */ + PType operator() (uint param) { return PType (new ParanoidObj(param), &destroy); } + + protected: + /** custom deleter func is allowed to call + * ~ParanoidObj() because of friendship + */ + static void destroy (ParanoidObj* victim) { delete victim; } + + }; + + + + /* === Factory instances ==============*/ + + typedef Factory FactoryM; + typedef factory::PImplPtr FactoryP; + + static Factory1 placement_fac; + static Factory2 paranoid_fac; + static FactoryM malloc_fac; + static FactoryP pimpl_fac; + + + + + + + /******************************************************************* + * testing the more advanced Factory variants and possibilities. + * We use several customized Factory subclasses supporting custom + * allocation, placement allocation, private construcors and + * the PIpmpl design pattern. All creating smart pointers. + */ + class Factory_special_test : public Test + { + virtual void run(Arg arg) + { + uint num= isnil(arg)? 1 : lexical_cast(arg[1]); + + checkPlacement (num); + checkPrivate (num); + checkMalloc (); + checkPImpl () ; + } + + + /** @test using direct object placement instead of heap allocation. + * Factory1 will place every new object into the same static buffer + * and return a refcounting pointer + */ + void checkPlacement (uint cnt) + { + cout << "checkPlacement--------\n"; + + typedef Factory1::PType P; + format msg ("created %d shared_ptrs to Object placed in static buffer.\n"); + void* raw (0); + P pX; + ASSERT (0 == pX.use_count()); + + { + P p1 (placement_fac (cnt)); + P p2 (p1); + P pX = p2; + + cout << msg % p2.use_count() + << string (*pX) << "\n"; + + raw = p1.get(); // remember raw mem address + } + + ASSERT (0 == pX.use_count()); + + { + P p1 (placement_fac (cnt+1)); + P p2 (p1); + P p3 (p1); + P pX = p2; + + cout << msg % p2.use_count(); + + ASSERT (raw == p1.get(), "explicit object placement at fixed buffer doesn't work."); + } + + ASSERT (0 == pX.use_count()); + } + + + + + /** @test simple factory creating std::auto_ptr wrapped instances + * of an object with only private ctor and dtor. + */ + void checkPrivate (uint cnt) + { + cout << "checkPrivate--------\n"; + + typedef Factory2::PType P; + format msg ("created %d shared_ptrs to paranoid Object.\n"); + P pX; + + ASSERT (0 == pX.use_count()); + { + P p1 (paranoid_fac (cnt)); + P p2 (p1); + P pX = p2; + + cout << msg % p2.use_count() + << string (*pX) << "\n"; + } + ASSERT (0 == pX.use_count()); + } + + + + + /** @test simple factory creating std::auto_ptr wrapped instances, + * but of a class using a custom allocation scheme (here implemented + * by direct C-style malloc calls) + */ + void checkMalloc (void) + { + cout << "checkMalloc--------\n"; + + typedef FactoryM::PType P; + + P p1 (malloc_fac ()); + P p2 = p1; + cout << ("created auto_ptr to malloc-ed Object.\n") + << string (*p2) << "\n"; + + ASSERT (!p1.get()); + } + + + + + /** @test using direct object placement instead of heap allocation. + * Factory1 will place every new object into the same static buffer + * and return a refcounting pointer + */ + void checkPImpl (void) + { + cout << "checkPImpl--------\n"; + + typedef FactoryP::PType P; + + P p1 (pimpl_fac ()); + P p2 = p1; + cout << ("created auto_ptr to Interface Object.\n"); + p2->funky(); // call a Interface function + + ASSERT (!p1.get()); + } + }; + + + /** Register this test class... */ + LAUNCHER (Factory_special_test, "unit common"); + + + + } // namespace test + +} // namespace cinelerra diff --git a/tests/components/common/factorytest.cpp b/tests/components/common/factorytest.cpp index d680c9767..a57475ffd 100644 --- a/tests/components/common/factorytest.cpp +++ b/tests/components/common/factorytest.cpp @@ -21,18 +21,16 @@ * *****************************************************/ +#include "common/testtargetobj.hpp" + #include "common/test/run.hpp" #include "common/factory.hpp" #include "common/util.hpp" -#include #include -#include #include -using boost::algorithm::join; using boost::lexical_cast; -using boost::format; using util::isnil; using std::string; using std::cout; @@ -45,66 +43,28 @@ namespace cinelerra class ObjFactory; + /** * Target object to be created by the Test-Factory. * Allocates a variable amount of additional heap memory - * and prints diagnostic messages. + * and prints diagnostic messages. Note we provide a + * static member TargetObj::create for the client + * code to generate smart ptr wrapped instances. */ - class TargetObj + class TargetObj : public TestTargetObj { - uint cnt_; - string* heapData_; - string* heapArray_; - - - TargetObj(uint num) - : cnt_ (num), - heapData_ (new string(num,'*')), - heapArray_ (new string[num]) - { - for (uint i=0; i(i); - cout << format("ctor TargetObj(%i) successfull\n") % cnt_; - } - - - ~TargetObj() throw() - { - delete heapData_; - delete[] heapArray_; - cout << format("dtor ~TargetObj(%i) successfull\n") % cnt_; - } - - friend class ObjFactory; - friend class std::tr1::_Sp_deleter; - - public: - static ObjFactory create; + TargetObj (uint cnt) : TestTargetObj(cnt) {} - operator string () const - { - string array_contents = "{"; - for (uint i=0; i { @@ -119,7 +79,7 @@ namespace cinelerra }; - + /** shorthand for the created smart-pointer class, * here it's a (refcounting) boost::shared_ptr */ diff --git a/tests/components/common/testtargetobj.hpp b/tests/components/common/testtargetobj.hpp new file mode 100644 index 000000000..20667cf92 --- /dev/null +++ b/tests/components/common/testtargetobj.hpp @@ -0,0 +1,111 @@ +/* + TESTTARGETOBJ.hpp - a test (stub) target object for testing the factories + + Copyright (C) CinelerraCV + 2007, Christian Thaeter + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + + +#ifndef CINELERRA_TEST_TESTTARGETOBJ_H +#define CINELERRA_TEST_TESTTARGETOBJ_H + + +#include "common/test/run.hpp" +#include "common/factory.hpp" +//#include "common/util.hpp" + +#include +#include +#include +#include + +using boost::algorithm::join; +using boost::lexical_cast; +using boost::format; +using std::string; +using std::cout; + + +namespace cinelerra + { + namespace test + { + /** + * Target object to be created by the Test-Factory. + * Allocates a variable amount of additional heap memory + * and prints diagnostic messages. + */ + class TestTargetObj + { + uint cnt_; + string* heapData_; + string* heapArray_; + + public: + TestTargetObj(uint num); + ~TestTargetObj() throw(); + + operator string () const; + }; + + + + inline + TestTargetObj::TestTargetObj(uint num) + : cnt_ (num), + heapData_ (new string(num,'*')), + heapArray_ (new string[num]) + { + for (uint i=0; i(i); + cout << format("ctor TargetObj(%i) successfull\n") % cnt_; + } + + + inline + TestTargetObj::~TestTargetObj() throw() + { + delete heapData_; + delete[] heapArray_; + cout << format("dtor ~TargetObj(%i) successfull\n") % cnt_; + } + + + + inline + TestTargetObj::operator string () const + { + string array_contents = "{"; + for (uint i=0; i Date: Sun, 2 Sep 2007 17:51:46 +0200 Subject: [PATCH 5/8] Preliminary Design of the Asset Subsystem. While I don't want to target this complex now, I designed some of the fundamental aspects as far as needed to be able to add Objects to the EDL and build a render graph from them. --- doc/devel/uml/class128821.html | 4 +- doc/devel/uml/class128901.html | 3 +- doc/devel/uml/class129034.html | 23 ++ doc/devel/uml/class129162.html | 25 ++ doc/devel/uml/class135301.html | 20 + doc/devel/uml/class135429.html | 28 ++ doc/devel/uml/class135557.html | 28 ++ doc/devel/uml/class135685.html | 23 ++ doc/devel/uml/class135813.html | 23 ++ doc/devel/uml/class135941.html | 23 ++ doc/devel/uml/class136069.html | 23 ++ doc/devel/uml/class136197.html | 23 ++ doc/devel/uml/class136325.html | 25 ++ doc/devel/uml/class136453.html | 43 ++ doc/devel/uml/class136581.html | 27 ++ doc/devel/uml/class136709.html | 24 ++ doc/devel/uml/class136837.html | 24 ++ doc/devel/uml/class136965.html | 24 ++ doc/devel/uml/class137093.html | 24 ++ doc/devel/uml/class137221.html | 20 + doc/devel/uml/class137349.html | 24 ++ doc/devel/uml/class137477.html | 23 ++ doc/devel/uml/class137605.html | 24 ++ doc/devel/uml/class137733.html | 23 ++ doc/devel/uml/class137861.html | 23 ++ doc/devel/uml/class137989.html | 23 ++ doc/devel/uml/class138117.html | 23 ++ doc/devel/uml/class138245.html | 23 ++ doc/devel/uml/classdiagrams.html | 3 + doc/devel/uml/classes.html | 26 ++ doc/devel/uml/classes_list.html | 26 ++ doc/devel/uml/fig128181.png | Bin 32313 -> 39718 bytes doc/devel/uml/fig129285.png | Bin 39134 -> 38931 bytes doc/devel/uml/fig130181.png | Bin 0 -> 10688 bytes doc/devel/uml/fig130309.png | Bin 0 -> 26962 bytes doc/devel/uml/fig130437.png | Bin 0 -> 24470 bytes doc/devel/uml/index.html | 132 ++++++- doc/devel/uml/index_60.html | 6 +- doc/devel/uml/index_65.html | 15 +- doc/devel/uml/index_66.html | 2 +- doc/devel/uml/index_67.html | 35 +- doc/devel/uml/index_68.html | 4 +- doc/devel/uml/index_69.html | 10 +- doc/devel/uml/index_70.html | 4 +- doc/devel/uml/index_71.html | 5 + doc/devel/uml/index_72.html | 1 + doc/devel/uml/index_73.html | 6 +- doc/devel/uml/index_75.html | 23 ++ doc/devel/uml/index_76.html | 2 + doc/devel/uml/index_77.html | 5 + doc/devel/uml/index_78.html | 1 + doc/devel/uml/index_79.html | 5 +- doc/devel/uml/index_80.html | 4 + doc/devel/uml/index_82.html | 5 +- doc/devel/uml/index_83.html | 9 +- doc/devel/uml/index_84.html | 11 +- doc/devel/uml/index_85.html | 2 + doc/devel/uml/index_86.html | 17 +- doc/devel/uml/index_87.html | 5 + doc/devel/uml/navig.html | 4 +- doc/devel/uml/packages.html | 5 +- doc/devel/uml/public_operations.html | 16 +- doc/devel/uml/public_properties.html | 27 ++ uml/cinelerra3/128133 | 568 ++++++++++++++++++++++++++- uml/cinelerra3/128261 | 13 +- uml/cinelerra3/128389 | 10 +- uml/cinelerra3/129669 | 80 +++- uml/cinelerra3/130053 | 508 +++++++++++++++++++++++- uml/cinelerra3/130181 | 2 +- uml/cinelerra3/130309.diagram | 133 +++++++ uml/cinelerra3/130437.diagram | 147 +++++++ uml/cinelerra3/5.session | 30 +- uml/cinelerra3/cinelerra3.prj | 2 +- wiki/renderengine.html | 51 ++- 74 files changed, 2527 insertions(+), 76 deletions(-) create mode 100644 doc/devel/uml/class129034.html create mode 100644 doc/devel/uml/class129162.html create mode 100644 doc/devel/uml/class135301.html create mode 100644 doc/devel/uml/class135429.html create mode 100644 doc/devel/uml/class135557.html create mode 100644 doc/devel/uml/class135685.html create mode 100644 doc/devel/uml/class135813.html create mode 100644 doc/devel/uml/class135941.html create mode 100644 doc/devel/uml/class136069.html create mode 100644 doc/devel/uml/class136197.html create mode 100644 doc/devel/uml/class136325.html create mode 100644 doc/devel/uml/class136453.html create mode 100644 doc/devel/uml/class136581.html create mode 100644 doc/devel/uml/class136709.html create mode 100644 doc/devel/uml/class136837.html create mode 100644 doc/devel/uml/class136965.html create mode 100644 doc/devel/uml/class137093.html create mode 100644 doc/devel/uml/class137221.html create mode 100644 doc/devel/uml/class137349.html create mode 100644 doc/devel/uml/class137477.html create mode 100644 doc/devel/uml/class137605.html create mode 100644 doc/devel/uml/class137733.html create mode 100644 doc/devel/uml/class137861.html create mode 100644 doc/devel/uml/class137989.html create mode 100644 doc/devel/uml/class138117.html create mode 100644 doc/devel/uml/class138245.html create mode 100644 doc/devel/uml/fig130181.png create mode 100644 doc/devel/uml/fig130309.png create mode 100644 doc/devel/uml/fig130437.png create mode 100644 doc/devel/uml/index_75.html create mode 100644 doc/devel/uml/public_properties.html create mode 100644 uml/cinelerra3/130309.diagram create mode 100644 uml/cinelerra3/130437.diagram diff --git a/doc/devel/uml/class128821.html b/doc/devel/uml/class128821.html index 9468da4e5..26d9d7275 100644 --- a/doc/devel/uml/class128821.html +++ b/doc/devel/uml/class128821.html @@ -25,6 +25,8 @@
Relation <directional aggregation>

Declaration :

Relation descriptor (<directional aggregation>)

Declaration :

Relation <association>

Declaration :

-
Relation mapping (<aggregation>)

Declaration :

  • Uml : - mapping : FileMap, multiplicity : 1
  • C++ : private: FileMap * mapping
+
Relation mapping (<aggregation>)

Declaration :

  • Uml : - mapping : FileMap, multiplicity : 1
  • C++ : private: FileMap * mapping
+
Relation <aggregation>

Declaration :

+
Relation <association>

Declaration :

diff --git a/doc/devel/uml/class128901.html b/doc/devel/uml/class128901.html index ca133c971..554e5a32c 100644 --- a/doc/devel/uml/class128901.html +++ b/doc/devel/uml/class128901.html @@ -19,7 +19,8 @@

Declaration :

Artifact : clip

Attribut start
-

Declaration :

  • Uml : # start : Time
  • C++ : protected: Time start

startpos in source

+

Declaration :

  • Uml : # start : Time
  • C++ : protected: Time start

startpos in source

+
Relation source (<unidirectional association>)

Declaration :

  • Uml : # source : Clip, multiplicity : 1
  • C++ : protected: const Clip* source

the media source this clip referes to

All public operations : apply

diff --git a/doc/devel/uml/class129034.html b/doc/devel/uml/class129034.html new file mode 100644 index 000000000..c7fb6e38c --- /dev/null +++ b/doc/devel/uml/class129034.html @@ -0,0 +1,23 @@ + + + + + + +Class WriteBufferPool + + + + + +
Class WriteBufferPool
+

+ + + + +

Declaration :

  • C++ : class WriteBufferPool
+ +
Relation <association>

Declaration :

+ + diff --git a/doc/devel/uml/class129162.html b/doc/devel/uml/class129162.html new file mode 100644 index 000000000..00de87cc8 --- /dev/null +++ b/doc/devel/uml/class129162.html @@ -0,0 +1,25 @@ + + + + + + +Class WriteBuffer + + + + + +
Class WriteBuffer
+

+ + + + +

Declaration :

  • C++ : class WriteBuffer
+ +
Relation <aggregation>

Declaration :

+
Relation frame (<association>)

Declaration :

  • Uml : # frame : Frame, multiplicity : 0..1
  • C++ : protected: Frame* frame
+
Relation <association>

Declaration :

+ + diff --git a/doc/devel/uml/class135301.html b/doc/devel/uml/class135301.html new file mode 100644 index 000000000..178a99fd4 --- /dev/null +++ b/doc/devel/uml/class135301.html @@ -0,0 +1,20 @@ + + + + + + +Class Factory + + + + + +
Class Factory
+

+ + + + +

Declaration :

  • C++ : template<class T> class Factory

a template for generating functor-like Factory objects, used to encapsulate object creation and providing access via smart-pointers only.

+ diff --git a/doc/devel/uml/class135429.html b/doc/devel/uml/class135429.html new file mode 100644 index 000000000..93f554a39 --- /dev/null +++ b/doc/devel/uml/class135429.html @@ -0,0 +1,28 @@ + + + + + + +Class Appconfig + + + + + +
Class Appconfig
+

+ + + + +

Declaration :

  • C++ : class Appconfig

Singleton to hold inevitable global flags and constants and for performing erarly (static) global initialization tasks.

Artifact : appconfig

+ +
Attribut theApp_
+

Declaration :

holds the single instance and triggers initialization

+
Operation Appconfig

Declaration :

  • Uml : - Appconfig() :
  • C++ : private: Appconfig ()

perform initialization on first access.
A call is placed in static initialization code
included in cinelerra.h

+
Operation instance

Declaration :

  • Uml : static, - instance() : Appconfig*
  • C++ : private: static Appconfig* instance ()
+
Operation get

Declaration :

  • Uml : static, + get(inout key : string) : string
  • C++ : public: static string get (string & key)

access the configuation value for a given key.
@return empty string for unknown keys, else the corresponding configuration value

+

All public operations : get

+ + diff --git a/doc/devel/uml/class135557.html b/doc/devel/uml/class135557.html new file mode 100644 index 000000000..fdcef57fa --- /dev/null +++ b/doc/devel/uml/class135557.html @@ -0,0 +1,28 @@ + + + + + + +Class Error + + + + + +
Class Error
+

+ + + + +

Declaration :

Directly inherited by : Config External Invalid Logic State

+

Artifact : error

+ +
Operation what

Declaration :

  • Uml : + what() : const char*
  • C++ : public: virtual const char* what () const
+
Operation rootCause

Declaration :

  • Uml : + rootCause() : std::exception
  • C++ : public: std::exception rootCause ()

If this exception was caused by a chain of further exceptions,
return the first one registered in this throw sequence.
This works only, if every exceptions thrown as a consequence
of another exception is propperly constructed by passing
the original exception to the constructor

+
Attribut cause
+

Declaration :

a copy of the first exception encountered in this exception chain

+

All public operations : rootCause , what , what

+ + diff --git a/doc/devel/uml/class135685.html b/doc/devel/uml/class135685.html new file mode 100644 index 000000000..8e6b26fbb --- /dev/null +++ b/doc/devel/uml/class135685.html @@ -0,0 +1,23 @@ + + + + + + +Class Logic + + + + + +
Class Logic
+

+ + + + +

Declaration :

  • C++ : class Logic : public Error

Artifact : error

+
+

All public operations : rootCause , what , what

+ + diff --git a/doc/devel/uml/class135813.html b/doc/devel/uml/class135813.html new file mode 100644 index 000000000..1d628a8a0 --- /dev/null +++ b/doc/devel/uml/class135813.html @@ -0,0 +1,23 @@ + + + + + + +Class Config + + + + + +
Class Config
+

+ + + + +

Declaration :

  • C++ : class Config : public Error

Artifact : error

+
+

All public operations : rootCause , what , what

+ + diff --git a/doc/devel/uml/class135941.html b/doc/devel/uml/class135941.html new file mode 100644 index 000000000..b42424011 --- /dev/null +++ b/doc/devel/uml/class135941.html @@ -0,0 +1,23 @@ + + + + + + +Class State + + + + + +
Class State
+

+ + + + +

Declaration :

  • C++ : class State : public Error

Artifact : error

+
+

All public operations : rootCause , what , what

+ + diff --git a/doc/devel/uml/class136069.html b/doc/devel/uml/class136069.html new file mode 100644 index 000000000..7abe96b20 --- /dev/null +++ b/doc/devel/uml/class136069.html @@ -0,0 +1,23 @@ + + + + + + +Class Invalid + + + + + +
Class Invalid
+

+ + + + +

Declaration :

  • C++ : class Invalid : public Error

Artifact : error

+
+

All public operations : rootCause , what , what

+ + diff --git a/doc/devel/uml/class136197.html b/doc/devel/uml/class136197.html new file mode 100644 index 000000000..954b2bea1 --- /dev/null +++ b/doc/devel/uml/class136197.html @@ -0,0 +1,23 @@ + + + + + + +Class External + + + + + +
Class External
+

+ + + + +

Declaration :

  • C++ : class External : public Error

Artifact : error

+
+

All public operations : rootCause , what , what

+ + diff --git a/doc/devel/uml/class136325.html b/doc/devel/uml/class136325.html new file mode 100644 index 000000000..002984e29 --- /dev/null +++ b/doc/devel/uml/class136325.html @@ -0,0 +1,25 @@ + + + + + + +Class std::exception + + + + + +
Class std::exception
+

+ + + + +

Declaration :

  • C++ : class std::exception

Directly inherited by : Error

+
+ +
Operation what

Declaration :

  • Uml : + what() : const char*
  • C++ : public: virtual const char* what () const

the base class of all exceptions thrown by the standard library

+

All public operations : what

+ + diff --git a/doc/devel/uml/class136453.html b/doc/devel/uml/class136453.html new file mode 100644 index 000000000..525aaa684 --- /dev/null +++ b/doc/devel/uml/class136453.html @@ -0,0 +1,43 @@ + + + + + + +Class Asset + + + + + +
Class Asset
+

+ + + + +

Declaration :

  • C++ : class Asset
  • Java : public interface Asset

Directly inherited by : Media Meta Proc Struct

+

Superinterface describing especially the bookeeping properties of Assets

Artifact : asset

+ +
Attribut id
+

Declaration :

  • Uml : + id : long
  • C++ : public: const long id

Asset primary key.

+
Attribut name
+

Declaration :

  • Uml : + name : string
  • C++ : public: const string name

element ID, comprehensible but sanitized. The tuple (category, name, org) is unique.

+
Relation category (<unidirectional association>)

Declaration :

  • Uml : + category : Category, multiplicity : 1
  • C++ : public: const Category* category

primary tree like classification of the asset

+
Attribut org
+

Declaration :

  • Uml : + org : string
  • C++ : public: const string org

origin or authorship id. Can be a project abbreviation, a package id or just the authors nickname or UID. This allows for the compnent name to be more generic (e.g. "blur"). Default for all assets provided by the core cinelerra-3 codebase is "cin3".

+
Attribut version
+

Declaration :

  • Uml : + version : uint
  • C++ : public: const unsigned int version

version number of the thing or concept represented by this asset. Of each unique tuple (name, category, org) there will be only one version in the whole system. Version 0 is reserved for internal purposes. Versions are considered to be ordered, and any higher version is supposed to be fully backwards compatible to all previous versions.

+
Attribut groups
+

Declaration :

  • Uml : # groups : set<string>
  • C++ : protected: set<string> groups

additional classification, selections or departments this asset belongs to. Groups are optional, non-exclusive and may be overlapping.

+
Attribut shortDesc
+

Declaration :

  • Uml : # shortDesc : string
  • C++ : protected: const string shortDesc

user visible Name-ID. To be localized.

+
Attribut longDesc
+

Declaration :

  • Uml : # longDesc : string
  • C++ : protected: const string longDesc

user visible qualification of the thing, unit or concept represented by this asset. perferably "in one line". To be localized.

+
Operation getParents

Declaration :

  • Uml : + getParents() : vector<PAsset>
  • C++ : public: vector<PAsset> getParents ()

List of entities this asset depends on or requires to be functional. May be empty. The head of this list can be considered the primary prerequisite

+
Operation getDependant

Declaration :

  • Uml : + getDependant() : vector<PAsset>
  • C++ : public: vector<PAsset> getDependant ()

All the other assets requiring this asset to be functional. For example, all the clips depending on a given media file. May be empty. The dependency relation is transitive.

+
Operation isActive

Declaration :

  • Uml : + isActive() : bool
  • C++ : public: bool isActive ()

weather this asset is swithced on and consequently included in the fixture and participates in rendering

+
Operation enable

Declaration :

  • Uml : + enable(in bool : ) : void, exceptions : State
  • C++ : public: void enable () throw (State)

change the enabled status of this asset. Note the corresponding #isActive predicate may depend on the enablement status of parent assets as well

+

All public operations : enable , getDependant , getParents , isActive

+ + diff --git a/doc/devel/uml/class136581.html b/doc/devel/uml/class136581.html new file mode 100644 index 000000000..b81f1f7ef --- /dev/null +++ b/doc/devel/uml/class136581.html @@ -0,0 +1,27 @@ + + + + + + +Class AssetManager + + + + + +
Class AssetManager
+

+ + + + +

Declaration :

  • C++ : class AssetManager

Facade for the Asset subsystem

Artifact : assetmanager

+ +
Operation register

Declaration :

  • Uml : static, + register(inout name : string, inout category : string, inout org : string, inout uint : version) : long, exceptions : Invalid
  • C++ : public: static long register (string & name, string & category, string & org, version& uint) throw (Invalid)

registers an asset object in the internal DB, providing its unique key

+
Operation getAsset

Declaration :

  • Uml : + getAsset(in id : long) : KIND, exceptions : Invalid
  • C++ : public: template<class KIND> KIND getAsset (long & id) throw (Invalid)

find and return corresponging object

+
Operation known

Declaration :

  • Uml : + known(in id : long) : bool
  • C++ : public: bool known (long id)

@return true if the given id is registered in the internal asset DB

+
Operation remove

Declaration :

  • Uml : + remove(in id : long) : void, exceptions : Invalid, State
  • C++ : public: void remove (long id) throw (Invalid, State)

remove the given asset <i>together with all its dependants</i> from the internal DB

+

All public operations : getAsset , known , register , remove

+ + diff --git a/doc/devel/uml/class136709.html b/doc/devel/uml/class136709.html new file mode 100644 index 000000000..c7f46adb3 --- /dev/null +++ b/doc/devel/uml/class136709.html @@ -0,0 +1,24 @@ + + + + + + +Class Media + + + + + +
Class Media
+

+ + + + +

Declaration :

  • C++ : class Media : public Asset

Directly inherited by : Clip Preview

+

key abstraction: media-like assets

Artifact : media

+
+

All public operations : enable , getDependant , getParents , isActive

+ + diff --git a/doc/devel/uml/class136837.html b/doc/devel/uml/class136837.html new file mode 100644 index 000000000..32eeedace --- /dev/null +++ b/doc/devel/uml/class136837.html @@ -0,0 +1,24 @@ + + + + + + +Class Proc + + + + + +
Class Proc
+

+ + + + +

Declaration :

  • C++ : class Proc : public Asset

Directly inherited by : Codec Effect

+

key abstraction: data processing asset

Artifact : proc

+
+

All public operations : enable , getDependant , getParents , isActive

+ + diff --git a/doc/devel/uml/class136965.html b/doc/devel/uml/class136965.html new file mode 100644 index 000000000..d2f992c0a --- /dev/null +++ b/doc/devel/uml/class136965.html @@ -0,0 +1,24 @@ + + + + + + +Class Struct + + + + + +
Class Struct
+

+ + + + +

Declaration :

  • C++ : class Struct : public Asset

Directly inherited by : OutPort Track

+

key abstraction: structural asset

Artifact : struct

+
+

All public operations : enable , getDependant , getParents , isActive

+ + diff --git a/doc/devel/uml/class137093.html b/doc/devel/uml/class137093.html new file mode 100644 index 000000000..6fc18f4e0 --- /dev/null +++ b/doc/devel/uml/class137093.html @@ -0,0 +1,24 @@ + + + + + + +Class Meta + + + + + +
Class Meta
+

+ + + + +

Declaration :

  • C++ : class Meta : public Asset

Directly inherited by : Dataset

+

key abstraction: metadata and organisational asset

Artifact : meta

+
+

All public operations : enable , getDependant , getParents , isActive

+ + diff --git a/doc/devel/uml/class137221.html b/doc/devel/uml/class137221.html new file mode 100644 index 000000000..6bac4b8ca --- /dev/null +++ b/doc/devel/uml/class137221.html @@ -0,0 +1,20 @@ + + + + + + +Class Category + + + + + +
Class Category
+

+ + + + +

Declaration :

  • C++ : class Category

tree like classification of Assets

Artifact : category

+ diff --git a/doc/devel/uml/class137349.html b/doc/devel/uml/class137349.html new file mode 100644 index 000000000..2b1885473 --- /dev/null +++ b/doc/devel/uml/class137349.html @@ -0,0 +1,24 @@ + + + + + + +Class Clip + + + + + +
Class Clip
+

+ + + + +

Declaration :

  • C++ : class Clip : public Media

bookkeeping (asset) view of a media clip.

Artifact : clip

+ +
Relation source (<unidirectional association>)

Declaration :

  • Uml : # source : Media, multiplicity : 1
  • C++ : protected: const Media* source

media source of this clip

+

All public operations : enable , getDependant , getParents , isActive

+ + diff --git a/doc/devel/uml/class137477.html b/doc/devel/uml/class137477.html new file mode 100644 index 000000000..4e36b6db4 --- /dev/null +++ b/doc/devel/uml/class137477.html @@ -0,0 +1,23 @@ + + + + + + +Class Unknown + + + + + +
Class Unknown
+

+ + + + +

Declaration :

  • C++ : class Unknown : public Preview

placeholder for unknown or unavailable media source

Artifact : unknown

+
+

All public operations : enable , getDependant , getParents , isActive

+ + diff --git a/doc/devel/uml/class137605.html b/doc/devel/uml/class137605.html new file mode 100644 index 000000000..e154ffd5f --- /dev/null +++ b/doc/devel/uml/class137605.html @@ -0,0 +1,24 @@ + + + + + + +Class Preview + + + + + +
Class Preview
+

+ + + + +

Declaration :

  • C++ : class Preview : public Media

Directly inherited by : Unknown

+

alternative version of the media data, probably with lower resolution

Artifact : preview

+
+

All public operations : enable , getDependant , getParents , isActive

+ + diff --git a/doc/devel/uml/class137733.html b/doc/devel/uml/class137733.html new file mode 100644 index 000000000..9e9122764 --- /dev/null +++ b/doc/devel/uml/class137733.html @@ -0,0 +1,23 @@ + + + + + + +Class Effect + + + + + +
Class Effect
+

+ + + + +

Declaration :

  • C++ : class Effect : public Proc

Effect or media processing component

Artifact : effect

+
+

All public operations : enable , getDependant , getParents , isActive

+ + diff --git a/doc/devel/uml/class137861.html b/doc/devel/uml/class137861.html new file mode 100644 index 000000000..e492ab185 --- /dev/null +++ b/doc/devel/uml/class137861.html @@ -0,0 +1,23 @@ + + + + + + +Class Codec + + + + + +
Class Codec
+

+ + + + +

Declaration :

  • C++ : class Codec : public Proc

description of some media data decoder or encoder facility

Artifact : codec

+
+

All public operations : enable , getDependant , getParents , isActive

+ + diff --git a/doc/devel/uml/class137989.html b/doc/devel/uml/class137989.html new file mode 100644 index 000000000..5ee601cc6 --- /dev/null +++ b/doc/devel/uml/class137989.html @@ -0,0 +1,23 @@ + + + + + + +Class Track + + + + + +
Class Track
+

+ + + + +

Declaration :

  • C++ : class Track : public Struct

structural asset holding the configuration of a track in the EDL

Artifact : track

+
+

All public operations : enable , getDependant , getParents , isActive

+ + diff --git a/doc/devel/uml/class138117.html b/doc/devel/uml/class138117.html new file mode 100644 index 000000000..6b36b4366 --- /dev/null +++ b/doc/devel/uml/class138117.html @@ -0,0 +1,23 @@ + + + + + + +Class OutPort + + + + + +
Class OutPort
+

+ + + + +

Declaration :

  • C++ : class OutPort : public Struct

structural asset corresponding to some port generating media output

Artifact : outport

+
+

All public operations : enable , getDependant , getParents , isActive

+ + diff --git a/doc/devel/uml/class138245.html b/doc/devel/uml/class138245.html new file mode 100644 index 000000000..cc00110c8 --- /dev/null +++ b/doc/devel/uml/class138245.html @@ -0,0 +1,23 @@ + + + + + + +Class Dataset + + + + + +
Class Dataset
+

+ + + + +

Declaration :

  • C++ : class Dataset : public Meta

meta asset describing a collection of control data

Artifact : dataset

+
+

All public operations : enable , getDependant , getParents , isActive

+ + diff --git a/doc/devel/uml/classdiagrams.html b/doc/devel/uml/classdiagrams.html index 431aa442c..8c55bf4b0 100644 --- a/doc/devel/uml/classdiagrams.html +++ b/doc/devel/uml/classdiagrams.html @@ -16,11 +16,14 @@ + + +
Asset Kinds
Automation Entities
Builder Entities
Controller Entities
File MappingShows whats used to access Frames
HierarchyCinelerra Exception hierarchy
In Memory Database
Media-Asset Relations
Render Entities
Session structure
diff --git a/doc/devel/uml/classes.html b/doc/devel/uml/classes.html index 3f80fa110..cfbf35142 100644 --- a/doc/devel/uml/classes.html +++ b/doc/devel/uml/classes.html @@ -19,22 +19,34 @@ AbstractMO AFrame Allocationa directive to place a MObject in a specific way +AppconfigsingletonSingleton to hold inevitable global flags and constants and for performing erarly (static) global initialization tasks. ARenderRepresentation of a Audio render process AssemblerThis is the actual building facility: provided the correct tools and associations, it serves to build and connect the individual ProcNode objects +AssetinterfaceSuperinterface describing especially the bookeeping properties of Assets +AssetManagerboundaryFacade for the Asset subsystem AutoAutomation data for some parameter (i.e. a time varying function) Buildableinterface BuilderFacadeboundaryProvides unified access to the builder functionality. While individual components of the builder subsystem may be called if necessary or suitable, it is usually better to do all extern invocations via the high level methods of this Facade +Categorytree like classification of Assets +Clipbookkeeping (asset) view of a media clip. Clip +Codecdescription of some media data decoder or encoder facility CodecAdapter ConditionI provided a reworked Condition class in my cinelerra2 repository +Config ConManagerConnection Manager, used to build the connections between render engine nodes, if these nodes need to cooperate besides the normal "data pull" operation. Esp., the Connection Manager knows how to wire up the effect's parameters with the corresponding ParamProviders (autmation) in the Session Constraint ControllerFacadeboundaryProvides unified access to the Proc-Subsystem Controller. Especially, this Facade class provides the functions to get a render engine to carry out actual renderings. +Datasetmeta asset describing a collection of control data DirectPlacement EDL +EffectEffect or media processing component Effect +Error ExitNodeThe output of the render pipeline. Pulling from such exit nodes actually ivokes the render process ExplicitPlacementinterface +External +Factorya template for generating functor-like Factory objects, used to encapsulate object creation and providing access via smart-pointers only. File FileHandle FileHandleCache @@ -52,21 +64,28 @@ GLRenderRepresentation of a OpenGL accelerated Video render process Hub InterpolatorProvides the implementation for getting the acutal value of a time varying or automated effect/plugin parameter +Invalid Label Link Lock Lock +Logic Mask +Mediakey abstraction: media-like assets +Metakey abstraction: metadata and organisational asset Meta MObjectinterface MutexI provided a reworked Mutex class in my cinelerra2 repository NodeCreatorToolThis Tool implementation plays the central role in the buld process: given a MObject from Session, it is able to attach ProcNodes to the render engine under construction such as to reflect the properties of the MObject in the actual render. +OutPortstructural asset corresponding to some port generating media output ParameterDescriptor and access object for a plugin parameter. Parameters may be provided with values from the session, and this values may be automated. ParamProviderinterfaceA facility to get the actual value of a plugin/effect parameter PathManagerWhile building a render engine, this Strategy class decides on the actual render strategy in accordance to the current controller settings (system state) Placementinterface PluginAdapterAdapter used to integrage an effects processor in the render pipeline Prefetch +Previewalternative version of the media data, probably with lower resolution +Prockey abstraction: data processing asset Processor ProcNodeinterfaceKey abstraction of the Render Engine: A Data processing Node ProjectorSpecial video processing node used to scale and translate image data. @@ -80,16 +99,23 @@ Session SmartPointerauxiliary SourceSource Node: represents a media source to pull data from. +State StateProxyinterface +std::exceptionauxiliary +Structkey abstraction: structural asset ThreadWe can basically reuse the Thread class design from cinelerra2, Thread becomes a baseclass for all Threads Timedenotes a temporal position (time point), based on timeline start.

investigate posix.4 realtime timers, wrap these here ToolinterfaceUsed according to the visitor pattern: each Tool contains the concrete implementation for one task to be done to the various MObject classes ToolFactory +Trackstructural asset holding the configuration of a track in the EDL Track Trafo +Unknownplaceholder for unknown or unavailable media source VFrame VRenderRepresentation of a Video render process. (Encapsulates the video buffers for the actual calculations) Wish +WriteBuffer +WriteBufferPool diff --git a/doc/devel/uml/classes_list.html b/doc/devel/uml/classes_list.html index aee95f532..78eefaa82 100644 --- a/doc/devel/uml/classes_list.html +++ b/doc/devel/uml/classes_list.html @@ -20,22 +20,34 @@ AbstractMO
AFrame
Allocation
+Appconfig
ARender
Assembler
+Asset
+AssetManager
Auto
Buildable
BuilderFacade
+Category
+Clip
Clip
+Codec
CodecAdapter
Condition
+Config
ConManager
Constraint
ControllerFacade
+Dataset
DirectPlacement
EDL
+Effect
Effect
+Error
ExitNode
ExplicitPlacement
+External
+Factory
File
FileHandle
FileHandleCache
@@ -53,21 +65,28 @@ GLRender
Hub
Interpolator
+Invalid
Label
Link
Lock
Lock
+Logic
Mask
+Media
+Meta
Meta
MObject
Mutex
NodeCreatorTool
+OutPort
Parameter
ParamProvider
PathManager
Placement
PluginAdapter
Prefetch
+Preview
+Proc
Processor
ProcNode
Projector
@@ -81,16 +100,23 @@ Session
SmartPointer
Source
+State
StateProxy
+std::exception
+Struct
Thread
Time
Tool
ToolFactory
+Track
Track
Trafo
+Unknown
VFrame
VRender
Wish
+WriteBuffer
+WriteBufferPool
diff --git a/doc/devel/uml/fig128181.png b/doc/devel/uml/fig128181.png index fbd7271649e695b230de48b9c64aba4c1264bb06..cedf4dae20748670cd76b0eff25ac6cb2d758f14 100644 GIT binary patch literal 39718 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�ljuir&oVo*v}rK-g5mS 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 VjNKLr1Sc~g3Nos&g2%?M{tLK6dmR7( literal 0 HcmV?d00001 diff --git a/doc/devel/uml/fig130309.png b/doc/devel/uml/fig130309.png new file mode 100644 index 0000000000000000000000000000000000000000..436fda8d2b2e93f742f5dc7c3da079be13911c4a GIT binary patch literal 26962 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
xu( zGyCmxJ}aNy>f9yF*!NLU=3EXARo8-ie6$`lI*=I}AM)-$)2@%i3d%P7Hdx@aI^y&V z*C>M!(g^}cq*h+N5ua^|VlsbP_2S&2%a3Y%GH!tP#|IY%2UXT8b{D1_(jChCuHICl zjmy*TNTL)^DJ?a%wYaR3^Tnd)Qv{OLZuQkAOp?O`;qN5tvr(QZDkFgG^z}bla2fSB zcXf3sm)pNVk}Y&3IvE%ca$qV2I^V+#G(b&3HXr>?1z+ zOApYWMa+lfkdYv6JT>8CWi$)VRXu}fU(kXNz=i_(V!`{P(M$b+ViAZNuSC;pWBF^N zR^UlHol|LvRAnKNiTJw4ssrJ1U88OyV%OJ8~|n$AX$ zGQo;^qVAoqQZwp09my8d7T4F^`{?L+_ih;%su}lhcN+TV!(WS{4&(4phrgw&|JTeo zKGDdy{uP(i*&EH__}JLtF)nv$({HhEnMbj~5JsK}!V?tP-CAh4xT*b2ifwMk3zPPV ztYv)wTV5fFR!5~v1Aw{JKI!jsZyr3D)Y0YN*9m`7efS3741zMo#fxhY-LPdm zYB1X`{DQKXJG(a3)s}tqSBEd#H1TjMm6VxX#^7^4JxTob z&EJNxK~Z)W3u(PRDT#w4#L)Ha8*JuLzN^Ft#P?e;D|b8ac6K4x(Y+&i<9I3%3k&PAc$h>>%See)-#v%`duK{-&}Xh9DMBBmr$13*7ow45 zyz4V%S$r0~rkkFWXbB&$@PVo-E%p5PbVFQs1;ww?mX|L`NvRu)hzt$wxv~TktlJBw zud#_2;f=-K-bdc^NBe(hYahcZ<}me3OG^t4CFFC=dGUfFoQb(}>Iw(@5kfuqA898} zc%GRiGuA_qQ*GR%`1_&b-EfL-Q+%$(1ROb?^CAhhHL`VN94QEgun+oswudlO9kQI*>`CoeLHD8P7kEwsCVqky|$N6H6u&}wV8C1~yXVUz~ zW#vI7t^IrG^M*HuJhx`hI9kTsvg!EjOa(_CqXX%6DM;Z>gX=?!%cOD2{QP;v(eCcA zF~Wisy|lrE{&X3mgi(vjFN|So=4cgYfeg2ljsrET|ZU;_IxDKz@Digyd9<;6=6> zlBk#P&oCosTS^8%@hn7+0BYdCMz-GH6S_(w5&9_EM0T#mEA;N&61XwSs+fGPymK9i zjp2s02n6d@h)HFoHcJ7oU(?1hs#G{~*tuK(9&nIkZe+Q+mQ-Y6x)8X`hUY&eeARib zNk#^QNw+mgAl2fSTW>61JyEkkY3s+2I9IPKs5#vv&fHm*RQP%c_7FCpAoUeBG=?Bk zyMk5=I7+RxGx@`d7pAXYPky8xd-#SO>t|FcuKA8)=@u6S>ir0rO(Jb1nhnTQehWbC z@4KvHE?<6bY}{Ous`@MJtdgEX2r9l1P1kMw4;}(g<}V^Ih%^iFk&2IRthP4Rd$u*^ z%S<$P=yTnfR;II7n-}mIj#RRp;etW>(Z0ToTMO(K7KE_HaQ+r+kQ8xneSF4I)_eD+ zJMY}_ghM&~@H2?gT+>EVL8__M%4E%|KIkWU&EDR!S}p|zdvBokuUMNRt+}*pJh#Bb zN4NYjSM>^Uh;b%v4O4FP;^K8lNgyfLMx5k|%uO<<$E&*mA6&ZhrX+fLdKlP_r9Sc2 z=#rb)t$z&U&H4De*x-`v7DK_h$jBRND&pdKxw$GYh%X}M2bofOn5m?Wa%@-1f$af; zqBkQVDmuDp#_1>95R4jz`no#ju}U3ODtWib$D30a31kBrzUjNrkVnaBX##1VJ^^ly z)MZg(uc^@8Qb+c$E4AfC>{#;SJaaa#a!)9VLSj8(kT%f|IHue`F~^EtVg=k$LO z)P<0YpS|Ulp)yYTw-Q;gk2Wx+?`BQioGDb1mRoj5;M`LKh zXYCg6`Nq%(;^JMl$A2IYrP#0sX`7i5Ub{w2FfWWGVn_0DtMpVfVkp|%O9W#mBD$>> zIy0Z7zC7GnQCHY`HPrOU&F!4&2S;^$24{M=>+HctsYGSypxE z)eBt?YDuACwpwu9v;~)nbRVb*8vs7etZHOt{S|L)4&?dv#dagi*@L~Vozx2MGTAr`E)&i{kqCKiGg~b($nuI1430l zLzY<>5)u*|Zs)Qx=;Y^;FNyFF}B^#TxxY4r* zUn4SA`9eoffax)_pFu(LRc195)FVFsKlyn0?|;)1P}t?{Ljf`h3I?7-Sp|hNt-ygi zW&qfn9r<4{PopW;Pe3Amc~DFA9CxLr8$BCa%r4NVzY+D2tv>h=7Zel>zmMl3o@fCK z3e7LvQOnoI!CD!K;(adVepG?Hj%)L^y4qJ9?l`=d5porB;oF_EzNymEG-a3Lbs*(U zl~T`p9=P^n!pw?`To}E%WrUFAgcu7z1>`J@bl355Yi|%OF)Cv-TTFWU`5g(II=k+! z*04Nh!0Ff>n`>%i$Z%rBqNIra{Q2HoXK$|%4t8t4-7W$#ZU*>NZ}OXbeLxH)1k5q# zO%Gs4#l@S9O~N<#$ys`A-q??Br^=8D&1D%HO1&k` zkN3PtH7>tB>Xc52EjFV4-Q+L$@Xd#`H!G$uGYS~^#z;0R*nL)(=~$Qn7XzDpRB zjOsT)dQecJ4)EQWNwMK%V|!O#u8xN19P#$YLzy5>KEAE*K@tP<`}ffpsz%4pmw&Qd zRWmR(m9;A=EiH|tYso#OrVA1k@xS4`KH1{u=WMj}ft`I8h=j%Yt?s^4fqf^RkDorN zJbB_FZe(DfprAne5g&p0@qkmSR5wL3PovCM+9Z>Lo!tefJf!ua+^F5yF&j_fr-Q2R zJzZ9)Yj}8smK}zP1q%m~@NwR=NL*g@!4U`vBU$a04E2UE*EHo*?5sMZ1w>$O^<{f` zWo3*jS2dWOiz4C@YoYVgB(-CvhoFyK)tqTt^n^OSpyrJD@}T$$qST} z7P;>rq4S|e%_Za4g@p=01T+K-1gVFT=8t1uxMZVfY<0u_ z0g1Gd?8YtL;VAFrWnpIYnyCssZI-Rp7|Q`NdWW#EbJ=QlCp#gLRZ)qg`3OnHj|VW_ zB&e@D?+nBijWYLkb=@W-BHHx!)<#|@jVmypNO6393F9CKxL^i`9U=~f#%8*=GgcmW z*gkS(L6#nPD+3oEGlaE_W2Y;$_`TW8j;f)wwkZIXq&$Di++bk>Hl9isC!CJS+9!`5 zO%ix^baiPB_(8Z`?71V}{Qfql3wNM+YO*?@jrbps#tD+c%<6Yq^KWUXsFNhdma*US z74nh=ne6-p;^ESsJPj=XSBb*(6Ppj8q+|s6Z3WG6aO$6Fzk^J$fZ-v?D z5i*2()*G#*7VT<*d+6juH1mc8!sByu^~rsis;S+D*3Ta8U!kO$Gc+>#OsA@>Jo1e< zadN!r9O6s0uf4nCTiFD_H*dZEUvoH!Xn#qgwhR~Sw_m^d=1*|%t?od1`4XVjpSh;` z9}p8YEHFtGQj(?vh>i42__lx~6$zvXMYWsZJisa^Z33Ws`9MeyoN(#QQ&h%d`K8B19QXG>fl1JaEHpt@8)VIFt!v zV82fQWJrBq(w~CStnW8e)sQ6>$$C&vN=`pne94y823IXYoK@J)>%&OZ7`e9PCPJ8tl|mFA}bIX?s%c8wLh8RAm3u6_;sh zn6|Nz-*Qhs-X{y%S?D?(J9TBDO&8yWJ(S z%rGSio{B%c0AkW@b{3zh5=yM7x?AQvsi#GVZ=^pzalYiKg~u5CF2<#yy1H@1MO=S= z;&7Lg@{XyTJ*mp;eIiSh81lBdI$p9#0xU?B=+%nTeBL2-ej*$CAW=%}1y78QfB*#~ z#q}%vhsJHHW`s)%3#_SMe}$|_*J~ik+=d|`4}AnV(^&lQwbw@6!bS9Ag0S zKvbr}_#r*rW$(w__LZgiE$5x(kY$nmE6VIsQD(A0k2D>>{{_&*VMj(pq5&Gs)2`nD zijy~XezZblLy_pFjk!$>Fe;9-&B>*d*&6iBO!jW4Cr>n83Wn>S_X5$q=iCu;H=Uf^ zWiXAZUDq2q1^h@-xb^F!}AAQ0wEPW{Xv z;5#_<^<~8rxf~YZ;hCYrO-m<#2QCm9HOpE}dxvF7DYFI!k`khvn_nrL{TmtwM+-9n z;kXA}hJI@6e{@<^>lasGw#`tEVnxX!+?;^Cu2Auiz;WpfIQEs_O~!F^bE7N-u4a(5 z_n$_P>gC&lht;jJfFm*fC-O6iPcEZuiNLv42Ku#(>X3}4+afS>vT6A%M3>+?jUJ-n zm!Cb8vbbzwl1U}~j)vwPgJwWu!@fg(Kw_f_umXsDdep4^Cv#OyH#X$t1;kKntg6q) z^704NTP)0$%*>Y9SB@b*dV6b~2Wok691*aX z1So#T_l@r}SRUbYmnRy#yG1uPY<+5%ys4?E$~9V2Qp&%6bwcJ_8|XicSJnE!Nz-W8 zksyh|-(5rAU9F`fCZ_f@ekfO$GaE$hc#mg`B)Dfc2t2h0&<6q^d>8|=59|RXe2zc7 zvCa{C-X`JHSaG%RPEXX4{M+G6>nCD5lgfPdA|U98Q*ZqQtUoFV<5 zVm98oeKr>8^qE;w9o^kem3LqjVekWl`1J9JjYL_^d8|3ZEovKr4Px-B9;T`uEMd6x z#N@Loi>ZX>=9d?n`iE36o=1vP$oe2lwS@8$6GNRN9J2|-LiyG=2HD*z&tVPpzlQ)o zp0Kx<@fwYTZSV1mr~ROnBST;@pB%*(uA=Ng`52I!_yx9Q$Rvhcli6Ke3<~1M_?drA z)>iYzzV!xZh)uGpp8X|9>ki1HniU6<4{J%exdZ6LVQjLpg8BGTaZs>iAg>S7YoI>0 zpY^itwa4%%wnpS>ZO#e-~6qi!`m^& zTaa-6i?=&p7QU#4OCcNp2Ks58XSB)&y`!)&vGSyw&4?^n)?lb0UFgd=u#hO?d@!`I zus4_rHC@6PMP{at%C+ldbc;T&G+ZpYhB`ZnD&5$)@}a%$`}cgwM|!hY*)=_pE7^uG94{% zVDih(UK8(SdER=Hp_-}L7nfFNpH?B`3n_ROEP>g_u-m1tt2+S3C?P=!2vkb(2gOH! z<8}YeTHna{)*Yg#WFP4LALRD$>mE5hfwef!l$%7sz|?Lskh`+d-4^ayotaYm?VBGV z%j|fy2P0SDO&lC@@i;!Gupw&?-2t#LR2bucm@XQpW;Xsx*r@*^oZ6N6h8g5i zrDnix#^U#7*tz;OS`~KCucW5Ey#|D}M-s!L$W*E0`9{t_hGULPnMQqCSRIU2M;o(IW|koSuMjak6|8bS-g9;p{jPb+1df&(PYh2_PYn$X zjIa`$rLfnpFT}NJRyeZl)>EBYXT^?>KV@Obvpt-LJp~J?k||>rC*?Dpede-_4V!X` zaY(}FKc*IY$Vk@MvUL8I3n8!nMwOcfK9<>E!b~sTa~-lxC4R~*GYU=xC3ST^z2^4@ zT`3kGvS@g8qN1YIG&GN-r3EafMLoF0!x=Ep(dp>u{Cs^?^7XN>d}^POH8wO%e2U?9 z0A}SZxNYu8#qvfp4FjKfu)Xx=&6~Wuyd^0GFb0uvaB%SQmRB=F-&$K+U%!4WEG(?% zu%BuLE}V^xjqArgu%8S6l$J)BZ{1QM3wlJ+`71x1ZtCxUzcv&uf$Zp@n#ukvUMVvF z1ua=)9;s-~dz6%~!LcBFM=JWeZmfXYXn()`?&=5; zhiOJyS`cnwK>-^pYer_KNsff0W9geWXjm;VJmIus{at)~d=S!cH@TpXrkwt%Y>>8> z*jq3KQc)yyBznE_a%u`6_^e&>cz$;#+zU8bod{f9xA}R_Tsoiui%X?;wxXqw6BD$0 zf3u|tA%P(m_E&j;94Si|5k4@Nj%ImYGuz^Iu(eR}yse2LUV$unq9!dflh6LgxW^^T zmmVG{Ds#HOzkjJOJC4ih4mI`sK;Cm7AD;~_01l<4Knw)y4uD0Vp%40znU&>wd|(6g zrHP3NgVkbp8r-ud;Mo#zbyiY(pJ6`oL$uQGsMuIry05d-uu1w7VjTCY^~{)UOEnXE zlV1L0-QFG@B*T!uhKKUqySE>oK$eynm12%g{&O2#>dky2czn8d&~v!n6ZY=i?Cq@>G~KS!2k6~FV|kH*Hv`yLm2nj$zY5-KW=H)fiuj(3K> zfB&A8L_zk9K$t8DAgy`a#Lmi4@Vj@*D=Xpjs&zB^hK6{!xC={5sYyxw0|R2ovZm%T zczf(hb*-(YjUjhQNJu6oCd9+&w3G`!r`p8`a7JVe7$Nj8G?UOgl9iPb6&=od&Nfu! zW~8+qmK)WDWi!+8?f7t)QKS4lTAug!mKOTkx2s1+T)IEXIP<%~8H0j?kkeCBPZ+6q zd5_vZ2-Vfq-M@cdwa9eFl$71LA3~aLsB|nZ7bT@`XOdX%O*gmGi5f3eB_$m_y~wC2 zCnpZ3E3}$=^#R0iCSDS0cITe)E)X>??>!$t%XgGm+F7v#D@JQv6}!&&s)R%VHkPHa zUdbn%4+9N)9NIOj@hbg^A2~aNJ63Y6(xs`fQ9?q3hK43&B;o3LZ52ejgi>lU^)GRx zqWI>K)jFQ_O))Vs2L}g;QX`cvWw1hXqs}4P?`rK_8?5U}mA109EHoKXP*)#Wd{nxu z^Q?Y)Z7nV`@>6nh=-apMB@bYuu6~b~@88|s9UmW0B^?V^ubHOsqO5nNX!%3=Htjbc zvi0kdAjTa(WP3IBC-?Q_JnIs zBqdjtva7Pnyq=`TerH`L7xa3$Mum9Ha`6J}_E8Qi1$`R1o)@dK-%9|g8j!|yI{DSt zety1mqY%7O?E@g6bDxQx02^k^^}77{uBXZhg-QU$v;ys;2(X0nzn81)ra~GH;glR~^uOtew5{uan)G zy&m4)+v~VNvCt5l1Q`hUit!jnI}5j)oc3~sq|0kIC@cx$wlR%CeHmy~CGZ>t zx>0WFRR&_>dPsN{6{v$m+hQx6S5z!qPr#Lsh~j*YPMmVX6n5(jogifeIx|Cs;r8_d zK1Vq&gUd{b{r|S$xKh83^a-| zBUfky)$35d)r_GWQb*ae5b^JIQa_1E-#=AdM=cC+lpE?Kap*R_U!S4}XLjR8L4GNR zOcY$-S^o29*S_rVXf7)*kg@Zgx8dNN`xi$$wZ_c``KjtakCgb19@$HPnUA@fNecb^ z{r5r7M_wm(kqyJavhYLYzIY5rW6p7Ochcv!7I@v<@SP5W;I!|C+r_mD8iF4s|1KVx z@BdS;R_W=G!lW&NWkD_o6w|+z6Prfe%YjnGOEYMbob0T zfKqR6egmHB@(R1|iovHQ8^s4M&U*eg3SPD0OGe~!Gk1EG>HO4*$QWE^9(_noUTE4b z#;JMa@Uu%f<$@J9Djc_TkxX+`T0-}{gO>>Z_ySsVmGkrkKjC?=xgzVpf&hdm7EvXA@UUl-8I?m4+ zaXc|n6Lycao6n9xVj$E03=faEF2{$duThXAw8t`~Tu{flh#Ef^Fte0W4~*k!MLmJ; z5%?M05BFqoh6LaP@Pt3-^v~iB8SzmGq#$HCEncE%<8D6#feDn12)amOn%=&C4&gqF zG72M5trd(COiI26+Ozp(Pb|O%hDJP#OVa9jcVuZoX;wd=lk4k=DQ|jH|0(#~*PqvV z&6>{gbA;{1{u!In637-dW@E2Q2WICoZ@-vbnf zr<{t4o>5tJ8@{qq@$B5#EwVo;fzglu&Pdqo(Xj6MJzW_T6%tDQAT+00rZB7&@i$)z z=;EL#Ri4OcPZ5IilMQQSD4h4{mu1)ESI(8toviAzMRvwtoU3B+!m434{i)UTkeL5oBb70dEjO`(1RDmBb9 znj!tSva<8^auY#{hrQZb8G`?=_GWs3vWv{OSqj=-n#0Gh*L&_ZvqaP}u5J?*{?;5e z^k`b`U&O4c+tcjp`_=R*n~x{wE+X1PC!$C2pAvZLvgimH8Vrn7k&fl1>dDL7z&=73 z^&weTQT>?84q#PsA-g}yfjN?#IJGw|hHV%6Czs$qBCG6B4w`{I|)Ef=0^V| zot&oZFIMO&DeQb}G8#JCzbZM5jcfB#cL3f2P6{@K6b6WL;K1c~(|DpvyS_Unf=rd3 z+dnMp9||mYtq6(a<%}?j{ii%me}d%peE*){p+Lf_#LYvFhXU7OkKq9(?B4{XD0?fo za3~J^k zU@?8hKQxW@HwQfx*)J~)9i18r3u9yy=8v7xj&c9oS!I>0z}9*<{fn~2;7???nQM)) z8+E7$l-}G-$H5Wq4Pchz=@)mv;_LfIZ{J=c!}dXfxlC7HMFq5%rnyaeI=YR`O`rMR zOjSHQJV2n^i#@|kIt~sckEvOiQ9syMUeCEjTTsGwL_9exikL@fL|e@&_Bf$7;_G`T>20t)-s!@q%9kjt`tck9^2){P+9=t0C&w-hf7Y6<^)JxwmOyv^2Ei(4|ms2kM^ww zDxN^5Jsm799B@Tuz9V%6miu_OtaDFX zlX_rNF0)$$&(|B>fyTy1kPP`CEq9g&04dMR&3V0kZBb;tYiM8q*6D(732>i*+$b)- z1f&3;(@w^xPm3dE98I}!Oh-@O)6sDo79#1UeL0-UQwz!h?C9w;L1ZZ!b1f?_-V2uI zUx4H+^?6OA&#AGM@Q@px2?mq`x|6X|b$1C*#n^bF99xV68#lD7GP$<47RhR}*nRHORRTgnxDO)RSHzP$VdaMD!ul2yyUezA zQK+H{8{6lVxW0h_mQ1!rg(n7)E%Y-{B(U=I`LorlBV|6+^zhvIE0dPayf}2-Vg!#uGZ$&AveRO~t2?z+- zj^)&C3~_fyoJ0M1gca@#m&BbOj_Hn+RSo5(#w1SF16RtXVEN0NUzqO-2*Dci1g}Ei zjL1a-p!bxF4R|f+3r`d;N;)V0Tlv8!!U3(gNz5 zP+V6}>h_~cx({-2BA#(-X6A(-6MkW+(g1Ga<I8}!AptWQh1#o;pAG??pz$2)7Jdz1lBunt?C+lf9v-8m3@XrMU=PeezHzyQsC6&5g+e^ zsYzx6Pb?qfB9qN$%C@8Bi~+i_{3)bWkV*9Y(x^=LW9lSc~vR6msg3n-m zwAEDtm>Zqkeu;j{V(O&A>iJ8U_R0fxhK3`aS7Wl%(?>kt`~j&|&ozVUbh^8D?=mu) ztqc|n6`2*~jOIg+FsGgB2G zd>q=t!wSMkiVRhJa94eXasjeZhfVgt-AF+uI&$*U!!^dr?XZqy@gg#E7nMPnHjmFE zResQHf;ZmM@(McoO=cZ$<1_`Fgv3O}45jszqOrnBWsvWdPnRA^qda|3(4k_uD2)Wa zR|_$2{D%*E#u;%D4xc}L8mz7kr;QGk{}S^x-(mCJXoV9}n1qqm=>ZZPM$$-4x0S^7 zbUx?3p)nV`*&h>YC8FZe(o|ggO<;OCIaulnBxzx1ISlvo96Ve*Ey7g?=9%5g1{%l0 z%F1iE3QCrVt7~P%z?(5Ha|;WHjp>GBiz$`$46Pao@A>Hl(h}0(cb0yB(O`fY9)3CI zwD!bi+ceI3Hap8JT`k49Y;cQe7RF@s_JbNO4TtC)cI!E8Ak>1_g3uGDC z;1B%>UnYv=VdJz(#`3DDs;2*|AyA}fV()~;#@el>cJ}ya$8?w=&wL^rDjmV3u(9EK zn+$v}At9Sc3RP?cWo4J8USd$JI828t%_sW6nd60NH&S&w+V#X`;((M)|mXh^l>Ek49zuPw%6j@ z0QXvM9;2=`xOL4QIPFgMB#7|vX5D$j{^B;n7H5Njaj>1`f#oL`^f@;C9k zoP7~!3b3Xd8g-olhOh@iBK<4#) z)_z{%^gpaxEg((byqQr9idD~OMZ?Od!Th|OoZP5mQ?W?kYNII-C`ac|EGs}wQVE>An(~s`152~`c(3l4ZZIrY)myPrE)r0%a z&Ujceb7Sot3talw-2TRZFz)&i{%$-ovxBjS4~2BZ^EWNwyKddLXgr^~w2vPp;!JUV zmV&i_8N9Sq>JHf@ub_s8sOhDM-<=iQznSl8ZU5z~H+lBV9;{tE^As@M%2}5;+Hd?9 z0>Q|L@)BkWzx@vYG}(RM-UVAx{w&1)Yz!5l`xjV2UxS*mvF1h^PDfTA7AqnwF%%Z~ zWq{Rnx(k@y$k5Q-fS$gkv2hVD#wz`0)EL4}*2N$NBlH_vT84{w;6uHq?TJphDvbQM zT~$RglL(7my>$D_3%OtHI~aD7lhyb3ro1=jP93RaXpS|{-}$>!;#$y8tNrJhrWl|x z$jAe!C@=i!Y5kk^E2MKNONb`)DlzvKu)ZyKhwrkVxzG6rBAyP)RxtkVXqpY!fOs+u zeyL)nH{Qd;cc>_$2l5+^zXz@P`$a2c?9qU`tBm!RZ$9_asFRto=_;G);#=>pHHtU6 zLkx|1$$^UL&5Tt`NuK#atLR(2_0vq>;z)?0B0`79!_5tAqV4CzD@S=npA8du=H;o6 zG=m|1=|o?zx2lx;wRdiAVPDxXIOUgm6BD~O2lAferXL>?eeZ2*`j>5sCyA1N<>k>m zx^_={-dHa$5ld!`AHZRueE7 zn#)kEl&QkT!m&%!lnY$N6DZ0@)es@v_3kJ2aPhfO!(LThp(O}z}XM4inJ%D`v>1pi26c~>sQKn ztvP@Bva*!!d3g6`pX!a4Uxr($V4D~(^XJvmbsvd0&9-9fLFt&wp&{rO=tO!Ckm%$} zfb*e*e67kX&m^i3c&<3N6G=(QOy4Vc#t}I9ELa`6xq%oD#{-2Fw^NSQVJ>DU5d~PlE~ENSKNin62K0CE2DlMt zyVJ_oDi3M5WaN)Eqk)`}P*=|^RCs`#YZHm)b8^^S{RSRSHnxIX=FK@CCiFaTSG%27 zNOu2oSxeU1qVCsqSY%DWp8vTZ!I4hU1V!q>$&f5{e-|}t47oQ|ulnjWai*e&?-g>i zPd73kgZR6vGe@A^7P7(AzGf0@h;bDF_M4Tff@n9SB>Oy(AMNJx;% zp(_IzXKa~MJqTZQKttm?*BMBv2)YS%F6ui&;spWw-}&8;^b|#+!IvZaJ-4l%!N(V1 zVzuTrAJ1Q|yJ(b`f75>E5mtERPiK-`wF^vA#6zvcO5O`U4Hgqi(|rYDHA z{q;pI%Z($Kt%F*+%0xLpgARScH>r7HIF77_>1Rwp1R7Ags*ud1pM*n@$D>p5(;0ITN>+BWF*U9{fcF-O5PGyr?j*;K958B2Ad!oXjq1mn{yvR{8F-Jv)~@PQa~ z0M7FB&)-j#X{nAVB#Ui-lq}1SuSvkn5^^J-N&hjkwdb;^8lSj|k4%x7^1F6QLI+tA z@yJRFa_L5Gv8*tiX)%W@He$K&?>5-^pso4$KA2rmk@6_Kb|VBm<~Gm9r&uD(=?$(- z=kSw9S!fS7y`yA3@X#?HdA7bK_DO#(hK9Ix{a=4_>F)=Rvc9@VDfIk%fKE@|-@0>Q zAgo>dYYyeFlfIL0`&;kvbX0RI*=iIFezjEr+WJ=y-Ssc{-%OV~kt zZu?F3bFoe?sZvxXMe0=n#9q-3vjt}5>l)V|>gop9`$u)mr;G&zGJ(;8v_()Fa^I(dcG#m<@h-ps%ScxY@??&*mF7LL=f+rMnp@!3#e z{Z$g@?ZE=KmTkOt(WdZh--P)_+BV)PKW)>}g@m}1t;uQ+%%!2-1ZrP}EH$gImlcKC zxNGjF9;xc>P_k&N7qN6Za@w$&b7m?B?+e(MHlAaZk76GpwQjGJm#0OwXl;}aK8f?N z1A}9j$82SN6A<-JLx%Ko#YIxarc5r)m4o(j7`y4%&vZ9`(vkbfJ zR`oh^7O?*8{_|J|lUU5ycX+HGkk-q|XYO^yjn0o%^+j_9B4zUJ*GUETbw=XvYfs_E z+E2c2<5wkp*wLMaznuT%P}M9()2MLjbG_?EyAW98G<=2nsp2x44uo?EX%(}4=BR8( zOKS2B!oQ*M*bX~Pd=>K|;imCT;8`txwmV|C*poiwfyvJW!wcpTnd_3#_M-tjg=21~ z21M+}&FTXN@6Z@|f%U0;gMYeSGIz4|oxE+>vdN?BXhs{8-(LOt!`j-+-O9)uMDR3)}*E1u37lzGxt!lN9P1H78W%N=Tij@f|Mic}Y&iDbUk=IzE?9E+R$DJRP}GWMq*DvLKR1yPxb}qH7h?UW@FinY=3t@Q;|SjdbAOzDA(*b7lUcYSCiM4<(Hs8 z=2EpYG{%qP!ln~!1;YcxZ|>=dQ;|WQOJg@Mgzi)(^!mmCUjVJIQ_%x*&?7*d0y@4J40(mD?>#Cc4OJN z_(cKXA>na3&uW**g(dFN&~UGnPeHL}sq1l_Zj(k7mz5T*zMWyKqN1@A@s{TV9IKb` z)y%v0=f>tkeH#@5%$AT-&~=)1s(sr$eNOtaS?6MUD^>lCc-EZ)0D^Qs|I9`<6kr8ig7A zQi#aDOpGzs84M%)KJ(pkPRsk9bKdvg@B8EZ=izxg%Y9$Z^<3BQcU{+gfk}8QI6w*a z28<|0#a%@O$zq-)c-_W`e`hKZsA{saCbsKMURZo@%*3@KZK@S{+2{Q;#TpbaTdaN1 z6-dw&ZEqnaY9?Riu3t>*O^yB23n~^7LOH6^We?IEQ3l+=<1|ZaVLOp;_T423 z*}N0)7~G66qrio~`fgUe?k=zn_#5!}0YSd~HYvdPrV}!*UrL|$=VQSYajf=btnR$Y zi3*S7vaedGL=-)G1lW>dENGSYj~kbS!=J5$zX%S8Xnemyl^&%bmC-edC@5$%SG8vS z?oy=z8u}9(sTJXQIH&Ij=$)&(lAxwcxh~7O6J+rYg^C&yl8LnL4?Z)rqCwWRS5ljV zLV9E-wXcW6-J~+A>NFUmJ@r*){dCHdf4N?7*QwYyYb;IrX-A=~L)ZSUtsZboMbdHN zmdwsiy0|o)4!usX?ku$<(sc^zP>vom1QyH$8ky~+!+SHs!1AhIGG=Ig?m#6pw*jMZ!S8t?N+Myd1&%eLHIbvVOd){6Z z(xaP_QS0J#-;RN4Yz6-q(y47{zJH-+NQfuWt{sAXSXTGcL9bggiDIta7mU|ky;^nx zM@ieV@u4mB2Jyri>(1bEjT(>F9^HhKF-KhdhZ-bipr7N)Uw9AfrCV94Dsi%i;cQgi z7mBIB9Tx9PJ!F&SvDn!Ko1@bxANCi%p(kK-ga5>tBd4$3FTZcN^TgK}QWjE>pS^xy z-Zj#zO}a~p|!OdaK)QZr60!0w-e#>etrAoh&^m~jVT#Tt1ZDjo$ z5NxI-Bh5UY%?*=Pxu4JV@(2fZI+F`pe%04l1@nnL-r6XB3Tb!|T$j;%=3Eu{`$BBm zYI>DzYDVs%$k>^Q&l8dz9F9ku>qlt;JT{oQpH{(RuNYHqmUbrUfb}_5`nY#Dk1+qV z>#Bai=D^-#p-%=H6;J1%s<$2b0m6=A`wS(K{hLZObeIqKaoW}J-^KV_=hn20t zq;8pN&xDHV3AAUD)_9$FUBy z9!P$5r6N{r!>&}dFW3U=6`EVd#wPw1m!tSE<^NpE?FiqqvDQdAwB0{ie)8*N?K36n z6^4?#gv{btnQ5Ec-t|1c0fxV!3Q>r__s}2YwRva7vpj1jl51w&uCU_QFhmMbqrPX} z5;{3ywH%xy{)@3$50;M+hsA$%j_qOX_I`|4T@|~jn07sJHFPX))FV*lRiag43@}R& zv3<*Pgzw0BO?}#;2E{{409k7*nZzM!AL0}(8 z@wYV0;^V7nEVV5D>BKLX`u#=#Q$b$27p_b(r0j^*m`-`@Ex3(eY_}irz^r2eC}m64 z#D5t-|55+#!lX5)sl?Lsk15 zSELsQT$*WdEvj8vt&eTn>^O@iFem74}03{P({)^#ofWT8wW4=oP?e0}5(mEQq2oP_# zJY^Cdp=pb&?*z?FFPk;awsKMC%)`!B=7kN+!y-Q~m-PgtDc9O$!Kz^+<+}l29tTi% z(3_+7$ZP&kR}*f0IlqNYKH0S?G?Gd!c8Ds^*d-P+eaY*Mbeje!d%aHgF8P4@Cr7X5 z@T=viZ4N)01?aE>S5Fy#N6p;kOI}({T&RVHm6lEk3Wj+uj?B#@p>JwGS4;39irWtq zumfn@{x>24YrjMpdOH;}Kd&+8R-HS&7DU&2)6`*ZXFUrIse06X3cMNZKUfiG=LFP-VqgJK9o^tNr`t23FY+pjSF}n08Gs&hv>61Tk}Xe z%1FhMvNrQ;qpFt^P_xK4d6@>rb%mv__mV{Nk&gbi!4JSciV$Pvf1@_A&`^8z%9TgM zL5E48^@?uJYfp?r>nD*nfbuo$VznJcj`NFf_LLExwnR|wYdPfh&y|*btXUMV9J+Jz zeXi;z42Y)!EAG>m3t+xHp@B?nHH8_-!uB$j>ry09pL8v;Bz?P9oIT_3w$FZAUVTDp z>^whKt}ZHTiT@eImTw<}~QoWdIoiz`eYvS3I^o!FZU2M3aD?Rg$VD zq@p;Cc*a@J7XXVN1v&F)76QRC@PTyL5d+S-xwn&Mw3YRH1P@ya+AOIqLZ(V0n zCntwgIJaLLInJZ*SGj87(??>s!{pa`PEhu`A0<9txZ=A3S`r#$R2h3>bP8wxPKL0a z6g$?2&CZn7 zHm3mT?Lay;MYg5Fe3NJJ*=M(s`YFCG9i)fJ`@PqRrc7J-BE=wm%`z?cuMH!htbBZ(Ub}BNk{<#Pub2QD6u-E zS-x)u%sN?oG0w}pHA-64=z3uQr8io319bd(I2EELv;1BRosP{`!W^Q{Bn{Z0L4eir zryc%qR#Ea4;BCcKD@Zg0WjT7uq;@N0ro)s=X6sE+5sPSD`A*w~1}wrj?UkcB)AQ#G z%U_z}CoyNG%E7YphkvlJ8n-!S(PvI*?8cuA5m2th%7?rAn^`FHrVj{X=@#N)SxIDG zCY9}JGh0KcW`96HL6ay zs9$L^mqlM$Tf4XUcc`N0xB{o|0v~eZtyRcCT?LhA0cn4JTX7cp>74}DZQ^%6PEd?4 zhTMqQ$~AWsY#vrRHhkmoBD-?$h3GwQGW1oFeBySQa23lE?f>ShEgcoQ?0`zkkSdi}h3>CR$BSBJd-?BhoK)@wK?gZ< zS&?mvp;H~MVoBnvU~?pU)`8Jioun?Th;Xa1z*k=Qlq5L6)R)E*v_os^{FpQp zpP-&N>e?kqmn3THK4icIIAbNSID^8&!8cLIuJu?ZW!y6w-2o;z>#{jMI>67zURs+ zn;7NmrlJm|1W-e4X~wTfsLdtZ)o}QghmHV4;5HY1mw|gcS+c#{N+jWQ)GC&_P)vfnKnIK+0m5EJ#*3kqI? z*O$SWnRrIo^43B9EHKkWkb17`WC+zp{HeDR4cqG~Ty=Bpf=)H$of<>r2%>!L#U&k) z0>Z8*u$V#yrF*?9S-a%TUB?X#J(z%~ym?DFTIE?XSis^2s`py+Pycj$7Kw3`hHVUo zf^ZsczMbwc=g#XZnZ$tG`VBp5e>tjfcaS*Hj%f zR8)qHRZ|8vI)w$-J)56iYS?N~nwjA{DEwJ&cVWAksUNIeBlN$-ngWLphKV-TPuvd0 z>gi|bXj7X)tj1Gu#ZS|7bgf2MY1=@j0eU6|FKT=bjB_V6Ikxzjy`OAxg%fy26@t>IVr5d{9Uk8edDPgP;c#UTYp_G(+IiWBigRDAveYS-|LHqg)J?d%6;&Y)ARHb*{0`9e~D%=2m5W& zLXZ5Lxtw3_n{&f^C@U*7sQ1+#bFWDi$rg+6c|f=cCkph2Fy`~>N0fzqOIqaGYR=wZ z$h+(FP@#zJ#ju!#wOIb45K&J0yM?+4dfJ}JTaY{BzdBVt0W=m+FvJY zVB|34$s>j|!#p-O%!>%n)c33kLzS+Vm|tAKHOQ6k$A0P@J&!QIg8PN%Mu%dU{&S4x zYu4!7B>zu$`vlO3Xvh~6)Od;8{c~=sa@-0NvE}EYbNeG)jh}=9m=85R7Os#30>)u;(^#zD zSa*$4o~;hRsi`Pw3jjv6g zUw>IGnC`ctt<9W}qy<<@9&k1}{8H-!eE>7A6E`z(d-y^*e}-9XO=}!)hy2#~)KnDF zcyog0T9oNjkl!_c-PugG;wf9vxSQJ7EZQde^C<=7b)CWj;~H@m76MpNJHyuCRX{oh zYMZcc%%`56p~rUzxB^~W@`^*wXKhZK`2>g8EXWTG=XW2F^>K5+puCcdrTnJYjg{yv8wxa8 z-#btyPAvgneT3#3ACUU3Qp8FO@jMMr;16r@HIw_zc>J+j*-kfoDoK-u8rzvZh3=>2 zzxJQBHdCV(%l_`bcqN^cXxM7cXxM(z|ib#?)!P4 zc#n4<-?#tRo8yj|VSc@?wa#^(=ORE>S{xIN7!3k}V7`-p%0nOzqQSrTs1Lv=AuBKI zAdqK}chEPAj`4f*4yp>1_b5k$m~S8AXee>nc?G7SR)^%FW!tUF3c!#7NmyGg21J(E;b2aOP=C4Ahhi%9^hl{C{K@He-_8{RR;{&zf-h?4BN>t! z%SBChe2zy;ISN^VPA6;IqgmSSm+SYpi}#wZ4w5f^V4I3x)%H=*ZqZ_9IsVz`FDokx*xKli>yPDJMf3LdR>@a=X*$J5MMd@Y z?OO|r!>+C_i>6!U+OfUqvV#2lnR26un3#7^b8~YfBqRZsb6fCZXV>4=^(?iuwRNGv zWp;YHrn=f6N=bQgeEd8$l#D;ugA+kmsDz0G{16i}JVqTz5|V*hSy>GX3}9hlg^+MB zlI@h!6bw^@~O-c4~H(pO3HbV?`k27ef8ZlXWgGt}^|8hOz;0C7PO= zWMpJbcULCnABrvxH286Fa9CJajAw0=nUqCyhwyOP+uMD7d`g(=KDP%}SMwBx`(lzb zx?ajx>RVZrfZy2WjOVF<8!|LBlqle0O`YU+u4Zh^&|5lLsJT0og4kQ?je@OJV@=&# zDjr6@KUJa|$*;Da0TIUTCS!q8h8GkRs4^w88w{*A^78U(X=&+2 z(UA{*QD-^qnr?Kvo|;mP();u0Pe^cZdSt|pA82T37?_y7`K$Z;4fgvVqx2?=vz~c~YW8cBY$M5Lqs4|~_#l}`#T)c$FZ@=ew zx+OPl+!;o3IF#Z&SNh;BP7B)y*ui{~kVoRrpLi4$O*(DJ=;%R5M@L@~QE;5^>b!|?ohN_BNLxZ;;DhdVkpZZ7|fWK86%QH4viwzUZe2-N(L5xTV<&sAdT zrFrqfQbGRq8n*dfI)RUxpZ*1Y(0H*iBsu8|Ho?1h@0695LEz1WAs`?K3JQV%2a(3q zyHM{mIyV=ur`C?!j!4XCbHQ-fW%T*;$<{E{fm?t-$wWk7a(y3PlKa(mt=+C_)O@iH zqDof1L(wOxH{KjcE8sRzrOsAa^m18Wp6DG&v)kDGF`uu!J?UjFm2?Bo6&%)VwsKvX z24^^d-{JM^*QRD>^Yil__qPsFdN$V9wf6hQy1J_?EAZ{jr|tJ=K%D02j6;Nly2)8w z-Q2*+&kzESr9riW93RK3bPl2Pt;a>*;dqLa}0<>h62d;28U zlkQ1vkNHZoSzeosVl?_f)lJxyp$2YxA)?3=2Ya`^T%Du?L`(Xj9YBfDEt$ zzAJQhk(QU2msy7x*>R0$F;{*3>!mKoJURrTg@%O%R!MnG%=B`b-(fwZcR;V&xZ*skiHZ8)F1kWUC+a<8cO}*Z3_a%1~{qS(WdZZ;-G0@Z`N-As| zISq|xI2oB@1HVf6m`vYGOV3Rdpwmiyd|sd-Pbn?4NLNs)FV$MA_vGYcWiUy*%2Edp z2kBw{`N>Jw;35e=m)`jvMSw&}PJMl60zXP$OxeLef=D4)jgTRm|5k_4ah^VX8bZoD zG6DawU+W4N6%~D9(;2-N$Tl zu5G?=QLqz9URTeCQ>7>?pW#V<*@f**4@^yEmn$-c3qH#&_)>&9#}GY#BYknjVx*18#It30HjT3Y0qb+tdI6_W%DCksU>cr49Zza7=u z^>6kOrKpaiiO=p#@j#jhp3q9yJD(YYYH4j_1Hh7?PU|`$-vQCA+R926 zHH;z17+bb$5_C9jH^2^?r%oydOZ zOLf1UtH#a>q%QrUp!S|Jyx!fdUca9h)GybI40EVcSf?pc6~8X z0wkECP#=0^xoa&@5kz(xY)VpXXNxWKc1vw)jNo%M}2*Lrc@l) zr)JNA1bzwu=b!!nbtucqelj$afJ#O&Sy@`rSxm>U8xWI_B)xXBzCPdAP|&Qir%naQ zhn&yWKTr45r{ojCAm}tWC$}pGZkU{2^nCfYBsw~Kq(eZ{se_o?Mqdi8bbfG#;OckIQbor~i1hP4L?E*b^b4PQ(M`YZ8XwF<2ZH^)S)P)Y(g^R}fPW z@j479j@sK(wYE7Fsj-*U_q4RQlkt66wy&r(i|dQ4y30yxl#sY+pRm7}tJ$Tb+Jvuq z5^i#}O4I9$<6Bk@Rc><)AzfXnc3dS3T*y*P6tjA4T-^2LrH`*KfGLl|v$6~%B>YvG z@PpcWqgi3+=QNaGg^!k6yaDQ>t9*us#%(qOg?4v$KcV^XEcIZ%PFz$JXBeP^o7-EZ zS)C_OR_*s=1EFdvg z?svM|E1yfCO!$K_e{?^7RF?3+Ki>~>zdf5E&^DDdqjmZwHy)u+B&H{&MB%H`c`{?{~w*%x3nV&q4^_h}!0g@eJa8H1Z~d??udi9vD}#4a%JXV!Y8o3GLD|n!uQ~u*^4V@#f_KAd z;)_ili!(EPTwIl4K`R|3&dEjd=gnuy_{DODc-%K6%Oqj38x$H1w+_tI-o>!1WQ^B3 zSX@tPTa1ia2za=UwYKKVrKN;X2t^C9-pyLfy5I3Cz390+n^f-%&7e=D-)uiVYWO*w za0;uhCT+JJGyN7ljS%AS2vXjE0jhEs1*^Jzllv`bW4e`sg5f_eQbBWJO+DfW5Cf0H zLA>dDM+k`x#e>`cKR?i51b~j_{>ntV@b_4`SP;HF3ijPCM?oy72?p5}=B%*q@;UQhQq&fJ4bSh@@8a;48{;3!b(5yuUI zFkfu+INLdliQxr7w@~v3y4XnOZ+Lfu+0yc|bP~%3TraNNXeL)@m^KZiTjEk1y!I=; z?S6vRA3OakCWgbzSRt)rkpT7~mg5;Cqr=Hs;0|jkx0pCduk~uzv^LK1}X8 zb;aKFT`g4?RuI?JBE?>mjG2GLz60tz@yPB5$2^XJ7rar7eDghz2(+O~Lccr=YpGm) zo~h7k%p*f&xu(m0jC^pmcsCxEYyF5mJ(F*-p&mC%@A#dB0K8$mf^-q$V(;kBvu8tJHH5ah9Aw7G>5DLw&+!Sgk9pQz}^YooUZ z?(9yR}*!X-fv4JvmbMXEX;j+Wx{!f#hN$zx=w&(8;<|yT&n(hPR zxRq`y8X?IqG*Xq2{4GO-165uyGv`T@{Q+qTCtQ^&z~8^BJbyg-Yet%GT7}6IU#!~> z5G#gTFSx7lOG;?7WVEHA(X0kf!sFs1G!&@BP}9-~=$s5CBqRbtrSnyaDsxp(!JU2H zI*v`RRoL2^>g7e7z*n&%f72Bn1Xaumt*NV1P*y&uciO#%IS9Eqj}vHLkO~m%o16D2 zNl5lmrq0*N#KpOA8FQ>Pf3<-sDxO*c;AB2mEe_?kkGHfYHu*G^r<8ZBu|^^2nj#hV z$k(^Q)XeX2G3k}z(Bz^=Q=Gq82-?Kl3?k&l4@zk?Uu%c-^zkzBS3FjNXaG6x6IK|N z_lN{)2OC_lU%&oXsO=%k6y^G-p9c{U0Vn1c;bfjl+^n}~DidXCg;}xr{2r~0763cG zChwV|s_Xb^sRKGft_M1^KyNDfirr?TU)^JSB;@(qMx&|X0e~&e&oRLkMC5|)&B9CD z+akbGC`g4BXXtnB_$^YQQGE1#yWTf=rgRgOMqjB8r1gv-GvlcM@ zL2@zZ!NEWfzS)aZEV7T5oI!zF8|wlGGvhvb)8*y)I&HPAntWgVy}T-|w1eWJqUax^ z^4S_L@83SfVb&yWV^;mhpjBzgkJJ8}skE|ivA$;h_F5+KwbOHaN$0bx-#xjBG!rBc z;Y4rmx5C20^78UeqsEis8aW<-CstnGH&Gx|s5zToUA=aF=pYln6&VvF2}lO!hYx)H z(a;h(%uS`BDJdnm0beHab!uwDz@CR|Y)mL?J(}o1;VaVG51<1eA5AOsyae0A+In2WbGpK9-ZYpKWXBu{l8v4|n+PmR>weix?~$M8uYp^*h`E_?EhzQP8n$xp@Etwd(9$j#v6M>jpllm6qo# zsj8Mc98NDSnQ7Mc(a||tpPM4%j2Bs?3}Zr)CoMzxj*#T*O+kY5xVsdKT|q>)y}Hn4 z45yoIYm4#6XC`L%XdLuLks)C6e=pNi;d~a{)m4Mh<`13L*QW^~9w&SCrF*uj9e|e8 zBg;m+yruQtrfQ@rQ#C^aSa^{|SDW8pD229>u7VJs^VdkF2D!ATgXsuT3W~7;brSVi zWQ?|NeupDRG=S+U$STc(8Etw)*4Z%9?rIXUv)dH1?krb3Dx;Xm^3Fp3QTVVhF!Cp0 zxv#YLXdy}qa^v-WCik;OYuS>odC422Uy+dN9`8hc|NhEu2V20U(!t(-$W|L7tag$A z$n|U9Y_1A;iZ<3Od;3DIMqH33e%I<@5sBj+rL0h=1ip>f10)D!i{`H^rqP@ta%D3b zE%pqMd&#w3?u2Mq9SRvrGKcb{Nob&E7;I?4 z6@7aTv9UF4j=8<+U&DDs*_SM~dGU36(kWD3y>QC$yI)x`!}GYh9s^4xgBF~%z*B*C zp|t}h?Zxld77ro9eo9;pH9a3LQB|04q8qa={QN@%a<*9@5JRfzW7`br* zrIC( z0trVx-v0$|_wHn;$wYoj=^lu|^!1Jou~NHgg7yBgZe?UhV_SBK@zHnAv$kM9yZ?r) z?LL40;cwU(`lNJy#1;iKZ-12&g)eJ!0xr_C(;=wXi-5rBd$pUdEkw(AWq^W0G2P<) zH()Kw)Or9hd#U}c*Tea zS$rPh$;yVW^8WMZom?fC#RkU9Eq=Y z3^*u(xWbtWPiwHry5jkux5xI$r{1pC35ZtqNoekdKz;3^G|AnkiWKbF)V^9>Cas2Q z55&2O2ax)-!Q*Z!iDTmzwH~ZMO%Y_KxLYT9Tg+>7X z=;!ALxKI(w@V*#!ac=hf4PV-B$=Wp*bqF;I>n*z< z8~ZU+p{pZ0z9Bgv@HpKH|N8YS;Nrr=!-*H9*9&q2?a$u}{8V#DcdTfO3il~Ms10e7 zaT}g#k}BB$MGRsb+?HAlpc*6}o;ua{I{bBio$bWwDB~yLx#J2QXW*|7|CSTFMkAK# zkyrR2@GZg~FV`Z#UpPEo=6g$#lva3`Co_H&dg1+0_W3u`BOk#`9-NXrH7SQTk%VH| z@DyON#2(1f63ho;=gqfW!oRYdW>VD88F7wtExV zQKnK$rV@!w)xlmLbp8{#xgL7`7he05ca&M$i$!tA+=dETy}?_C{}23^+d2#QrGqzt z3hsBS{{B3awJufP8Eag5%B_Na<(r|(!EcUN@fg+lqdN9%>AC?WpX-H49M=;J zOqb~yti>iFQTyrtLtqK2P3aOG)*Gj`?dBcQyMvxTfnSD2?Ny~_T_ykrtcNdg0-$Qp zFDA2}=4+>A66@n%>SE$Z#gtla4n*WBBbhEX($Q|}$PP^$9nm8rKai0LBjd-n33@?$ zKLb_;fXedng`%QvB?g04*yOJ@o9>n}B)I`T$<%4%6A%41Gs_+S+9_kNbk5IrAmLv6 z_$lLgF!}uELIVmpIrC(Z5FNf`~hg(yI zSEnt<#|Hje2lK5RAq4hAQ zKZv@)+3mBQlFW;qS6p0tHu`qn$Wac5_%zf3@(S!VhKF-CKH zg=(7MZ($3ht_BxaWmy^EE5Rv36=h|I$_!-0#l=-rCWC`9Fbjx0ueK}#0YS;6LAbuX z9UfUBz-V&K+LZr1wa$Se{eJ?elF=PtfgGKz?=`yde~8}_g;tovS-sO}YHY7_pa$e4 zK*0fYuU%D)a;hyBvBJm&W~&Yf-o8alDNe}HD*)>Okh;hy7P}*QVsBcWY?pp6Sp#>J zoP1y|{&F}iTECC*M^w~wevH|CZ3PPEjtKOvuj>;W9B${+QVMr}K*cQ$rOb0wO+ys* z0m0~pO)=2lFJQCrK}6&M4uI|b0|P9yw6xsZlLG_hSEt+S%m zqQJ-Jayd7pjD4vq23Rv`>4Av?by}&|^v1{>*{pypD3Ed3Gy`Y)&6fq350si_OV zUI0;PGj?aDf)OX-wbRK^%3BRGL_}`}nAGa%cGImr5NK+AeUWW8g0q$KHm=T4YVG2j zb|(gE?d}_>^hYyUnVI@HrruF=nyMOHTHn{#i}yyE!C=}}pf%{JY>ws}5AYa$^Iu*7 z)X0SEaeGEkHHb$*FqtjqJ?oV2A_sJ9uvGf``c$KC_p25)G&GDS@-Kl{ z4H%|Urt72Sw~UO8oJDdO=SOIvqVDcGvz65Q3%C2(at;1leKC10EwfR~aZ{k>0bGZn zPIN*;+fcDe5dJy0xv4H;N}4W}fq|bw)(9XD78`F(Bzr$TZL~NefB9unaz>rf+V-@@ zqbWOmjiU`Uj=KtEP&ciGRgfX~=3Sz62q}^hO(qA3`MK7jwF?DY9fhBL61;Q#84=+o zKZ0g1RiqJshN{Y}USl#DLqpR+z>@z5rj0|E0K%_u(S!BqRKs#_3U+&4muKdd7xtq32L9)1sp%1239-H_^sDIOLSpz!jy?FFT=p{olf;3gRLg;!w%=@>+Sc? z8{L|IccSdi)i_QTj)Em29&WXf8%dcaH4Tj) zvCeOwJ@$vH<>bV08WV!k%WQ4j!n;iX0$l&c;!kg~q!awRe*b>K#~14l6w)lfpISfJ z20CXboP6w#pslN|jUwt6x;>33Dmv_mWZa!7=+&ekAR^**KHUPUjfu(b)YKF_s3XMY zA`9m3BZoml-rPK>U4OyO$M=%=(%8A1X_%lc*#xyiq##6FFBRt6`I+kR)gZg-Zq zrnaU^4v`*oEHtJB1iVx+)X|}NjQT;!q})));ph{pifWmD2%K{THE%O%)YNnbc6g`- zh_Q0A_MVA}v%Y>Qj~lBdz`uP(bUJ$_$FG&TMGiyg=*Z`8rZ2tBgrKN6i_?LRm6JS37yx#l@-zzT=UMSt^zZmEa=A z#`;FHJjh;G@1~0CDvs?Ma~q9#=I76WgP=Y13V71cbYqQ&133Q_t%ezpQ=;m|D_44M zuU$y_Y*Q4nlz}gW(_|tWyy}fwUzkabI6Wn{18Dv1!WxMNq$*E_Y)9w?^a=t#i&DXFmMNT!FndoepwO0tS9c6i3#00zeI@xUt)7d{uLuu6@OpN+tKzYEzei}h~I2~O+x>X+oQjz@gcNimicmipcf>6Sc==PR2ze3m8Xn9}T^1Dy9TVe{3U+o4<&VL3 zcRn}D>~pMz$hEiOA~FgZRrhiT4Cu5?2#)V56g19xo|2O0w0rZfIK!u`=aYB=imbXxEkQEtsT&hHA))HL#a9EauTjn27VB*V~`~orl26>24!fHJ4 zSuW0+tQ*?}^3YobNxW}Q#Jka_PwmxpgmSRDEF$wxLKzy8pWc(^rVf%Q#MpJJYP923 zRSO<^$DZdI)aX5(U_$o9C?S&#&Ok6O6`jM0M3w%eb%~AO>zcZ;)@l zg5QBBJ!IcyF~nHip9K$&k7%?_oTzds^mFFg$NhpAli^@jLwtm;-V3c}f|2kylwB5( zY`kBj331VrZmc!S{I~%X5hdiS@#p)M{yInG0%e7VbZP*yG*84KV~qN@n=J zSc`dI+Dsr}<=OMb9nte#I1rHz37n`f`Xi2c1ot}IZLu)&GASTQ=8iAUUgzcKYZS)o ze3O>e)zgM}yu@hJEa@Azbr2>~JV{1{a5k&f@3>#@YZYnPU}9o!^byJBDfgf4V%zR= z{h268u-l!8nwb7u&Be6G6?{lDh#=hiygiSFlJa1Gc4fY{Dw1XB3w+7npI^fGXg5>p>i$$)-G-9Z5aO1;?QcNRW4mu&t4VBY z5_BLXwNv_9?fgKVqjomniv`qrZcUwUOz=E zlyI;${TUnUbah(fjpCqLZWzp0hgNF2$qm`UNWVYWb7ykA+KkmNo(r-Og@2p3#C1Q4(bAeJB! z&)eV3zRT+8?Xr+X)JW5!xAsV%S!`svU8QVyO0K;Z8O!g?I5J}#~+Ipb9`1q+ZBE-}9=?%7&0~G1| z3d3U(7kQs?KokA^hF26{UH!#i(+U`oLP+ixqnL%Bgonwn;n?l*F#k6*Oz*e>p$-%p z9~6{S9*fM64SC->P6*b*aZe1-@pYSDQ*VC=KWLamM9_eT5eZk$*my0L^HFb4>===A-x3@_$#yQ4qAdn#eu=VlD4v*OkHXtxvPPe9q(^5*CYF&AIfZ8Dy z7wYTV5%u%u`(A?qQe#uo^z%eOg+kg;6XH9pi@<-BUDcya^|Fc69oGSVGn-SOV>9yHZtAa6H`(m z03jjSOO4x|qp%I^0H9T?GJh(|D~=EVO>Jxh2gUTo;o}3X9D9*|zl=)$6xB6jl-}*F z3g|<(IzmX>jX#%s*&ZQuxegZ-YuMixXVE04!k5(0q;=SS3%Y2)K*+P36MOYp<2yPD@`WLfnxW!C&9`tA^wMT0dOUs@Zyvz}K(pLYL{lRkrAM z@~*78xd13Wi$zK5&R6}Q(;pindGJ;EMbCSw{(QN%Y!?_8{B&9rv>6O;F78%4VbP5B z&UWmu&n;f}t6JZ_UD&XGNqSFLfDHMFH7HjEjIZjTdoi7_MQpm)dd3V0jrvb5GQi^_ zqEq)OZ+{ksj$^h^pX}}y1Qa=dOmr3-wUzUK5&!QXCW9ku!Z$d(oE@B!(gMW2x!uX4 zMIyqRxL0!~Uzda&jvL(6=fLR$I@<@mNl8}fd_gDxI+CNnXk#-<;V}oNdzP9900ToQ zXAcq`xEyJ?SK6}&^aC`khr{u_yBmFK(Mk8!pht? z#ioqqFlsN+H3AyLvs92hfhP(Oe?p*l0E*k(e1d`kdy;_5cu`W_$_gJgoPR!HOVH8- zS(OYpdsaKBpr_LYn(jAN_U&gxzQAJJk8Ql82A)_-Gj&;MQoC zgrjx>LFiahQzvjz@!1)#@9oI~tP5UMm~P9GnWV2P+8>Ck$WXn+NDH@^(kTganucA20? zB8yDFd?|POqmPJ)2rR6|yEs7fAxp0gHJmC=$pl_`$c`_6KLoO-!$)@UKo?N?7qS4C zelLXI{bs+F$prn_11|=+%}+RS?~fotIove>%GcOtzGhuI;QmS zGn`w>KG(CSg>%;b;mCLT^%MmN1%GXMK!73}H6RrE1W^{U@Fvh3>qkdHk8Xh8U~c7` z{jUZV-K`lL%>@56Np8LJ)v5siZDPdydr|LoCrIA>ayn49z7xI9v7FWTs z&>NVQ_?IudkS%ghY|y8fXn%v(55a4K4`raBz~$CLb3}pmQYMG1`j4z0jECpUAnohn zQ*iCg>i2hKm%fE0tAAffp3LR%U99Jo(|0o6d#8sF$YE-J7r*x|4>71)wR+CUDf@}y=<+3 zJ0~CzD*PDDg7EU?JE_><$|{QOt*tWSaV<(vly~M`5)Z!q`JEUfU>;|Ok(MglK&_w6Z!8{D@{eTw15+O7oR1VGS$;_9OR|TOP99R%)Z21 zDja&Q$Y@x#&88=>&BT0-LKkPA>H~;tRw*NolPSo5=qTh7sr3# zE914J`O%WOLMBFeX>OLP2o!_r%XAsA3&IZ4OGEm@>zPns|Y@n^w`m6OI?Ojp-i9UX-Sh(enW z)JvdIz=HXi3O8WwY2gFqT0s=vt}M*79fbK03bseF>B=jfFp48oEDw4J^0uzX-ViAA1c8$}iaM z>|imP83WYM=^1SCP^;=d81VLhfTE?*+L9yOHEf^vJ9@7H3 zw2o@4)yC_CI^bPr)~qd0PlrBx+y|yH4(4ird;a+Nn4Fw^G*c?#j)9vyT5lSd^plg5 z!LS4gAt94m>6g}Tk2ENh3pHxM_Q0A3#F2B*Ge$*44G#|=92~s2y)%tzVqks>rcM+! zQuQPEapg6rEnhr*+UjJr)Bwz`z;;uVoV)~_gMd**!6{HH)1NNY1Ct1wz(rhb`5Zn( zf&&0p?p{$fFjB+=hGQ8pZ@_-|;>8PzIA(hKcQP{AsHjILCq09M*y!kSU?RrvRN*BV zC&{v&z3{5$14tw=o{i;}UI)a)sJXkl18YzK5T~-vb|+bxnHwCBKLabhm{z_75zVjXYb$98lC zO9e556U;~WOMruFY$vD`Fh02P`Wx0Ij{{aQnn_I_FsdIv_PAZ20ou*W+Z&8SSj^Xo zzJl3EzQAqQ{%>5QXra}=*v1X%7(~bsx;$z547fTpbaXRQQ-BRV8yJW~L1Re9XKQI^ zC-v@~(QM^@z0)86Y|!Bpe608ZEJgi58*cGJO5n4zwzVbYFqE~mE!S8D44;CCh!+q@ zfXV}`ljBYH5C{e8CWtJ@)4fXTnb&zUToot-L3s}|SKzLG(l%HSA|x9FnLSzmpCtoO zNFRdX4G%((r#BDe=mBU+G3L0F4QmM?kVCLy=}5dZl9nks;mw6`4N$I=*Fl|pnq&HX zvC%C_=iA7AEGLQ0-OYXOQ6r%3^$3@N)=^D?f~7H*-fgIdA1@>{GF3eYyf;dY3Xml- zP-32KS0!erSG-56k@zVJ)plJjGa8L%H^6Fey9PrmB)LbK8vG#PYoI_=O|h{Js0mCb z3v&Vjte!65rL&=cMg$Kk<(z@_5O_KV=jRgwvg_M{ z0duY^8#Yz)e0#g9x_+@_^;^WKDx$Ym!N-s$SKd0}N*0JAxjd;YQQpH6)j2RY6uA3+ zB$^*+m=tb`oxtLy$~0YljEYlXH2MvgojvwPv)aJi5s=r?fq&}PFHv4zY+C7?M1K~| z+LvFtxG_m4c&%TIEi^6zgS%*|DJ9yYm=}-PT+UzEtXgAZZ$6=AVPtXN=o@eGj#gFu zwZGW3x6ywCFs-v=`G@zoz@eECCIj@js4w~(z;N6+Q~45Nh@04q#wT%!9t@^kz-Wp+ z7-2%&p}Utj2Z%jS#lr(u2z|Eo4hm4|qWksbXjTyzotuea&jX6z9*~PtQr_5}J^(cT zqHEcDi+2{Z+;rNWGB7~xiQ>MAffft03cXa&Q<<78>2( zq2m!~*K&wG`*gmqZmg?te|5$WjEgRgJT?eTwni9}B_r}BKS&<(`~}YFv7Gx`TAn|9 z_KcoBryecxN;z_O^03iGrPT3QReP}!`bAd()VHxV-Pk;nKggI&aEsgMzyTFFJ65fm z7y!d1qbH!Y=cc~iZ{M2iUO`VUj&1ns!l0@7_{@7u%qAfulY^r+Ex=_nQ)wm-VDT%0 zCd*}Rmup`xuCo9-PR=rr$AN?d)WPXl?$_?FNRuVNFehZlj^J4-66me93&!4%nhN#^ z(%=ra@aSm2hzJ3dlLO6npbl@33az^5D|EgFok5~N_oGKmKcfN(Sji=!K+i`*4>~^( zh>M8<)&-mMJ>zgX7tmTj$Fjmq(!}ikoRB-YI51fpU!5_ZoRII&Ih}0u*8{uV+2P>; z+XwIsir0?L`!o9&7iCR1Kdkm=qH;~iAVbbPtXQ&@46ao<542FQFCW?}QLn*bXMHU0gh4%yS-0x?esxfI@+= zrQ2~zO?lu|@rppZOkW?k%oMW3<{GX&{i|U!rFtm|^WwnZ3TP94cUNj|d6f0P=n2;* zp6p2b1KPj_hO(p!cdOf!1bzljN&stnJgNRpD8NW2*nt4gF_vAx()9PhX(YoTN1IXt zB$>q0j^xOvN1oK>^%mkk27m5b6|^A?Z>kPCMr{co$s?9pq+lmB1n?FcK<>XBI)Bf! zdcK~s`YR*+3!g7bvwOa8-dA;gF!>jigTR0Q5}&6s+)(n55!khVFf0G{{%-*O4ErA& zzyY~KEP~<#^UenlxW7m?YLCgp(y|!Y<-vG}4&jGfM8I?X`;?Iy6{Ns7M-!3_=~#ix z1O-{X7RP|}cmpC*engJPi}df;VnC@uwdQP_K!yW+!-Q9ZK2%)@!Z?6%tW&h)B>~@C zTRKsJFsFWzSRKTN@PG!R0Nx8FKlt~At>FQI=fHov;<$If__7=*vY-CPfG@Xr6+Uj| z$*p>xpIIlXNhqf3lkxAqDLx?^bUwttx}lHHd3b)g;1CjKuTcUN_>VzgVe&$`fA%2o z-pW?lsmkK=%9pO}qF85<%Y;iTl1!fSZ}(wZA^XDrfdA7!!@Hv;?*HfWQ-Y-MGrrgX zTxNlKSWS%-uthT!eOukwc!7J1N95%1zq0ZGzTB-lg2w^YwYFZVG}q)Y8bLE!|A7mp zM#PLNI8AVY4*ETsz~kB|i6C7^*)>%b8_$NOm@-p=6w z&$^!>%9RH>`tt)rcHb5X`sPJK-*CaNXUD6XBwVCmK6!4bWj^x*ks+{wlzanCP*5+e?EVF);zlDdd-cJ=vtU=C zNvJSB^Emp{R8vFWTUw;mP+82zSe7#)e+;ZX69xRTRfU%TnmV5v=BZMa*|#PqKRe(A zjU)u3iU0QulIqk?AotZYD>H@b0sd)p9#iw#eyFn%o2b;o=2~z=ar-&Tw*a--Tc0M;1G8jPBUR;MA2msH)c@#4`zpbGa%sfQ{KBe>S z!v~i^9yrVkY3q z&p~#s?n$NvIknlt($7T-_5dPG4_2ZRs&#WV;6UiHWRV~8{*CiYf$?z29q10$&%4g> z@85W!wj18DJ*2%abCpkR29n!Q=io2X_7Z z%N6vb{h4$pJR z*M(XQ%=nUA7Sd~(qe6F%cz=1#e#YOJBngsD6iP|FtHFPI)}AP^DCl@(dwb zozR7zwqYX_sCzI0mRCcNCiSp!_8k-$lPve6qXIcgwZMb)^myKC7b)=*3~s9daRtmS zn5O&2I>qXK;Rf@-zW&yO9)$L|m{kFfn&fbR`} zBj~fCp=_SA6!2P?JO$IJ3r9zmTx^dm+fK;^W^m>Hg<0BzxB*e{R)ON)_IdkTSGO91 z$l42uF1CfJDDY3>#)fVzrzF39e!a0?rN%T&zR^08K+e}zJx8OROc0E2sM69}pa(5; zan-f9)htUp%~r}YBSPvY0a6Ffwn~e|50ys%ShlxQ0~cR_;f*8c3M1Y{CB=_2Kn?Yw-(HhOpxXkPzH7pBij`fG=(s%9f{T51-6v1lqZrS$G^pMy7m8dH zTU4$@v62ebug6(~w%Ak+mh!enbfL~Fw`eeudMt%K)7kM{B}QqY zt-qBOqpcXYUty`WY{6`Fbp9@6@MJd~`4VsbE!yKlz1zb^)Qnx6bg zdN5HiG&Dj})574(&q*&R)7|cRFS5P;3--N;#*1=&se|^sEE#XHP|}-WajLyNE>?_P^g^8HZKfLKhQBJ#uobdcDA@JEs~u0sw*2s-EBjoBK5%S=4w3NFvQX67oKl;AP*IMCK zd5(nvV`D{W>`V5jMG)K`kIG+{dJW4M$E!n2ehuY0!Z}oU&BhYyPpP0# zLoqLSYpd&gmC_|a`B6Z(<7aVkb$q;!dR5^sj(6rQOiHoDNU53NWU)}FrA21B& zZjYKw=2cZCe}c`|72RK?d7ZaYQu@kEeQDI^UIBnG^U4CQcm2uVg$X|}e9 z#hW)t!)YGz0&$G=MYpd==!;4t;$~$iajM>=&+c3YJZa*0*mdSqUckDY!mZ ztVteOtXY~0zX%pcc2`^PR8wS<2$Q6rFle3<&`Q2s^L7SQB zkGrcNm(EwStYzV^RFuuVC0uYhtk?1k2KlfFhjMKUfH848E0VsF3Ma^;&haHH|FykX zM++v&K&k2d$BJ_y$4|!Q1EqVrDn)%vOg*lw^hGljVU3Q@8?vF4_ykQZ2A_=?=9%X1 z*DF2uCL->Pvm?h_I>S0E4RMm9tE`4oeb3L|>iOOUY8E&S<}meT|A{3pEInumuBBWE zYhNcMB9YVvyy0q*c9PySJ8t*F&CLluz_pH2zbx<1&5Yi?v$7&O`%+Z$`4`$ubkNa# zWlLAX_o8Qyfwdy=T3erLT`6k*nf#mMV;gQ$wzA?WGV(^lCE;mp`pPo!$7K}i>^X}o z&SHe_5BWZqaQvWHUst-(g02mf>TL)`P(y8F2zjLp>>)!8>` z);r!Uy{UQG@b_a2O?QmxyamsjA|Q}5)dmGC{|Hv}>GbbjhypHE7M)&D7`SKXpQau$LTwj+)^mzWxbxHf{l%gP}94V zlt~4726NimG5V&ZPuMbpUg}lwv}G@{JS-LGzh!J~eevzlp=QOsdhsWpCXay-5~!jh z%-qy)D@(VNp$uuw-R>eQX~zCg8mftmIYWdizc^FdSW#ih*XX&T zVK!;*nx{NlR=U=+DJI53BEZK&nc7%!_G3!5X7TRqB%>;W8m9!eTm1a|jg=LY;}dW* z7Zxt)Wh~8Mk|={2)47h0-(x@H+6$_0dwTkNi1p1hH`BtrR#qdoJu;M)180@f2w375 za-QH2#rD7~6=62{7gv??;lx6KqzX zDXU>uAd1q3umM>zrpqV5B=`@Q#v?+dWkUVE;rHOHQFjB(AN*=dz1!nXyg@JAH9Fc{H*?A;eBuVk+3va; zG+^sH=#S477e8c^tLEc@LT9A3Kebh(ekK@h9=`bDioHu>Vp4#B9gadJ($I9^M*Ew4 z9lxSi)wQ2(ltlS~})Vp!W$O%di3^4-F5=FW@crNwS@39xVve z(^aADNp){??|Y+@Cf{h3iEIi+dlAk%;(Nx`32MIflx*L#D6fYR!YzQ@kTcbC&@ zW+<1JL;0yePiyBIXZX?+^ZC;f7wj{&LE9U(Qw;vkXk|5|Ve0&a(R4O<)1s%9Z*66S zex|=_A^ilw9brmCrf{h=B`7+@_mcld`1xg84JB%&4udB&><_;S3jrAUgEdo3S&-;U zYkY&JR9IMd%$m!j)Aju>LY1J^0Op0giODdF#49b$bi-@X|%WH(NsA)r3iWABl> zYo++hw7H%Xah7#^v$>9Jp1BtjsHNWH!~WIPm$o+Z_8N@=5@D<>Obk`_c1IICD{nbC z1Y&ZEGn!fkw(Z$c%g6LAJ*z`i9?JO5G8(#8o=SRUqcfYy(#u7&;1O!Nqk|nGD4QRX zJ3_+4!a{a-(pm7Ai%Y#|Y`5{jLR8MatDC)#F3>ggy?%H2EudNKX5^Nucw>N{K+JMW zQ5cJxn25PS)q#b)JVIZ8QNIt|;d?Bj4E2X*3YJQ%=dD;g6YuZGT-CfU^+sz=bI>ss zf5TRC*HbWSc~20dA5~@@zD18o5+@8!*B!@QxBBrtdVap@^a$HCQK1b(ROJ#Dzri99 zs}mLXAOH0YyGS=thVSX<_||DJuhb!KyOPNK)bAqfh6eILaM5N?_`_Q(bB(_u6F}|v zj%fJ_u0OKErQi6pOOc(5uvKv2-Wa$2J|tRfgW%Jl@E!P=1b{ZhQ{3d39*}S;aa6d> zy2S;9=FT8+N_dJkeB@VrQuXED7EE6ji6a=UF z_%Da!HrkYggr2S+S{4hlAoaI2ba!{R;g5iyCc_AUX?9Meof7d zP_(tR{O%o-tZaICcy(**Enuwn@Zn}zSuflife4SU^c>9I&d;~ctC74Zc8DJ~X1zvN zY~LA6rc96Nm^x*aOp-FGRkFeo`}*1fb-SNmm7d;%0%4VSuE+8%K)yQB*WUnm@v9N+ zai3EA1q3N9%>6UdJmX_ySs7ybo{bat(AnYe_ZJa|vpvwKSg75)rw@yCP?W4PX+sEUO4Bb;gYW>2Y@g`nte3es&Avz!yyU5#p6GH;0`cEYIi| z1S@T9#!Szp;&`M5|CF&JzKBT>Msyw#K9F7AL1zOalw-j7b;#ES!8A2hd9_Q)%Zo>$ z9z1;5FQk*Jht?)pUfKW^iTH5Gd=Hm7Tz_+8(?!rv%gPnMZJwbMU+9E=2(D;r(^r%U z2(0nJb~OwP94jbzaH!m1p`Pnj$~`3Hf)mOKTTVja@!XW!SN3CQjjjj0t0|Tyg`a%2 zE~t9n$tdsb;cV=i>eAxpeEGW9=YQ5!_SLD?I_tBLKcU!>?`2#@YOJQ*{8^p+wbbV( zL9~EAttBvdft3C-=+p#PP2VPz)fM?_+4D&U0|Y3dpq?bOvL6}o7N$jM^ax`6%j^vO zvn^t9#zKco^MJZM1fu=Za;@|o(Yl(;vrz?GFs#m-HSVrO{Ny?7e`$H`DxhI>$+9Df zvyfyuN&d<34T1AIq+Vx?rk_MBh{G>S(En@bnGcqb_%zKVufFW}#MYGHetTSrR~7i^ zZ1W??lQo%0d!GL4SNxoc^~Lp5Aw&7p=rJ9`TPhml5VA#8+7k}xz-LaPJkQqFi4SHW z((rF{$D6S%y5!7ZMcu-?HC?r!TXPhk#POlkoG%IM-{pH5G4x2pG3C!2!9=x5B(pC? z?vhLc!V-k*18V?V%{d)%Zt~$_f?f!qM?n;x5NlBsNomk^UX zXN+(e6Cwvj$>+f6rB?IoA4wM*W@9nuA+dn4^!s;D-ZnTwFh5yXe~Ux%MUKI9B4=Xe zUswJL)ob@?4H6TnzeoLS{odE7i9!Ie`akQbTsI>EiTmHrzi-ZTb}^XN*^(i9ozH=` z9sot((TB=W$qeF&!5NPsJ>oyVK@PN`VDMz(v8s~3-E)!d zysLTn%wYW2Xuz{BxJE~pF{)U26@4IL<8k(cTX$PI6#DsWJ&z& z(2Tyvy0lWkz*MvLqdKQ>yJS(kt+%%#-3v5&SubCBA)eUY7_7M_ker9Gv$i%3W;uVx zG+q+wiZ9z5(hpWtY?C~4SpI4u_*k)R($i_C%Hw{wnW2~qOHQ88BRCF6ye41*_N3)v z-7AJG(rEB~77ZFi*JPp5Q(xI#7ZhuHo~#cHs2aJYua6ecQUwV?p{+w&pV4AnLt57< z!*7Sn1M!l7y#q+PgGfjFHFZmWPSwP&7;1Y{ffU=}AgJ0Z@Gx6hUMBjl3>xF{W8}+e z(eOnw)|031?&t87j73C=B5E*C*Von6anjR^^Yhv|uJ2H;;!)LJRU9e?*_qg7T-i~b zUvpO%DQXFv*c4$F+4ujTaCF!pzoa8*(U!?vV|H$Y%**k$%BQq>D5aZgh{@eh=EJd( zFL{(|&dxSEBgHOL%nR$Rg>Fu-bVgvn2L%wC*T1_tbj1e^4N2hfkD~+Oa+wyEENv~9 zKt1Q#!FIR%9&B!t>((ugnfkq^_fA_o?*X+({pHryly`-$jw=sOo9fLTP*ea1SCp|= z(G)gm{R#6%1BEaRZ6rpI*2I3IznvG##dWg3*$LNBb2QssEy>O4pr&?$vX!ilYz9>w z3wd}1E635Hhw@Du4WK;yHI`Px`dl~0H^t~;0nwF>G-q_UWQ8;AR{g zuB)P~8{d@~RxlpVv95r%JnQo(p)ypEz5OeI3(&N^{YKk(t;9+-eEBt~pR{*MXc>4W zw(iJ<*~Ekc1!jG{rIhQ2$h~`+$G!`6fjOu5)fl`JU?Co`mGmj^66 z`3O5z9xldT>Z5djOisWB8!0abm;pbySKW!Gi1ke*a)&@*pPZaSf_$D?53A3+AkBHt z)xifkRIJzN2h;!p_MbrD&lT z7TIdf&3%aa>~qRcT>K~0lw)v^d}+PrV8TUesDFiuN)fw=>=W#PHhM*zg-;v~p7#UfnD_-)}^DrTI#L8GryHUI$-~GDzupVn*gR z4W2$dX*bX{^3JWSEdMn7NKNgzc^cy7OL+jxo;(qELWh$341D$#6%`E+AD0k+00_N z{P11x z&H!7Leca9hnz-!H@RroVZDFYzO>nm#27A*cd2cVaCWuj}tM75Luf>Qsx+;bEXbg}; zfeNuQ*B$|leb9gZ_I!I`q34$oIb>~5k1l|>z;i&*=j67G%yD)$kS0srgo2%G*4(v# zjZ%u8@3@iS;Sr{)JW=C}TP!S8jkM{Rmkg*$Ev~Bneuku@=o|R-^>$6@qPtK4=Z)Kd zmzI}xZ+z@WHVk!jE#zA|=I6aEEF#k|!~LJ2naUovYhwv=q4BMq5*#$4gS|5ax%I^$ z13I&$KB{`Tzi~007wNn|GqVo-NAg_Lv$A?Aq~P2W1&`?yc2-UcypMh6hnH|T;KU2~ z@#$N(re;LZFjzxVM%0o2U^bCTjDTg^$9o+wH9jUCx%*0MpA3HhXx~864WmKyWi@`} zX6A^|GmL^NKPqI~!kzuRFD5lLw@(Jl{=XouH}8i$C8EG?Y`fS4r6l&>z|~qUq2cX= zvC$piD}_yeJUriz%gN5a^ON_G+pFWTfM6ZbL8srdUoF^h6;E-n1ISRUViHlgY3jt% zS4Ue6*uoHqo?mOWZb6fn=$NSJSXVqw@ifT{p=Z66lPFQq8CUWM?2=+VMm8$93l~+k z@cIjL)Dz{Bq<98d{yfLdqtM>ay!=7e?)As2=ce7}HeL0^#yjT9fPbZ6dya(1tITi3 zRtd|3zQ?r1YyidpbBW&=Yl8&|d0~qy2|Ool1@Ou=Ol#*-TQaS#K{s0oKwI9RZWq~|7li9(vs)94wW)?^xzW`%} z1CU)p?lhbPUE9?jF*<{fJpwt)bJO@Ueod{y87BQ790>5)_Y8^k*>jLHxI_*R*_Oo@ zot!#Fh&0
Artifact Cinelerra3

Depends on common

Depends on gui

Depends on proc

Depends on backend

the main executable to be built

-

executable associated with : nodecreatertool, projector, interpolator, edl, fixture, glpipe, vrender, exitnode, pathmanager, track, paramprovider, mask, main, conmanager, clip, meta, fixedplacement, relativeplacement, mobject, source, frame, placement, session, builderfacade, toolfactory, controllerfacade, processor, pluginadapter, effect, tool, segmentationtool, aframe, assembler, trafo, explicitplacement, auto, glrender, link, parameter, renderengine, allocation, vframe, arender, renderstate, label, glbuf, procnode, stateproxy, hub, buildable, abstractmo

+

executable associated with : link, parameter, renderengine, allocation, vframe, arender, renderstate, label, glbuf, procnode, stateproxy, hub, buildable, abstractmo, nodecreatertool, projector, interpolator, edl, fixture, glpipe, vrender, exitnode, pathmanager, track, paramprovider, mask, main, conmanager, clip, meta, fixedplacement, relativeplacement, mobject, source, frame, placement, session, builderfacade, toolfactory, controllerfacade, processor, pluginadapter, effect, tool, segmentationtool, aframe, assembler, trafo, explicitplacement, auto, glrender

Artifact main

Artifact source

@@ -117,12 +117,25 @@ Documentation

1.3.2.1 Deployment View gen

defines source files to be generated by BOUML

+ +
Artifact error
+

Cinelerra Exception Interface

+

Artifact source associated with : Error, Logic, Config, State, Invalid, External

+ +
Artifact appconfig
+

for global initialization and configuration

+

Artifact source associated with : Appconfig

Artifact time

unified representation of a time point, including conversion functions

Artifact source associated with : Time

- + +

1.3.2.2 Package error

+

    +
  • C++ namespace : cinelerra::error
  • +
+

Namespace for Exception Kinds

1.3.3 Package backend

    @@ -142,6 +155,14 @@ Documentation

    1.3.4.1 Deployment View gen

    defines source files to be generated by BOUML

    + +
    Artifact assetmanager
    +

    Facade for the Asset subsystem

    +

    Artifact source associated with : AssetManager

    + +
    Artifact asset
    +

    Superinterface: bookeeping view of "things" present in the session

    +

    Artifact source associated with : Asset

    Artifact stateproxy

    Key Interface representing a render process and encapsulating state

    @@ -164,6 +185,60 @@ Documentation

    1.3.4.2.1 Deployment View gen

    defines source files to be generated by BOUML

    +
    + +
    Artifact dataset
    +

    meta asset describing a collection of control data

    +

    Artifact source associated with : Dataset

    + +
    Artifact category
    +

    tree like classification of Assets

    +

    Artifact source associated with : Category

    + +
    Artifact media
    +

    key abstraction: media-like assets

    +

    Artifact source associated with : Media

    + +
    Artifact proc
    +

    key abstraction: media-like assets

    +

    Artifact source associated with : Proc

    + +
    Artifact struct
    +

    key abstraction: structural asset

    +

    Artifact source associated with : Struct

    + +
    Artifact meta
    +

    key abstraction: metadata and organisational asset

    +

    Artifact source associated with : Meta

    + +
    Artifact clip
    +

    bookkeeping (asset) view of a media clip.

    +

    Artifact source associated with : Clip

    + +
    Artifact preview
    +

    alternative version of the media data, probably with lower resolution

    +

    Artifact source associated with : Preview

    + +
    Artifact unknown
    +

    placeholder for unknown or unavailable media source

    +

    Artifact source associated with : Unknown

    + +
    Artifact effect
    +

    Effect or media processing component

    +

    Artifact source associated with : Effect

    + +
    Artifact codec
    +

    description of some media data decoder or encoder facility

    +

    Artifact source associated with : Codec

    + +
    Artifact outport
    +

    structural asset corresponding to some port generating media output

    +

    Artifact source associated with : OutPort

    + +
    Artifact track
    +

    structural asset holding the configuration of a track in the EDL

    +

    Artifact source associated with : Track

    +

    1.3.4.3 Package mobject

    @@ -443,6 +518,33 @@ Documentation

    2.1 Package AssetManager

    +
    + +

    2.1.1 Class View Assets

    +
    + +

    +

    Asset Kinds



    + +

    +

    Media-Asset Relations



    +
    Class Asset
    +
    +
    Class Media
    +
    Class Proc
    +
    Class Struct
    +
    Class Meta
    +
    Class Category
    +
    Class Clip
    +
    Class Unknown
    +
    Class Preview
    +
    Class Effect
    +
    Class Codec
    +
    Class Track
    +
    Class OutPort
    +
    Class Dataset
    +
    +

    2.2 Package MObject

    @@ -894,7 +996,9 @@ reuse exiting Engine

Selection :

    Transformation

    3.1.1.1 Activity get frame

    -

    Pre Condition :

      Post Condition :

        +

        Pre Condition :

          Post Condition :

            +
            +

            3.2 Component View Cache

            @@ -906,13 +1010,29 @@ reuse exiting Engine

            Selection :

              Transformation

              GUI is here just a container to hold any entities considered to be User Interface related, which is not in focus for this Design draft

              5 Package CommonLib

              + +

              5.1 Class View error

              +
              + +

              +

              Hierarchy



              +

              Cinelerra Exception hierarchy

              Class Error
              +
              Class Logic
              +
              Class Config
              +
              Class State
              +
              Class Invalid
              +
              Class External
              +
              +
              -

              5.1 Class View Service Components

              +

              5.2 Class View Service Components

              Class Time
              +
              Class Factory
              +
              Class Appconfig
              -

              5.2 Class View Posix Threads Abstraction

              +

              5.3 Class View Posix Threads Abstraction

              C++ wrapers for pthreads

              Class Thread
              @@ -920,7 +1040,7 @@ reuse exiting Engine

              Selection :

                Transformation
                Class Mutex

                -

                5.3 Class View SmartPointers

                +

                5.4 Class View SmartPointers

                diff --git a/doc/devel/uml/index_60.html b/doc/devel/uml/index_60.html index 0a78be5d0..cc286ecf2 100644 --- a/doc/devel/uml/index_60.html +++ b/doc/devel/uml/index_60.html @@ -17,8 +17,8 @@ - + @@ -28,10 +28,10 @@ - - + + diff --git a/doc/devel/uml/index_65.html b/doc/devel/uml/index_65.html index fb3771d6c..aba7859ea 100644 --- a/doc/devel/uml/index_65.html +++ b/doc/devel/uml/index_65.html @@ -26,23 +26,32 @@ + + + + + + + + + - + - - + + diff --git a/doc/devel/uml/index_66.html b/doc/devel/uml/index_66.html index ee9c7dde3..13b6639cd 100644 --- a/doc/devel/uml/index_66.html +++ b/doc/devel/uml/index_66.html @@ -32,8 +32,8 @@ - + diff --git a/doc/devel/uml/index_67.html b/doc/devel/uml/index_67.html index d3fce2569..2db26987f 100644 --- a/doc/devel/uml/index_67.html +++ b/doc/devel/uml/index_67.html @@ -19,31 +19,39 @@ + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + @@ -52,6 +60,7 @@ + diff --git a/doc/devel/uml/index_68.html b/doc/devel/uml/index_68.html index 015d073f6..d35b2ba3d 100644 --- a/doc/devel/uml/index_68.html +++ b/doc/devel/uml/index_68.html @@ -17,14 +17,16 @@
                NameKindDescription
                <flow>transition
                <flow>transition
                <flow>transition
                <flow>transition
                <flow>transition
                <flow>transition
                <flow>transition
                <flow>transition
                <flow>transition
                <flow>transition
                <flow>transition
                <flow>transition
                <flow>transition
                <flow>transition
                <flow>transition
                <flow>transition
                <flow>transition
                <flow>transition
                allocationartifact
                Allocationclassa directive to place a MObject in a specific way
                anchorrelation
                Appconfigoperationperform initialization on first access.
                A call is placed in static initialization code
                included in cinelerra.h; thus it will happen
                ubiquitous very early.
                appconfigartifactfor global initialization and configuration
                AppconfigclassSingleton to hold inevitable global flags and constants and for performing erarly (static) global initialization tasks.
                applyoperation
                Architecturecomponent viewThe various Components comprising the Cinelerra3 Video editing Application
                ARenderclassRepresentation of a Audio render process
                arenderartifactRepresentation of a Audio Render process
                AssemblerclassThis is the actual building facility: provided the correct tools and associations, it serves to build and connect the individual ProcNode objects
                assemblerartifactbuilding facility (implementation of the build process)
                AssetclassSuperinterface describing especially the bookeeping properties of Assets
                assetartifactSuperinterface: bookeeping view of "things" present in the session
                assetpackagesourcecode package

                Asset Management
                Asset Kindsclass diagram
                AssetManagementcomponent
                AssetManagerclassFacade for the Asset subsystem
                assetmanagerartifactFacade for the Asset subsystem
                AssetManagerpackage
                Assetsclass view
                ATTACHattributeattach subject to anchor (e.g. an effect to a clip)
                au1class instance
                aud_Aclass instance
                aud_aclass instance
                aud_Aclass instance
                audioclass instance
                audio1class instance
                audio1class instance
                audio1class instance
                audio1class instance
                audio1class instance
                autoartifactMedia Object holding automation data
                AutoclassAutomation data for some parameter (i.e. a time varying function)
                Automation Entitiesclass diagram
                buildableartifactmarker interface denoting any MObject able to be treated by Tools
                buildEngineoperationMain Operation of the Builder: create a render engine for a given part of the timeline
                Buildercomponent
                Builderpackage
                builderpackagesourcecode package

                The Builder creating the Render Engine,
                located within the MObject Subsystem
                Builderpackage
                Builder Entitiesclass diagram
                Builder Workingsclass view
                BuilderFacadeclassProvides unified access to the builder functionality. While individual components of the builder subsystem may be called if necessary or suitable, it is usually better to do all extern invocations via the high level methods of this Facade
                NameKindDescription
                Cachecomponent
                Cachecomponent view
                categoryrelationprimary tree like classification of the asset
                Categoryclasstree like classification of Assets
                categoryartifacttree like classification of Assets
                causeattributea copy of the first exception encountered in this exception chain
                checked_inrelationchecked_in objects are subject of cache aging and must be not in use
                checked_outrelationthis list keeps all mappings which are in use, and thus prevents them from Cache aging
                Cinelerra3artifactthe main executable to be built
                cinelerra3package
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                class instanceclass instance
                Clipclassbookkeeping (asset) view of a media clip.
                clipartifacta Media Clip
                clipartifactbookkeeping (asset) view of a media clip.
                Clipclass
                clipsrelation
                Codecclassdescription of some media data decoder or encoder facility
                codecartifactdescription of some media data decoder or encoder facility
                CodecAdapterclass
                codecadapterartifactProcessing Node for (de)coding media data
                codegenpackageThis package is used to organize code generation by BOUML. It is considered useless after having generated the initial code skeleton.
                CommonLibpackage
                complete Render Engineactivity object
                ConditionclassI provided a reworked Condition class in my cinelerra2 repository
                Configclass
                configureoperation
                configure Renderactivity
                configure Toolsopaque activity action
                + + - + diff --git a/doc/devel/uml/index_69.html b/doc/devel/uml/index_69.html index 9d52d03bb..caf706b98 100644 --- a/doc/devel/uml/index_69.html +++ b/doc/devel/uml/index_69.html @@ -18,14 +18,17 @@
                NameKindDescription
                Datasetclassmeta asset describing a collection of control data
                datasetartifactmeta asset describing a collection of control data
                datasrcrelationThe predecessor in a processing pipeline, i.e. a source to get data to be processed
                define segmentopaque activity action
                descriptorrelationtype of this frame
                descriptorrelation
                designpackage
                designpackageAll things concering the big picture.
                Not a real code package, rather a container for design drafts, specifications, decisions.
                determine Render Paramsopaque activity action
                determine Render Paramsexpansion region
                determine Render Paramsopaque activity action
                devnullclass instance
                DirectPlacementclass
                Dispatchercomponent
                - + + + + @@ -33,12 +36,17 @@ + + + + +
                NameKindDescription
                edlartifactthe (high level) Edit Decision List within the current Session
                EDLclass
                EDLcomponent
                EDLclass
                EDL Example1object diagramA simple example showing how the actual objects are placed in the Fixture (=definitive playlist). It shows a Video and Audio clip placed on two tracks
                EDL Example2object diagramMore complex example showing the Object graph in the EDL and how it is linked into the Fixture to yield the actual locations. In this example, an HUE Effect is applied on a part of the Clip
                edlsrelation
                EffectclassEffect or media processing component
                effectartifactEffect or media processing component
                effectartifactEDL representation of a pluggable and automatable effect.
                Effectclass
                elementsrelationrelevant MObjects comprising this segment. TODO: actually necessary??
                enableoperationchange the enabled status of this asset. Note the corresponding #isActive predicate may depend on the enablement status of parent assets as well
                endattributeend of the timerange (excl)
                Enginecomponent
                enginepackagesourcecode package

                The Core Render Engine
                Engine Example2object diagramExample2 (from EDL) continued: notably in this RenderEngine the Effect has been partitioned into 2 segments with constant configuration.
                Engine Partsdeployment view
                Engine Workingsclass view
                errorpackageNamespace for Exception Kinds
                errorclass view
                Errorclass
                errorartifactCinelerra Exception Interface
                establish partitioningexpansion region
                EXE Deploymentdeployment viewdefines and lists how the Cinelerra executable has to be created
                ExitNodeclassThe output of the render pipeline. Pulling from such exit nodes actually ivokes the render process
                exitnodeartifactspecial Processing Node providing "pullable" output
                explicitplacementartifactspecial Placement yielding an absolute location (Time,Track)-location for a MObject
                ExplicitPlacementclass
                Externalclass
                diff --git a/doc/devel/uml/index_70.html b/doc/devel/uml/index_70.html index a2c4b9eea..e83866113 100644 --- a/doc/devel/uml/index_70.html +++ b/doc/devel/uml/index_70.html @@ -17,6 +17,7 @@ + @@ -31,15 +32,16 @@ - + + diff --git a/doc/devel/uml/index_71.html b/doc/devel/uml/index_71.html index 62a9306fc..be8d16dcd 100644 --- a/doc/devel/uml/index_71.html +++ b/doc/devel/uml/index_71.html @@ -28,11 +28,15 @@ + + + + @@ -44,6 +48,7 @@ +
                NameKindDescription
                Factoryclassa template for generating functor-like Factory objects, used to encapsulate object creation and providing access via smart-pointers only.
                Fileclass
                filerelation
                File Mappingclass diagramShows whats used to access Frames
                fixedplacementartifact
                Fixtureactivity object
                fixtureartifactthe (low level) representation of the EDL with concrete placement data
                fixturerelation
                Fixtureclass
                Fixturecomponent
                fixturerelation
                fork activity nodefork activity node
                FrameclassFrames are just a low level lump of continous memory, most parts are opaque. Frames are memory sensitive, they will be small constant sized structures which can be efficently managed in a pool.
                Framenode
                FrameclassTODO: how to relate to Cehteh's Frame entity in the Backend?
                The latter is the fundamental Frame entity, wheras this Object rather represents a buffer set containing frame date
                framerelationmaybe weak reference
                frameartifactKey Abstraction: render process and buffer holding frame data.
                framerelation
                Frame (Stream) Providercomponent
                FrameDescriptorclassA FrameDescriptor implements the higher level interfaces for frames. Further refinements are made by subclassing and policy classes
                FrameReferenceclass
                gendeployment viewdefines source files to be generated by BOUML
                gendeployment viewdefines source files to be generated by BOUML
                gendeployment viewdefines source files to be generated by BOUML
                getoperationaccess the configuation value for a given key.
                @return empty string for unknown keys, else the corresponding configuration value
                get frameactivity
                get_reproperation
                getAssetoperationfind and return corresponging object
                getAutomationoperation
                getConnectionoperationTODO
                getDependantoperationAll the other assets requiring this asset to be functional. For example, all the clips depending on a given media file. May be empty. The dependency relation is transitive.
                getFrameoperationmode = READ, WRITE, ...
                getParentsoperationList of entities this asset depends on or requires to be functional. May be empty. The head of this list can be considered the primary prerequisite
                getPlaylistForRenderoperation
                getStateProxyoperation
                getValueoperation
                glpipeartifactspecialized connection element for handling OpenGL implementation details
                GLRenderclassRepresentation of a OpenGL accelerated Video render process
                glrenderartifactRepresentation of a OpenGL accellerated Video render process
                groupsattributeadditional classification, selections or departments this asset belongs to. Groups are optional, non-exclusive and may be overlapping.
                GUIpackageGUI is here just a container to hold any entities considered to be User Interface related, which is not in focus for this Design draft
                guipackagesourcecode package

                User Interface classes go here
                diff --git a/doc/devel/uml/index_72.html b/doc/devel/uml/index_72.html index 3b76fe797..7273d52e0 100644 --- a/doc/devel/uml/index_72.html +++ b/doc/devel/uml/index_72.html @@ -20,6 +20,7 @@ handlerelationweak pointer handlesrelation handles_availableattributeinitialized to the maximum number of filehandles the backend may use for mapped files. When no handles are available, the handle which is last in the handles list is closed and (re-)used.
                Else this number is decremented for each new filehandle used and incremented for any one explicitly freed. +Hierarchyclass diagramCinelerra Exception hierarchy Hubclass hubartifactspecial ProcNode used to build data distributing connections HUEclass instance diff --git a/doc/devel/uml/index_73.html b/doc/devel/uml/index_73.html index a97f05ce5..f6ab37369 100644 --- a/doc/devel/uml/index_73.html +++ b/doc/devel/uml/index_73.html @@ -17,15 +17,19 @@ + - + + + +
                NameKindDescription
                idattributeAsset primary key.
                In Memory Databaseclass diagram
                inFixtureactivity action pin
                inputclass instance
                inputclass instance
                inputclass instance
                inputclass instance
                instanceoperation
                interfacescomponent view
                interpolatorartifactdenotes a facility to get (continuously interpolated) parameter values
                InterpolatorclassProvides the implementation for getting the acutal value of a time varying or automated effect/plugin parameter
                Invalidclass
                iporelation
                isActiveoperationweather this asset is swithced on and consequently included in the fixture and participates in rendering
                diff --git a/doc/devel/uml/index_75.html b/doc/devel/uml/index_75.html new file mode 100644 index 000000000..0785cbeb9 --- /dev/null +++ b/doc/devel/uml/index_75.html @@ -0,0 +1,23 @@ + + + + + + +K + + + + + +
                K
                +

                + + + + + + +
                NameKindDescription
                knownoperation@return true if the given id is registered in the internal asset DB
                + + diff --git a/doc/devel/uml/index_76.html b/doc/devel/uml/index_76.html index 680ae56c6..ddbe5c66d 100644 --- a/doc/devel/uml/index_76.html +++ b/doc/devel/uml/index_76.html @@ -25,6 +25,8 @@ linkartifactforwarding, adapting or connecting ProcNode Lockclass Lockclass +Logicclass +longDescattributeuser visible qualification of the thing, unit or concept represented by this asset. perferably "in one line". To be localized. diff --git a/doc/devel/uml/index_77.html b/doc/devel/uml/index_77.html index 6c4e61932..1219f0f58 100644 --- a/doc/devel/uml/index_77.html +++ b/doc/devel/uml/index_77.html @@ -22,8 +22,13 @@ mappingsrelationweak pointers Maskclass maskartifactVideo ProcNode for masking regions of the image (automatable) +Mediaclasskey abstraction: media-like assets +mediaartifactkey abstraction: media-like assets +Media-Asset Relationsclass diagram merge activity nodemerge activity node +Metaclasskey abstraction: metadata and organisational asset metaartifactabstract base class of all MObjects representing meta data or processing instructions +metaartifactkey abstraction: metadata and organisational asset Metaclass mobjectartifactKey Abstraction: A Media Object in the Session mobjectpackagesourcecode package

                MObject Subsystem
                including the Session (EDL), Builder and Processing Controller diff --git a/doc/devel/uml/index_78.html b/doc/devel/uml/index_78.html index 4cc3eff75..876afc08d 100644 --- a/doc/devel/uml/index_78.html +++ b/doc/devel/uml/index_78.html @@ -17,6 +17,7 @@ +
                NameKindDescription
                nameattributeelement ID, comprehensible but sanitized. The tuple (category, name, org) is unique.
                nodecreatertoolartifactcentral Tool implementing the Renderengine building
                NodeCreatorToolclassThis Tool implementation plays the central role in the buld process: given a MObject from Session, it is able to attach ProcNodes to the render engine under construction such as to reflect the properties of the MObject in the actual render.
                diff --git a/doc/devel/uml/index_79.html b/doc/devel/uml/index_79.html index edbb2994f..2a52fbc5c 100644 --- a/doc/devel/uml/index_79.html +++ b/doc/devel/uml/index_79.html @@ -18,9 +18,12 @@ - + + + + diff --git a/doc/devel/uml/index_80.html b/doc/devel/uml/index_80.html index 639db95d5..2a0a4cf37 100644 --- a/doc/devel/uml/index_80.html +++ b/doc/devel/uml/index_80.html @@ -36,8 +36,12 @@ + + + + diff --git a/doc/devel/uml/index_82.html b/doc/devel/uml/index_82.html index 59b762e4c..84c63934b 100644 --- a/doc/devel/uml/index_82.html +++ b/doc/devel/uml/index_82.html @@ -18,10 +18,12 @@
                NameKindDescription
                offsetattributeOffset the actual position by this (time) value relative to the anchor point. TODO: Representation?
                ouputclass instance
                orgattributeorigin or authorship id. Can be a project abbreviation, a package id or just the authors nickname or UID. This allows for the compnent name to be more generic (e.g. "blur"). Default for all assets provided by the core cinelerra-3 codebase is "cin3".
                ouputclass instance
                ouputclass instance
                ouputclass instance
                OutPortclassstructural asset corresponding to some port generating media output
                outportartifactstructural asset corresponding to some port generating media output
                outputrelation
                Overviewcomponent diagramThis drawing shows the top level compoents and relations
                Overview Render Enginedeployment diagram
                pnodenode
                Posix Threads Abstractionclass viewC++ wrapers for pthreads
                Prefetchclass
                Previewclassalternative version of the media data, probably with lower resolution
                previewartifactalternative version of the media data, probably with lower resolution
                Procclasskey abstraction: data processing asset
                procpackagesourcecode package

                All classes belonging to the (middle) processing layer
                procnode
                procartifactkey abstraction: media-like assets
                procattributeholds the Processor (Render Engine Element) to be built by the current build step
                proc-componentscomponent diagram
                ProcessingLayerpackage
                + - + + @@ -34,6 +36,7 @@ +
                NameKindDescription
                refPointclass instance
                registeroperationregisters an asset object in the internal DB, providing its unique key
                relativeplacementartifactPlacement implemnetaion providing various ways of attaching a MObject to another one
                RelativePlacementclass
                RelTypeclassthe possible kinds of RelativePlacements
                relTypeattributethe kind of relation denoted by this Placement
                RelTypeclassthe possible kinds of RelativePlacements
                removeoperationremove the given asset <i>together with all its dependants</i> from the internal DB
                Render Entitiesclass diagram
                Render Requestactivity parameter
                RenderEngineclass
                renderstateartifactrenderengine state manager
                reprattributehuman readable representation of the condition characterizing this allocaton, e.g. "t >= 10"
                resolveoperationcreate an actual (explicit) placement while trying to satisfy the network of adjacent objects and placements.
                rootCauseoperationIf this exception was caused by a chain of further exceptions,
                return the first one registered in this throw sequence.
                This works only, if every exceptions thrown as a consequence
                of another exception is propperly constructed by passing
                the original exception to the constructor
                diff --git a/doc/devel/uml/index_83.html b/doc/devel/uml/index_83.html index b930aa453..dc307832f 100644 --- a/doc/devel/uml/index_83.html +++ b/doc/devel/uml/index_83.html @@ -30,14 +30,17 @@ Service Componentsclass view Sessioncomponent sessionartifactholds the complete session to be edited by the user -sessionpackagesourcecode package

                Everything concerning the EDL and Session, within the MObject Subsystem Sessionclass view +sessionpackagesourcecode package

                Everything concerning the EDL and Session, within the MObject Subsystem Sessionclass Session structureclass diagram setup Build Paramsopaque activity action setup StateProxyopaque activity action +shortDescattributeuser visible Name-ID. To be localized. SmartPointerclass SmartPointersclass view +sourcerelationmedia source of this clip +sourcerelationthe media source this clip referes to SourceclassSource Node: represents a media source to pull data from. sourceartifactRepresentation of a Media source Source Overviewdeployment diagram @@ -45,8 +48,12 @@ startattributebegin of the timerange covered by this processor startattribute Statenode +Stateclass StateProxyclass stateproxyartifactKey Interface representing a render process and encapsulating state +std::exceptionclass +Structclasskey abstraction: structural asset +structartifactkey abstraction: structural asset subjectrelation diff --git a/doc/devel/uml/index_84.html b/doc/devel/uml/index_84.html index 26fad698a..044cdcb55 100644 --- a/doc/devel/uml/index_84.html +++ b/doc/devel/uml/index_84.html @@ -18,6 +18,7 @@ + @@ -29,19 +30,21 @@ + + - - - - + + + +
                NameKindDescription
                the render configuration flowactivity diagram
                theApp_attributeholds the single instance and triggers initialization
                ThreadclassWe can basically reuse the Thread class design from cinelerra2, Thread becomes a baseclass for all Threads
                timeattribute
                timeartifactunified representation of a time point, including conversion functions
                toolartifactInterface, any tool for processing MObjects
                ToolFactoryclass
                toolfactoryartifactsupply of Tool implementations for the Builder
                Trackclassstructural asset holding the configuration of a track in the EDL
                trackattribute
                trackartifactstructural asset holding the configuration of a track in the EDL
                trackartifactdescriptor for one track in the Session
                Trackclass
                tracksrelation
                tracksrelation
                Trafoclass
                trafoartifacttransforming processing Node
                treatoperation
                treatoperation
                treatoperation
                treatoperation
                treatoperation
                treatoperation
                treatoperation
                treatoperation
                treatoperation
                treatoperation
                treatoperation
                treatoperationThis operation is to be overloaded for the specific MObject subclasses to be treated.
                diff --git a/doc/devel/uml/index_85.html b/doc/devel/uml/index_85.html index 38f4965d4..b5f26dfb9 100644 --- a/doc/devel/uml/index_85.html +++ b/doc/devel/uml/index_85.html @@ -17,6 +17,8 @@ + +
                NameKindDescription
                Unknownclassplaceholder for unknown or unavailable media source
                unknownartifactplaceholder for unknown or unavailable media source
                useFileoperationAnnounces that the application intends to use this file with mode (READ|WRITE|READWRITE)
                useTemporaryStorageoperationProvides a pool for interminate frames
                diff --git a/doc/devel/uml/index_86.html b/doc/devel/uml/index_86.html index 092c278b0..1ca19fe37 100644 --- a/doc/devel/uml/index_86.html +++ b/doc/devel/uml/index_86.html @@ -17,25 +17,26 @@ + - - - - + - - + + + - + + - + +
                NameKindDescription
                versionattributeversion number of the thing or concept represented by this asset. Of each unique tuple (name, category, org) there will be only one version in the whole system. Version 0 is reserved for internal purposes. Versions are considered to be ordered, and any higher version is supposed to be fully backwards compatible to all previous versions.
                VFrameclass
                vframeartifacta buffer and render process holding a Video frame
                vid1class instance
                vid1class instance
                vid_aclass instance
                vid_Aclass instance
                vid_Aclass instance
                vid1class instance
                vid_Aclass instance
                vid_aclass instance
                videoclass instance
                videoclass instance
                vid_Aclass instance
                vid_Aclass instance
                vid_aclass instance
                videoclass instance
                videoclass instance
                video1class instance
                videoclass instance
                videoclass instance
                video1class instance
                video1class instance
                video1class instance
                video1class instance
                video1class instance
                video1class instance
                video1class instance
                VRenderclassRepresentation of a Video render process. (Encapsulates the video buffers for the actual calculations)
                vrenderartifactRepresentation of a Video render process
                diff --git a/doc/devel/uml/index_87.html b/doc/devel/uml/index_87.html index 00c555b01..4af6e38d9 100644 --- a/doc/devel/uml/index_87.html +++ b/doc/devel/uml/index_87.html @@ -17,7 +17,12 @@ + + + + +
                NameKindDescription
                whatoperation
                whatoperationthe base class of all exceptions thrown by the standard library
                Wishclass
                write_bufferrelation
                WriteBufferclass
                WriteBufferPoolclass
                diff --git a/doc/devel/uml/navig.html b/doc/devel/uml/navig.html index 90304f3d6..2bdbe6770 100644 --- a/doc/devel/uml/navig.html +++ b/doc/devel/uml/navig.html @@ -9,9 +9,9 @@


                -

                -Top- -Classes- -Public Operations- -Packages- -Activities- -Class Diagrams- -Object Diagrams- -Activity Diagrams- -Collaboration Diagrams- -Component Diagrams- -Deployment Diagrams-

                +

                -Top- -Classes- -Public Operations- -Public properties- -Packages- -Activities- -Class Diagrams- -Object Diagrams- -Activity Diagrams- -Collaboration Diagrams- -Component Diagrams- -Deployment Diagrams-

                -

                < A B C D E F G H I L M N O P R S T U V W

                +

                < A B C D E F G H I K L M N O P R S T U V W

                diff --git a/doc/devel/uml/packages.html b/doc/devel/uml/packages.html index 438978748..80440f99d 100644 --- a/doc/devel/uml/packages.html +++ b/doc/devel/uml/packages.html @@ -20,17 +20,18 @@ AssetManager backendsrcsourcecode package

                Data backend classes here... BackendLayer -buildersrcsourcecode package

                The Builder creating the Render Engine,
                located within the MObject Subsystem Builder +buildersrcsourcecode package

                The Builder creating the Render Engine,
                located within the MObject Subsystem cinelerra3 codegenThis package is used to organize code generation by BOUML. It is considered useless after having generated the initial code skeleton. commonsrcsourcecode package

                Common library and helper classes CommonLib -Controller controllersrcsourcecode package

                The Processing and Render Controller,
                located within the MObject Subsystem +Controller design designAll things concering the big picture.
                Not a real code package, rather a container for design drafts, specifications, decisions. enginesrcsourcecode package

                The Core Render Engine +errorNamespace for Exception Kinds GUIGUI is here just a container to hold any entities considered to be User Interface related, which is not in focus for this Design draft guisrcsourcecode package

                User Interface classes go here mobjectsrcsourcecode package

                MObject Subsystem
                including the Session (EDL), Builder and Processing Controller diff --git a/doc/devel/uml/public_operations.html b/doc/devel/uml/public_operations.html index fea74ca91..45b6f8e10 100644 --- a/doc/devel/uml/public_operations.html +++ b/doc/devel/uml/public_operations.html @@ -22,20 +22,30 @@ buildEngineBuilderFacadeMain Operation of the Builder: create a render engine for a given part of the timeline buildProcessorPathManager configureToolFactory +enableAssetchange the enabled status of this asset. Note the corresponding #isActive predicate may depend on the enablement status of parent assets as well +getAppconfigaccess the configuation value for a given key.
                @return empty string for unknown keys, else the corresponding configuration value get_reprAllocation +getAssetAssetManagerfind and return corresponging object getAutomationFixture getConnectionConManagerTODO +getDependantAssetAll the other assets requiring this asset to be functional. For example, all the clips depending on a given media file. May be empty. The dependency relation is transitive. getFrameFilemode = READ, WRITE, ... +getParentsAssetList of entities this asset depends on or requires to be functional. May be empty. The head of this list can be considered the primary prerequisite getPlaylistForRenderFixture getStateProxyRenderState getValueAuto getValueParameter getValueParamProvider +isActiveAssetweather this asset is swithced on and consequently included in the fixture and participates in rendering +knownAssetManager@return true if the given id is registered in the internal asset DB playRenderEngineTODO: will probably be handled differently (see Cehteh) +registerAssetManagerregisters an asset object in the internal DB, providing its unique key +removeAssetManagerremove the given asset <i>together with all its dependants</i> from the internal DB resolvePlacementcreate an actual (explicit) placement while trying to satisfy the network of adjacent objects and placements. -treatNodeCreatorTool -treatNodeCreatorTool +rootCauseErrorIf this exception was caused by a chain of further exceptions,
                return the first one registered in this throw sequence.
                This works only, if every exceptions thrown as a consequence
                of another exception is propperly constructed by passing
                the original exception to the constructor treatNodeCreatorTool +treatNodeCreatorTool +treatNodeCreatorTool treatNodeCreatorTool treatSegmentationTool treatSegmentationTool @@ -43,6 +53,8 @@ treatToolThis operation is to be overloaded for the specific MObject subclasses to be treated. useFileFileProviderAnnounces that the application intends to use this file with mode (READ|WRITE|READWRITE) useTemporaryStorageFileProviderProvides a pool for interminate frames +whatError +whatstd::exceptionthe base class of all exceptions thrown by the standard library diff --git a/doc/devel/uml/public_properties.html b/doc/devel/uml/public_properties.html new file mode 100644 index 000000000..5c6c3f844 --- /dev/null +++ b/doc/devel/uml/public_properties.html @@ -0,0 +1,27 @@ + + + + + + +Public Properties Index + + + + + +
                Public Properties Index
                +

                + + + + + + + + + + +
                PropertyClassDescription
                categoryAssetprimary tree like classification of the asset
                idAssetAsset primary key.
                nameAssetelement ID, comprehensible but sanitized. The tuple (category, name, org) is unique.
                orgAssetorigin or authorship id. Can be a project abbreviation, a package id or just the authors nickname or UID. This allows for the compnent name to be more generic (e.g. "blur"). Default for all assets provided by the core cinelerra-3 codebase is "cin3".
                versionAssetversion number of the thing or concept represented by this asset. Of each unique tuple (name, category, org) there will be only one version in the whole system. Version 0 is reserved for internal purposes. Versions are considered to be ordered, and any higher version is supposed to be fully backwards compatible to all previous versions.
                + + diff --git a/uml/cinelerra3/128133 b/uml/cinelerra3/128133 index 3c6c34c2d..b457bbab8 100644 --- a/uml/cinelerra3/128133 +++ b/uml/cinelerra3/128133 @@ -1,6 +1,6 @@ -format 38 -"AssetManager" // AssetManager - revision 1 +format 40 +"AssetManager" // ProcessingLayer::AssetManager + revision 4 modified_by 5 "hiv" // class settings //class diagram settings @@ -8,7 +8,7 @@ format 38 //use case diagram settings package_name_in_tab default show_context default auto_label_position default draw_all_relations default shadow default //sequence diagram settings - show_full_operations_definition default write_horizontally default drawing_language default draw_all_relations default shadow default + show_full_operations_definition default write_horizontally default class_drawing_mode default drawing_language default draw_all_relations default shadow default //collaboration diagram settings show_full_operations_definition default show_hierarchical_rank default write_horizontally default drawing_language default package_name_in_tab default show_context default draw_all_relations default shadow default //object diagram settings @@ -26,4 +26,564 @@ format 38 package_name_in_tab default show_context default show_opaque_action_definition default auto_label_position default write_flow_label_horizontally default draw_all_relations default shadow default show_infonote default drawing_language default + classview 128901 "Assets" + //class diagram settings + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + //collaboration diagram settings + show_full_operations_definition default show_hierarchical_rank default write_horizontally default drawing_language default package_name_in_tab default show_context default draw_all_relations default shadow default + //object diagram settings + write_horizontally default package_name_in_tab default show_context default auto_label_position default draw_all_relations default shadow default + //sequence diagram settings + show_full_operations_definition default write_horizontally default class_drawing_mode default drawing_language default draw_all_relations default shadow default + //state diagram settings + package_name_in_tab default show_context default auto_label_position default write_trans_label_horizontally default show_trans_definition default draw_all_relations default shadow default + show_activities default region_horizontally default drawing_language default + //class settings + //activity diagram settings + package_name_in_tab default show_context default show_opaque_action_definition default auto_label_position default write_flow_label_horizontally default draw_all_relations default shadow default + show_infonote default drawing_language default + + classdiagram 130309 "Asset Kinds" + draw_all_relations no hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + size A4 + end + + classdiagram 130437 "Media-Asset Relations" + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + size A4 + end + + class 136453 "Asset" + abstract visibility public stereotype "interface" + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "${comment}${@}${visibility}interface ${name}${extends} { +${members}} +" + idl_decl "${comment}${abstract}${local}interface ${name}${inherit} { +${members}}; +" + explicit_switch_type "" + + comment "Superinterface describing especially the bookeeping properties of Assets" + attribute 130437 "id" + const_attribute public explicit_type "long" + init_value "AssetManager::register (name, category, org, version)" + cpp_decl " ${comment}${static}${mutable}${volatile}${const}${type} ${name}${value}; +" + java_decl "" + idl_decl "" + comment "Asset primary key." + end + + attribute 130565 "name" + const_attribute public explicit_type "string" + cpp_decl " ${comment}${static}${mutable}${volatile}${const}${type} ${name}${value}; +" + java_decl "" + idl_decl "" + comment "element ID, comprehensible but sanitized. The tuple (category, name, org) is unique." + end + + classrelation 140421 // category () + relation 138629 ---> + a role_name "category" multiplicity "1" const_relation public + comment "primary tree like classification of the asset" + cpp default " ${comment}${static}${mutable}${volatile}${const}${type}* ${name}${value}; +" + classrelation_ref 140421 // category () + b multiplicity "*" parent class_ref 137221 // Category + association_type class_ref 137221 // Category + end + + attribute 130821 "org" + const_attribute public explicit_type "string" + init_value "cin3" + cpp_decl " ${comment}${static}${mutable}${volatile}${const}${type} ${name}${value}; +" + java_decl "" + idl_decl "" + comment "origin or authorship id. Can be a project abbreviation, a package id or just the authors nickname or UID. This allows for the compnent name to be more generic (e.g. \"blur\"). Default for all assets provided by the core cinelerra-3 codebase is \"cin3\"." + end + + attribute 130949 "version" + const_attribute public explicit_type "uint" + init_value "1" + cpp_decl " ${comment}${static}${mutable}${volatile}${const}${type} ${name}${value}; +" + java_decl "" + idl_decl "" + comment "version number of the thing or concept represented by this asset. Of each unique tuple (name, category, org) there will be only one version in the whole system. Version 0 is reserved for internal purposes. Versions are considered to be ordered, and any higher version is supposed to be fully backwards compatible to all previous versions." + end + + attribute 131077 "groups" + protected explicit_type "set" + cpp_decl " ${comment}${static}${mutable}${volatile}${const}${type} ${name}${value}; +" + java_decl "" + idl_decl "" + comment "additional classification, selections or departments this asset belongs to. Groups are optional, non-exclusive and may be overlapping." + end + + attribute 131205 "shortDesc" + const_attribute protected explicit_type "string" + cpp_decl " ${comment}${static}${mutable}${volatile}${const}${type} ${name}${value}; +" + java_decl "" + idl_decl "" + comment "user visible Name-ID. To be localized." + end + + attribute 131333 "longDesc" + const_attribute protected explicit_type "string" + cpp_decl " ${comment}${static}${mutable}${volatile}${const}${type} ${name}${value}; +" + java_decl "" + idl_decl "" + comment "user visible qualification of the thing, unit or concept represented by this asset. perferably \"in one line\". To be localized." + end + + operation 132101 "getParents" + public explicit_return_type "vector" + nparams 0 + cpp_decl " ${comment}${friend}${static}${inline}${virtual}${type} ${name} ${(}${)}${const}${volatile} ${throw}${abstract};" + cpp_def "${comment}${inline}${type} +${class}::${name} ${(}${)}${const}${volatile} ${throw}${staticnl} +{ + ${body} +} + +" + + + comment "List of entities this asset depends on or requires to be functional. May be empty. The head of this list can be considered the primary prerequisite" + end + + operation 132229 "getDependant" + public explicit_return_type "vector" + nparams 0 + cpp_decl " ${comment}${friend}${static}${inline}${virtual}${type} ${name} ${(}${)}${const}${volatile} ${throw}${abstract};" + cpp_def "${comment}${inline}${type} +${class}::${name} ${(}${)}${const}${volatile} ${throw}${staticnl} +{ + ${body} +} + +" + + + comment "All the other assets requiring this asset to be functional. For example, all the clips depending on a given media file. May be empty. The dependency relation is transitive." + end + + operation 132869 "isActive" + public explicit_return_type "bool" + nparams 0 + cpp_decl " ${comment}${friend}${static}${inline}${virtual}${type} ${name} ${(}${)}${const}${volatile} ${throw}${abstract};" + cpp_def "${comment}${inline}${type} +${class}::${name} ${(}${)}${const}${volatile} ${throw}${staticnl} +{ + ${body} +} + +" + + + comment "weather this asset is swithced on and consequently included in the fixture and participates in rendering" + end + + operation 132997 "enable" + public explicit_return_type "void" + nparams 1 + param in name "bool" explicit_type "" + nexceptions 1 + exception class_ref 135941 // State + cpp_decl " ${comment}${friend}${static}${inline}${virtual}${type} ${name} ${(}${)}${const}${volatile} ${throw}${abstract};" + cpp_def "${comment}${inline}${type} +${class}::${name} ${(}${)}${const}${volatile} ${throw}${staticnl} +{ + ${body} +} + +" + + + comment "change the enabled status of this asset. Note the corresponding #isActive predicate may depend on the enablement status of parent assets as well" + end + end + + class 136581 "AssetManager" + visibility public stereotype "boundary" + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "${comment}${abstract}${local}interface ${name}${inherit} { +${members}}; +" + explicit_switch_type "" + + comment "Facade for the Asset subsystem" + operation 132357 "register" + class_operation public explicit_return_type "long" + nparams 4 + param inout name "name" explicit_type "string" + param inout name "category" explicit_type "string" + param inout name "org" explicit_type "string" + param inout name "uint" explicit_type "version" + nexceptions 1 + explicit_exception "Invalid" + cpp_decl " ${comment}${friend}${static}${inline}${virtual}${type} ${name} ${(}${t0} & ${p0}, ${t1} & ${p1}, ${t2} & ${p2}, ${t3}& ${p3}${)}${const}${volatile} ${throw}${abstract};" + cpp_def "${comment}${inline}${type} +${class}::${name} ${(}${t0} & ${p0}, ${t1} & ${p1}, ${t2} & ${p2}, ${t3}& ${p3}${)}${const}${volatile} ${throw}${staticnl} +{ + ${body} +} + +" + + + comment "registers an asset object in the internal DB, providing its unique key" + end + + operation 132485 "getAsset" + public explicit_return_type "KIND" + nparams 1 + param in name "id" explicit_type "long" + nexceptions 1 + exception class_ref 136069 // Invalid + cpp_decl " ${comment}template +${friend}${static}${inline}${virtual}${type} ${name} ${(}${t0} & ${p0}${)}${const}${volatile} ${throw}${abstract};" + cpp_def "${comment}template +${inline}${type} +${class}::${name} ${(}${t0} & ${p0}${)}${const}${volatile} ${throw}${staticnl} +{ + ${body} +} + +" + + + comment "find and return corresponging object" + end + + operation 132613 "known" + public explicit_return_type "bool" + nparams 1 + param in name "id" explicit_type "long" + cpp_decl " ${comment}${friend}${static}${inline}${virtual}${type} ${name} ${(}${t0} ${p0}${)}${const}${volatile} ${throw}${abstract};" + cpp_def "${comment}${inline}${type} +${class}::${name} ${(}${t0} ${p0}${)}${const}${volatile} ${throw}${staticnl} +{ + ${body} +} + +" + + + comment "@return true if the given id is registered in the internal asset DB" + end + + operation 132741 "remove" + public explicit_return_type "void" + nparams 1 + param in name "id" explicit_type "long" + nexceptions 2 + exception class_ref 136069 // Invalid + exception class_ref 135941 // State + cpp_decl " ${comment}${friend}${static}${inline}${virtual}${type} ${name} ${(}${t0} ${p0}${)}${const}${volatile} ${throw}${abstract};" + cpp_def "${comment}${inline}${type} +${class}::${name} ${(}${t0} ${p0}${)}${const}${volatile} ${throw}${staticnl} +{ + ${body} +} + +" + + + comment "remove the given asset together with all its dependants from the internal DB" + end + end + + class 136709 "Media" + visibility public + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + comment "key abstraction: media-like assets" + classrelation 139909 // + relation 138117 -_-|> + a public + cpp default "${type}" + classrelation_ref 139909 // + b multiplicity "" parent class_ref 136453 // Asset + end + end + + class 136837 "Proc" + visibility public + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + comment "key abstraction: data processing asset" + classrelation 140037 // + relation 138245 -_-|> + a public + cpp default "${type}" + classrelation_ref 140037 // + b multiplicity "" parent class_ref 136453 // Asset + end + end + + class 136965 "Struct" + visibility public + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + comment "key abstraction: structural asset" + classrelation 140165 // + relation 138373 -_-|> + a public + cpp default "${type}" + classrelation_ref 140165 // + b multiplicity "" parent class_ref 136453 // Asset + end + end + + class 137093 "Meta" + visibility public + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + comment "key abstraction: metadata and organisational asset" + classrelation 140293 // + relation 138501 -_-|> + a public + cpp default "${type}" + classrelation_ref 140293 // + b multiplicity "" parent class_ref 136453 // Asset + end + end + + class 137221 "Category" + visibility package + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + comment "tree like classification of Assets" + end + + class 137349 "Clip" + visibility package + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + comment "bookkeeping (asset) view of a media clip." + classrelation 140549 // + relation 138757 ---|> + a public + cpp default "${type}" + classrelation_ref 140549 // + b multiplicity "" parent class_ref 136709 // Media + end + + classrelation 141957 // source () + relation 140165 ---> + a role_name "source" multiplicity "1" const_relation protected + comment "media source of this clip" + cpp default " ${comment}${static}${mutable}${volatile}${const}${type}* ${name}${value}; +" + classrelation_ref 141957 // source () + b multiplicity "*" parent class_ref 136709 // Media + association_type class_ref 136709 // Media + end + end + + class 137477 "Unknown" + visibility package + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + comment "placeholder for unknown or unavailable media source" + classrelation 140933 // + relation 139141 ---|> + a public + cpp default "${type}" + classrelation_ref 140933 // + b multiplicity "" parent class_ref 137605 // Preview + end + end + + class 137605 "Preview" + visibility package + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + comment "alternative version of the media data, probably with lower resolution" + classrelation 140805 // + relation 139013 ---|> + a public + cpp default "${type}" + classrelation_ref 140805 // + b multiplicity "" parent class_ref 136709 // Media + end + end + + class 137733 "Effect" + visibility package + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + comment "Effect or media processing component" + classrelation 141061 // + relation 139269 ---|> + a public + cpp default "${type}" + classrelation_ref 141061 // + b multiplicity "" parent class_ref 136837 // Proc + end + end + + class 137861 "Codec" + visibility package + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + comment "description of some media data decoder or encoder facility" + classrelation 141189 // + relation 139397 ---|> + a public + cpp default "${type}" + classrelation_ref 141189 // + b multiplicity "" parent class_ref 136837 // Proc + end + end + + class 137989 "Track" + visibility package + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + comment "structural asset holding the configuration of a track in the EDL" + classrelation 141317 // + relation 139525 ---|> + a public + cpp default "${type}" + classrelation_ref 141317 // + b multiplicity "" parent class_ref 136965 // Struct + end + end + + class 138117 "OutPort" + visibility package + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + comment "structural asset corresponding to some port generating media output" + classrelation 141445 // + relation 139653 ---|> + a public + cpp default "${type}" + classrelation_ref 141445 // + b multiplicity "" parent class_ref 136965 // Struct + end + end + + class 138245 "Dataset" + visibility package + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + comment "meta asset describing a collection of control data" + classrelation 141573 // + relation 139781 ---|> + a public + cpp default "${type}" + classrelation_ref 141573 // + b multiplicity "" parent class_ref 137093 // Meta + end + end + end end diff --git a/uml/cinelerra3/128261 b/uml/cinelerra3/128261 index c3e6e1c4e..e6d8a8100 100644 --- a/uml/cinelerra3/128261 +++ b/uml/cinelerra3/128261 @@ -1,6 +1,6 @@ format 40 "MObject" // ProcessingLayer::MObject - revision 16 + revision 17 modified_by 5 "hiv" // class settings //class diagram settings @@ -414,6 +414,17 @@ ${inlines} idl_decl "" comment "startpos in source" end + + classrelation 141829 // source () + relation 140037 ---> + a role_name "source" multiplicity "1" const_relation protected + comment "the media source this clip referes to" + cpp default " ${comment}${static}${mutable}${volatile}${const}${type}* ${name}${value}; +" + classrelation_ref 141829 // source () + b multiplicity "*" parent class_ref 137349 // Clip + association_type class_ref 128901 // Clip + end end class 129029 "Effect" diff --git a/uml/cinelerra3/128389 b/uml/cinelerra3/128389 index 44e647971..6581cb200 100644 --- a/uml/cinelerra3/128389 +++ b/uml/cinelerra3/128389 @@ -1,6 +1,6 @@ format 40 "RenderEngine" // ProcessingLayer::RenderEngine - revision 10 + revision 11 modified_by 5 "hiv" // class settings //class diagram settings @@ -559,6 +559,14 @@ ${inlines} classrelation_ref 136069 // b multiplicity "" parent class_ref 131717 // ProcNode end + + classrelation 141701 // + relation 139909 -_-> + a default + cpp default "Generated" + classrelation_ref 141701 // + b multiplicity "" parent class_ref 136709 // Media + end end end end diff --git a/uml/cinelerra3/129669 b/uml/cinelerra3/129669 index 6ab555985..b2c2e0372 100644 --- a/uml/cinelerra3/129669 +++ b/uml/cinelerra3/129669 @@ -1,6 +1,6 @@ format 40 "proc" // design::codegen::proc - revision 6 + revision 7 modified_by 5 "hiv" // class settings //class diagram settings @@ -38,6 +38,84 @@ All classes belonging to the (middle) processing layer" package_name_in_tab default show_context default write_horizontally default auto_label_position default draw_all_relations default shadow default draw_component_as_icon default show_component_req_prov default show_component_rea default comment "defines source files to be generated by BOUML" + artifact 136197 "assetmanager" + stereotype "source" + cpp_h "/* + ${NAME}.hpp - ${description} +@{CopyrightClaim}@{GPLHeader} +*/ + + +#ifndef ${NAMESPACE}_${NAME}_H +#define ${NAMESPACE}_${NAME}_H + +${includes} +${declarations} + + +${namespace_start} + +${definition} +${namespace_end} +#endif +" + cpp_src "/* + ${Name} - ${description} +@{CopyrightClaim}@{GPLHeader} +* *****************************************************/ + + +${includes} +${namespace_start} + + +${members} +${namespace_end}" + associated_classes + class_ref 136581 // AssetManager + end + comment "Facade for the Asset subsystem" + end + + artifact 136069 "asset" + stereotype "source" + cpp_h "/* + ${NAME}.hpp - ${description} +@{CopyrightClaim}@{GPLHeader} +*/ + + +#ifndef ${NAMESPACE}_${NAME}_H +#define ${NAMESPACE}_${NAME}_H + +${includes} +${declarations} + + +${namespace_start} + +${definition} +${namespace_end} +#endif +" + cpp_src "/* + ${Name} - ${description} +@{CopyrightClaim}@{GPLHeader} +* *****************************************************/ + + +${includes} +${namespace_start} + + +${members} +${namespace_end}" + associated_classes + class_ref 136453 // Asset + end + comment "Superinterface: bookeeping view of \"things\" present in the session" + end + artifact 130949 "stateproxy" stereotype "source" cpp_h "/* diff --git a/uml/cinelerra3/130053 b/uml/cinelerra3/130053 index 0bf8553f3..b9cf1d9ad 100644 --- a/uml/cinelerra3/130053 +++ b/uml/cinelerra3/130053 @@ -1,6 +1,6 @@ format 40 "asset" // design::codegen::proc::asset - revision 2 + revision 4 modified_by 5 "hiv" // class settings //class diagram settings @@ -38,5 +38,511 @@ Asset Management" package_name_in_tab default show_context default write_horizontally default auto_label_position default draw_all_relations default shadow default draw_component_as_icon default show_component_req_prov default show_component_rea default comment "defines source files to be generated by BOUML" + artifact 137733 "dataset" + stereotype "source" + cpp_h "/* + ${NAME}.hpp - ${description} +@{CopyrightClaim}@{GPLHeader} +*/ + + +#ifndef ${NAMESPACE}_${NAME}_H +#define ${NAMESPACE}_${NAME}_H + +${includes} +${declarations} + + +${namespace_start} + +${definition} +${namespace_end} +#endif +" + cpp_src "/* + ${Name} - ${description} +@{CopyrightClaim}@{GPLHeader} +* *****************************************************/ + + +${includes} +${namespace_start} + + +${members} +${namespace_end}" + associated_classes + class_ref 138245 // Dataset + end + comment "meta asset describing a collection of control data" + end + + artifact 135941 "category" + stereotype "source" + cpp_h "/* + ${NAME}.hpp - ${description} +@{CopyrightClaim}@{GPLHeader} +*/ + + +#ifndef ${NAMESPACE}_${NAME}_H +#define ${NAMESPACE}_${NAME}_H + +${includes} +${declarations} + + +${namespace_start} + +${definition} +${namespace_end} +#endif +" + cpp_src "/* + ${Name} - ${description} +@{CopyrightClaim}@{GPLHeader} +* *****************************************************/ + + +${includes} +${namespace_start} + + +${members} +${namespace_end}" + associated_classes + class_ref 137221 // Category + end + comment "tree like classification of Assets" + end + + artifact 136453 "media" + stereotype "source" + cpp_h "/* + ${NAME}.hpp - ${description} +@{CopyrightClaim}@{GPLHeader} +*/ + + +#ifndef ${NAMESPACE}_${NAME}_H +#define ${NAMESPACE}_${NAME}_H + +${includes} +${declarations} + + +${namespace_start} + +${definition} +${namespace_end} +#endif +" + cpp_src "/* + ${Name} - ${description} +@{CopyrightClaim}@{GPLHeader} +* *****************************************************/ + + +${includes} +${namespace_start} + + +${members} +${namespace_end}" + associated_classes + class_ref 136709 // Media + end + comment "key abstraction: media-like assets" + end + + artifact 136581 "proc" + stereotype "source" + cpp_h "/* + ${NAME}.hpp - ${description} +@{CopyrightClaim}@{GPLHeader} +*/ + + +#ifndef ${NAMESPACE}_${NAME}_H +#define ${NAMESPACE}_${NAME}_H + +${includes} +${declarations} + + +${namespace_start} + +${definition} +${namespace_end} +#endif +" + cpp_src "/* + ${Name} - ${description} +@{CopyrightClaim}@{GPLHeader} +* *****************************************************/ + + +${includes} +${namespace_start} + + +${members} +${namespace_end}" + associated_classes + class_ref 136837 // Proc + end + comment "key abstraction: media-like assets" + end + + artifact 136709 "struct" + stereotype "source" + cpp_h "/* + ${NAME}.hpp - ${description} +@{CopyrightClaim}@{GPLHeader} +*/ + + +#ifndef ${NAMESPACE}_${NAME}_H +#define ${NAMESPACE}_${NAME}_H + +${includes} +${declarations} + + +${namespace_start} + +${definition} +${namespace_end} +#endif +" + cpp_src "/* + ${Name} - ${description} +@{CopyrightClaim}@{GPLHeader} +* *****************************************************/ + + +${includes} +${namespace_start} + + +${members} +${namespace_end}" + associated_classes + class_ref 136965 // Struct + end + comment "key abstraction: structural asset" + end + + artifact 136837 "meta" + stereotype "source" + cpp_h "/* + ${NAME}.hpp - ${description} +@{CopyrightClaim}@{GPLHeader} +*/ + + +#ifndef ${NAMESPACE}_${NAME}_H +#define ${NAMESPACE}_${NAME}_H + +${includes} +${declarations} + + +${namespace_start} + +${definition} +${namespace_end} +#endif +" + cpp_src "/* + ${Name} - ${description} +@{CopyrightClaim}@{GPLHeader} +* *****************************************************/ + + +${includes} +${namespace_start} + + +${members} +${namespace_end}" + associated_classes + class_ref 137093 // Meta + end + comment "key abstraction: metadata and organisational asset" + end + + artifact 136325 "clip" + stereotype "source" + cpp_h "/* + ${NAME}.hpp - ${description} +@{CopyrightClaim}@{GPLHeader} +*/ + + +#ifndef ${NAMESPACE}_${NAME}_H +#define ${NAMESPACE}_${NAME}_H + +${includes} +${declarations} + + +${namespace_start} + +${definition} +${namespace_end} +#endif +" + cpp_src "/* + ${Name} - ${description} +@{CopyrightClaim}@{GPLHeader} +* *****************************************************/ + + +${includes} +${namespace_start} + + +${members} +${namespace_end}" + associated_classes + class_ref 137349 // Clip + end + comment "bookkeeping (asset) view of a media clip." + end + + artifact 136965 "preview" + stereotype "source" + cpp_h "/* + ${NAME}.hpp - ${description} +@{CopyrightClaim}@{GPLHeader} +*/ + + +#ifndef ${NAMESPACE}_${NAME}_H +#define ${NAMESPACE}_${NAME}_H + +${includes} +${declarations} + + +${namespace_start} + +${definition} +${namespace_end} +#endif +" + cpp_src "/* + ${Name} - ${description} +@{CopyrightClaim}@{GPLHeader} +* *****************************************************/ + + +${includes} +${namespace_start} + + +${members} +${namespace_end}" + associated_classes + class_ref 137605 // Preview + end + comment "alternative version of the media data, probably with lower resolution" + end + + artifact 137093 "unknown" + stereotype "source" + cpp_h "/* + ${NAME}.hpp - ${description} +@{CopyrightClaim}@{GPLHeader} +*/ + + +#ifndef ${NAMESPACE}_${NAME}_H +#define ${NAMESPACE}_${NAME}_H + +${includes} +${declarations} + + +${namespace_start} + +${definition} +${namespace_end} +#endif +" + cpp_src "/* + ${Name} - ${description} +@{CopyrightClaim}@{GPLHeader} +* *****************************************************/ + + +${includes} +${namespace_start} + + +${members} +${namespace_end}" + associated_classes + class_ref 137477 // Unknown + end + comment "placeholder for unknown or unavailable media source" + end + + artifact 137221 "effect" + stereotype "source" + cpp_h "/* + ${NAME}.hpp - ${description} +@{CopyrightClaim}@{GPLHeader} +*/ + + +#ifndef ${NAMESPACE}_${NAME}_H +#define ${NAMESPACE}_${NAME}_H + +${includes} +${declarations} + + +${namespace_start} + +${definition} +${namespace_end} +#endif +" + cpp_src "/* + ${Name} - ${description} +@{CopyrightClaim}@{GPLHeader} +* *****************************************************/ + + +${includes} +${namespace_start} + + +${members} +${namespace_end}" + associated_classes + class_ref 137733 // Effect + end + comment "Effect or media processing component" + end + + artifact 137349 "codec" + stereotype "source" + cpp_h "/* + ${NAME}.hpp - ${description} +@{CopyrightClaim}@{GPLHeader} +*/ + + +#ifndef ${NAMESPACE}_${NAME}_H +#define ${NAMESPACE}_${NAME}_H + +${includes} +${declarations} + + +${namespace_start} + +${definition} +${namespace_end} +#endif +" + cpp_src "/* + ${Name} - ${description} +@{CopyrightClaim}@{GPLHeader} +* *****************************************************/ + + +${includes} +${namespace_start} + + +${members} +${namespace_end}" + associated_classes + class_ref 137861 // Codec + end + comment "description of some media data decoder or encoder facility" + end + + artifact 137605 "outport" + stereotype "source" + cpp_h "/* + ${NAME}.hpp - ${description} +@{CopyrightClaim}@{GPLHeader} +*/ + + +#ifndef ${NAMESPACE}_${NAME}_H +#define ${NAMESPACE}_${NAME}_H + +${includes} +${declarations} + + +${namespace_start} + +${definition} +${namespace_end} +#endif +" + cpp_src "/* + ${Name} - ${description} +@{CopyrightClaim}@{GPLHeader} +* *****************************************************/ + + +${includes} +${namespace_start} + + +${members} +${namespace_end}" + associated_classes + class_ref 138117 // OutPort + end + comment "structural asset corresponding to some port generating media output" + end + + artifact 137477 "track" + stereotype "source" + cpp_h "/* + ${NAME}.hpp - ${description} +@{CopyrightClaim}@{GPLHeader} +*/ + + +#ifndef ${NAMESPACE}_${NAME}_H +#define ${NAMESPACE}_${NAME}_H + +${includes} +${declarations} + + +${namespace_start} + +${definition} +${namespace_end} +#endif +" + cpp_src "/* + ${Name} - ${description} +@{CopyrightClaim}@{GPLHeader} +* *****************************************************/ + + +${includes} +${namespace_start} + + +${members} +${namespace_end}" + associated_classes + class_ref 137989 // Track + end + comment "structural asset holding the configuration of a track in the EDL" + end end end diff --git a/uml/cinelerra3/130181 b/uml/cinelerra3/130181 index c20af94e1..0bb6e6de6 100644 --- a/uml/cinelerra3/130181 +++ b/uml/cinelerra3/130181 @@ -1,6 +1,6 @@ format 40 "mobject" // design::codegen::proc::mobject - revision 6 + revision 7 modified_by 5 "hiv" // class settings //class diagram settings diff --git a/uml/cinelerra3/130309.diagram b/uml/cinelerra3/130309.diagram new file mode 100644 index 000000000..d1300390d --- /dev/null +++ b/uml/cinelerra3/130309.diagram @@ -0,0 +1,133 @@ +format 40 + +classcanvas 128005 class_ref 136453 // Asset + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 96 16 2000 + end +classcanvas 128133 class_ref 136581 // AssetManager + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode class drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 289 26 2000 + end +packagecanvas 128517 + package_ref 128133 // AssetManager + xyzwh 217 182 1994 575 534 +classcanvas 128645 class_ref 136709 // Media + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 273 347 2005 + end +classcanvas 128773 class_ref 136837 // Proc + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 428 347 2005 + end +classcanvas 128901 class_ref 136965 // Struct + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 603 347 2005 + end +classcanvas 129029 class_ref 137093 // Meta + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 723 347 2005 + end +classcanvas 130821 class_ref 137221 // Category + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 277 233 2004 + end +classcanvas 131077 class_ref 137349 // Clip + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 236 445 2000 + end +classcanvas 131333 class_ref 137477 // Unknown + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 303 529 2000 + end +classcanvas 131461 class_ref 137605 // Preview + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 308 445 2005 + end +classcanvas 131973 class_ref 137733 // Effect + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 402 445 2000 + end +classcanvas 132101 class_ref 137861 // Codec + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 463 445 2000 + end +classcanvas 132485 class_ref 137989 // Track + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 563 445 2000 + end +classcanvas 132613 class_ref 138117 // OutPort + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 626 445 2000 + end +classcanvas 132997 class_ref 138245 // Dataset + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 719 445 2000 + end +relationcanvas 129157 relation_ref 138117 // + geometry VHV + from ref 128645 z 1999 to point 293 315 + line 129797 z 1999 to point 138 315 + line 129925 z 1999 to ref 128005 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 129285 relation_ref 138245 // + geometry VHV + from ref 128773 z 1999 to point 448 315 + line 130053 z 1999 to point 138 315 + line 130181 z 1999 to ref 128005 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 129413 relation_ref 138373 // + geometry VHV + from ref 128901 z 1999 to point 623 315 + line 130309 z 1999 to point 138 315 + line 130437 z 1999 to ref 128005 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 129541 relation_ref 138501 // + geometry VHV + from ref 129029 z 1999 to point 743 315 + line 130565 z 1999 to point 138 315 + line 130693 z 1999 to ref 128005 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 130949 relation_ref 138629 // + from ref 128005 z 1999 to ref 130821 + role_a_pos 223 229 3000 no_role_b + multiplicity_a_pos 260 250 3000 multiplicity_b_pos 194 194 3000 +relationcanvas 131205 relation_ref 138757 // + from ref 131077 z 1999 to ref 128645 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 131717 relation_ref 139013 // + from ref 131461 z 2004 to ref 128645 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 131845 relation_ref 139141 // + from ref 131333 z 1999 to ref 131461 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 132229 relation_ref 139269 // + from ref 131973 z 1999 to ref 128773 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 132357 relation_ref 139397 // + from ref 132101 z 1999 to ref 128773 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 132741 relation_ref 139525 // + from ref 132485 z 1999 to ref 128901 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 132869 relation_ref 139653 // + from ref 132613 z 1999 to ref 128901 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 133125 relation_ref 139781 // + from ref 132997 z 1999 to ref 129029 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +line 128261 -_-_ geometry HV + from ref 128005 z 1999 to point 330 150 + line 128389 z 1999 to ref 128133 +end diff --git a/uml/cinelerra3/130437.diagram b/uml/cinelerra3/130437.diagram new file mode 100644 index 000000000..c10d368c7 --- /dev/null +++ b/uml/cinelerra3/130437.diagram @@ -0,0 +1,147 @@ +format 40 + +classcanvas 128005 class_ref 137349 // Clip + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 469 148 2000 + end +classcanvas 128133 class_ref 136709 // Media + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 545 50 2005 + end +classcanvas 128261 class_ref 137477 // Unknown + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 536 232 2000 + end +classcanvas 128389 class_ref 137605 // Preview + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 541 148 2005 + end +classcanvas 128901 class_ref 128901 // Clip + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 96 206 2000 + end +classcanvas 129029 class_ref 128517 // MObject + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 79 46 2000 + end +classcanvas 129157 class_ref 128773 // AbstractMO + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 81 142 2000 + end +classcanvas 130309 class_ref 131717 // ProcNode + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 271 279 2000 + end +classcanvas 130821 class_ref 133765 // Source + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 396 407 2000 + end +classcanvas 131077 class_ref 135045 // CodecAdapter + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 320 477 2000 + end +classcanvas 131205 class_ref 131845 // Trafo + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 317 407 2000 + end +classcanvas 134277 class_ref 133381 // AFrame + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 530 480 2000 + end +classcanvas 134405 class_ref 133509 // VFrame + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 584 480 2000 + end +classcanvas 134661 class_ref 133253 // Frame + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 571 355 2000 + end +packagecanvas 135685 + package_ref 128261 // MObject + xyzwh 24 10 1994 185 313 +packagecanvas 135813 + package_ref 128133 // AssetManager + xyzwh 454 10 1994 198 292 +note 136837 "the Builder implements each Clip by a source node and maybe some codec" + xyzwh 53 376 2000 219 61 +relationcanvas 128517 relation_ref 139141 // + from ref 128261 z 1999 to ref 128389 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 128645 relation_ref 138757 // + from ref 128005 z 1999 to ref 128133 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 128773 relation_ref 139013 // + from ref 128389 z 2004 to ref 128133 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 129541 relation_ref 129413 // + from ref 128901 z 1999 to ref 129157 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 129669 relation_ref 129285 // + geometry VHr + from ref 129157 z 1999 to point 116 161 + line 129797 z 1999 to ref 129029 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 132357 relation_ref 132229 // + geometry VHV + from ref 131205 z 1999 to point 337 373 + line 132485 z 1999 to point 308 373 + line 132613 z 1999 to ref 130309 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 132741 relation_ref 135429 // + from ref 130309 z 1999 to point 241 279 + line 132869 z 1999 to point 241 309 + line 132997 z 1999 to ref 130309 + role_a_pos 223 287 3000 no_role_b + no_multiplicity_a multiplicity_b_pos 254 306 3000 +relationcanvas 133125 relation_ref 136965 // + from ref 131077 z 1999 to ref 131205 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 133893 relation_ref 134661 // + geometry VHV + from ref 130821 z 1999 to point 418 373 + line 134021 z 1999 to point 308 373 + line 134149 z 1999 to ref 130309 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 134789 relation_ref 133893 // + geometry VHV + from ref 134277 z 1999 to point 554 447 + line 134917 z 1999 to point 608 447 + line 135045 z 1999 to ref 134661 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 135301 relation_ref 134021 // + geometry VHV + from ref 134405 z 1999 to point 608 447 + line 135429 z 1999 to point 608 447 + line 135557 z 1999 to ref 134661 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 135941 relation_ref 139909 // + from ref 130821 z 1999 to point 433 383 + line 136069 z 1999 to point 433 68 + line 136197 z 1999 to ref 128133 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 136325 relation_ref 140037 // + from ref 128901 z 1999 to point 224 231 + line 136709 z 1999 to point 370 166 + line 136581 z 1999 to ref 128005 + role_a_pos 382 147 3000 no_role_b + multiplicity_a_pos 452 177 3000 multiplicity_b_pos 150 242 3000 +relationcanvas 136965 relation_ref 140165 // + geometry VH + from ref 128005 z 1999 to point 489 69 + line 137093 z 1999 to ref 128133 + role_a_pos 491 49 3000 no_role_b + multiplicity_a_pos 524 72 3000 multiplicity_b_pos 477 123 3000 +line 136453 -_-_ + from ref 136325 z 1998 to ref 128901 +end diff --git a/uml/cinelerra3/5.session b/uml/cinelerra3/5.session index 431e0a5d0..e0bcf446f 100644 --- a/uml/cinelerra3/5.session +++ b/uml/cinelerra3/5.session @@ -1,17 +1,33 @@ -window_sizes 1104 756 270 824 557 120 +window_sizes 1140 783 270 860 584 120 diagrams - active classdiagram_ref 130181 // Hierarchy - 762 514 100 4 0 0 + active classdiagram_ref 130309 // Asset Kinds + 853 560 100 4 0 2 end show_stereotypes -selected artifact_ref 135813 // error +selected + package_ref 129 // cinelerra3 open - deploymentview_ref 128261 // gen + + package_ref 129413 // common + deploymentview_ref 128517 // gen + artifact_ref 135941 // category + artifact_ref 136453 // media + artifact_ref 136581 // proc + artifact_ref 136709 // struct + artifact_ref 136965 // preview + artifact_ref 137093 // unknown + artifact_ref 137221 // effect + artifact_ref 137605 // outport + artifact_ref 137477 // track deploymentview_ref 128773 // gen package_ref 129797 // gui - - package_ref 129285 // ProcessingLayer + class_ref 136453 // Asset + class_ref 136581 // AssetManager + class_ref 136709 // Media + class_ref 137349 // Clip + classview_ref 128005 // Session + classview_ref 128133 // Engine Workings class_ref 135685 // Logic class_ref 135813 // Config class_ref 135941 // State diff --git a/uml/cinelerra3/cinelerra3.prj b/uml/cinelerra3/cinelerra3.prj index 7c1c4f1f6..9608f43c3 100644 --- a/uml/cinelerra3/cinelerra3.prj +++ b/uml/cinelerra3/cinelerra3.prj @@ -1,6 +1,6 @@ format 40 "cinelerra3" - revision 26 + revision 27 modified_by 5 "hiv" cpp_root_dir "../../src/" diff --git a/wiki/renderengine.html b/wiki/renderengine.html index 5c2362e25..224f4c324 100644 --- a/wiki/renderengine.html +++ b/wiki/renderengine.html @@ -514,12 +514,39 @@ ColorPalette SiteUrl
                -
                -
                Asset management is a subsystem on its own. Assets are "things" that can be loaded into a session, like Media, Clips, Effects, Transitions. It is the "bookkeeping view", while the EDL is the "manipulation and process view".
                +
                +
                Asset management is a subsystem on its own. Assets are "things" that can be loaded into a session, like Media, Clips, Effects, Transitions. It is the "bookkeeping view", while the EDL is the "manipulation and process view". Some Assets can be //loaded// and a collection of Assets is saved with eatch Session. Besides, there is a collection of basic Assets allways available by default.
                 
                -The Assets are important reference points holding the information needed to access external resources. For example, an Clip asset can reference a Media asset, which in turn holds the external filename from which to get the media stream. Or, an Effect asset can hold a plugin-ID.
                +The Assets are important reference points holding the information needed to access external resources. For example, an Clip asset can reference a Media asset, which in turn holds the external filename from which to get the media stream. For Effects, the situatin is similar. Assets thus serve two quite distinct purposes. One is to load, list, group serarch and browse them, and to provide an entry point to create new or get at existing MObjects in the EDL, while the other purpose is to provide attribute and property informations to the inner parts of the engine, while at the same time isolating and decoupling them from environmental details. 
                 
                -!still to be worked out..
                +We can distinguish several different Kinds of Assets, each one with specific properties. While all these Kinds of Assets implement the basic Asset interface, they themselfs are the __key abstractions__ of the asset management view. Mostly, their interfaces will be used directly, because they are quite different in behaviour. Thus it is common to see asset related operations being templated on the Asset Kind. 
                +[img[Asset Classess|uml/fig130309.png]]
                +
                +!Media Asset
                +Some piece of Media Data accessible at some external Location an able to be processed by Cinelerra. A Media File on Harddisk can be considered as the most basic form of Media Asset, with some important derived Flavours, like a Placeholder for a currently unavailable Source, or Media available in different Resolutions or Formats.
                +* __outward interface operations__ include querying properties, creating an Clip MObject, controlling processing policy (low res proxy placeholders, interlacing and other generic pre- and postprocessing)
                +* __inward interface operations__ include querying filename, codec, offset and any other informations necessary for creating a source render node, getting additional processing policy decisions (handling of interlacing, aspect ratio).
                +&rarr; MediaAsset
                +
                +!Processing Asset
                +Some software component able to work on media data in the Cinelerra Render engine Framework. This includes all sorts of loadable effects, as well as some of the standard, internal facilities (Mask, Projector). Note that Processing Assets typically provide some attachment Point or means of communication with GUI facilities.
                +* __outward interface operations__ include...
                +* __inward interface operations__ include...
                +&rarr; ProcAsset {{red{to be defined}}}
                +
                +!Structural Asset
                +Some of the building blocks providing the framework for the objects placed into the current Session. Notable examples are Input/Output channels (Ports), Viewer attachment points, Tracks, etc.
                +* __outward interface operations__ include...
                +* __inward interface operations__ include...
                +&rarr; StructAsset {{red{to be defined}}}
                +
                +!Meta Asset
                +Some additional, virtual facilities created in the course of the editing process. Examples are Automation data sets, Lables and reference points, Meta Clips (nested sub-~EDLs)
                +* __outward interface operations__ include...
                +* __inward interface operations__ include...
                +&rarr; MetaAsset {{red{to be defined}}}
                +
                +!!!!still to be worked out..
                 is how to implement the relationship between [[MObject]]s and Assets. Do we use direct pointers, or do we prefer an ID + central registry approach? And how to handle the removal of an Asset (&rarr; see also [[analysis of mem management|ManagementAssetRelation]])
                 
                @@ -1292,8 +1319,16 @@ This Design strives to achieve a StrongSeparation between the low-level Structur [[Admin]] <<fullscreen>>
                -
                -
                Problem is: when removing an Asset, all corresponding MObjects need to disappear. This means, besides the obvious Ref-Link (MObject refering to an asset) we need backlinks or a sort of registry. And still worse: we need to remove the affetcted MObject from the object network in the EDL and rebuild the Fixture...
                +
                +
                Problem is: when removing an Asset, all corresponding MObjects need to disappear. This means, besides the obvious ~Ref-Link (MObject refering to an asset) we need backlinks or a sort of registry. And still worse: we need to remove the affetcted MObject from the object network in the EDL and rebuild the Fixture...
                +
                +As a //first shot// Ichthyo considers the following approach:
                +* all references between MObjects and Assets are implemented as refcounting boost::shared_ptr
                +* MObjects and Assets implement an {{{unlink()}}} function releasing the internal links to other entities.
                +* Instead of a delete, we call this unlink() function and let the shared_ptr handle the actual deletion.
                +* we don't use a registry, rather we model the real dependencies by individual dependency links. So a MediaAsset gets links to all Clips created from this Asset and by traversing this tree, we can handle the deletion
                +* after the deletion, the Fixture needs to be rebuilt.
                +* but any render processes still can have pointers to the Asset to be removed, and the shared_ptr will ensure, that the refered objects stay alive as long as needed.
                 
                 {{red{to be considered in more detail later}}}
                 
                @@ -1305,6 +1340,10 @@ This Design strives to achieve a StrongSeparation between the low-level Structur <style type="text/css">#contentWrapper {display:none;}</style><div id="SplashScreen" style="border: 3px solid #ccc; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#000; font-size: 28px; font-family:Tahoma; background-color:#eee;">loading <b>Cinelerra Renderengine</b> devel doku<blink> ...</blink><br><br><span style="font-size: 14px; color:red;">Requires Javascript.</span></div>
                +
                +
                The Interface asset::Media is a //key abstraction// It ties together several concepts and enables to deal with them on the interfaces in a uniform manner. Besides, as every Asset kind it belongs rather to the bookkeeping view: it holds the specific properties and parametrisation of the media source it stands for. Regarding the __inward interface__ &mdash; as used from within the [[EDL]] or the [[Render Nodes|ProcNode]], it is irrelevant if a given asset::Media object stands for a complete media source, just a clip taken from this source or if a placeholder version of the real media source is used instead.
                +[img[Asset Classess|uml/fig130437.png]]
                +
                Of course: Cinelerra currently leaks memory and crashes regularilly. For the newly written code, besides retaining the same performance level, a main goal is to use methods and techniques known to support the writing of quality code. So, besides the MultithreadConsiderations, a solid strategy for managing the ownership of allocated memory blocks is necessary right from start.
                 
                
                From 2e390f1b0591be94914e8b48de449274b54b5867 Mon Sep 17 00:00:00 2001
                From: Ichthyostega 
                Date: Sun, 2 Sep 2007 18:48:22 +0200
                Subject: [PATCH 6/8] initial code generation/formatting for Asset subsystem
                
                ---
                 src/proc/asset.cpp          |  69 ++++++++++++++++++++
                 src/proc/asset.hpp          | 125 ++++++++++++++++++++++++++++++++++++
                 src/proc/asset/category.cpp |  31 +++++++++
                 src/proc/asset/category.hpp |  40 ++++++++++++
                 src/proc/asset/clip.cpp     |  33 ++++++++++
                 src/proc/asset/clip.hpp     |  47 ++++++++++++++
                 src/proc/asset/codec.cpp    |  31 +++++++++
                 src/proc/asset/codec.hpp    |  45 +++++++++++++
                 src/proc/asset/dataset.cpp  |  31 +++++++++
                 src/proc/asset/dataset.hpp  |  42 ++++++++++++
                 src/proc/asset/effect.cpp   |  31 +++++++++
                 src/proc/asset/effect.hpp   |  45 +++++++++++++
                 src/proc/asset/media.cpp    |  33 ++++++++++
                 src/proc/asset/media.hpp    |  46 +++++++++++++
                 src/proc/asset/meta.cpp     |  33 ++++++++++
                 src/proc/asset/meta.hpp     |  46 +++++++++++++
                 src/proc/asset/outport.cpp  |  31 +++++++++
                 src/proc/asset/outport.hpp  |  46 +++++++++++++
                 src/proc/asset/preview.cpp  |  31 +++++++++
                 src/proc/asset/preview.hpp  |  45 +++++++++++++
                 src/proc/asset/proc.cpp     |  33 ++++++++++
                 src/proc/asset/proc.hpp     |  46 +++++++++++++
                 src/proc/asset/struct.cpp   |  31 +++++++++
                 src/proc/asset/struct.hpp   |  46 +++++++++++++
                 src/proc/asset/track.cpp    |  33 ++++++++++
                 src/proc/asset/track.hpp    |  46 +++++++++++++
                 src/proc/asset/unknown.cpp  |  33 ++++++++++
                 src/proc/asset/unknown.hpp  |  47 ++++++++++++++
                 src/proc/assetmanager.cpp   |  70 ++++++++++++++++++++
                 src/proc/assetmanager.hpp   |  67 +++++++++++++++++++
                 uml/cinelerra3/5.session    |  19 +-----
                 31 files changed, 1336 insertions(+), 16 deletions(-)
                 create mode 100644 src/proc/asset.cpp
                 create mode 100644 src/proc/asset.hpp
                 create mode 100644 src/proc/asset/category.cpp
                 create mode 100644 src/proc/asset/category.hpp
                 create mode 100644 src/proc/asset/clip.cpp
                 create mode 100644 src/proc/asset/clip.hpp
                 create mode 100644 src/proc/asset/codec.cpp
                 create mode 100644 src/proc/asset/codec.hpp
                 create mode 100644 src/proc/asset/dataset.cpp
                 create mode 100644 src/proc/asset/dataset.hpp
                 create mode 100644 src/proc/asset/effect.cpp
                 create mode 100644 src/proc/asset/effect.hpp
                 create mode 100644 src/proc/asset/media.cpp
                 create mode 100644 src/proc/asset/media.hpp
                 create mode 100644 src/proc/asset/meta.cpp
                 create mode 100644 src/proc/asset/meta.hpp
                 create mode 100644 src/proc/asset/outport.cpp
                 create mode 100644 src/proc/asset/outport.hpp
                 create mode 100644 src/proc/asset/preview.cpp
                 create mode 100644 src/proc/asset/preview.hpp
                 create mode 100644 src/proc/asset/proc.cpp
                 create mode 100644 src/proc/asset/proc.hpp
                 create mode 100644 src/proc/asset/struct.cpp
                 create mode 100644 src/proc/asset/struct.hpp
                 create mode 100644 src/proc/asset/track.cpp
                 create mode 100644 src/proc/asset/track.hpp
                 create mode 100644 src/proc/asset/unknown.cpp
                 create mode 100644 src/proc/asset/unknown.hpp
                 create mode 100644 src/proc/assetmanager.cpp
                 create mode 100644 src/proc/assetmanager.hpp
                
                diff --git a/src/proc/asset.cpp b/src/proc/asset.cpp
                new file mode 100644
                index 000000000..8d51ae61a
                --- /dev/null
                +++ b/src/proc/asset.cpp
                @@ -0,0 +1,69 @@
                +/*
                +  Asset}  -  Superinterface: bookeeping view of "things" present in the session
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "proc/asset.hpp"
                +#include "proc/asset/category.hpp"
                +
                +namespace proc_interface
                +  {
                +
                +
                +
                +  /**
                +   * List of entities this asset depends on or requires to be functional. May be empty. The head of this list can be considered the primary prerequisite
                +   */
                +  vector
                +  Asset::getParents ()
                +  {
                +  }
                +
                +
                +  /**
                +   * All the other assets requiring this asset to be functional. For example, all the clips depending on a given media file. May be empty. The dependency relation is transitive.
                +   */
                +  vector
                +  Asset::getDependant ()
                +  {
                +  }
                +
                +
                +  /**
                +   * weather this asset is swithced on and consequently included in the fixture and participates in rendering
                +   */
                +  bool
                +  Asset::isActive ()
                +  {
                +  }
                +
                +
                +  /**
                +   * change the enabled status of this asset. Note the corresponding #isActive predicate may depend on the enablement status of parent assets as well
                +   */
                +  void
                +  Asset::enable ()  throw(cinelerra::error::State)
                +  {
                +  }
                +
                +
                +
                +} // namespace proc_interface
                diff --git a/src/proc/asset.hpp b/src/proc/asset.hpp
                new file mode 100644
                index 000000000..e81e8e466
                --- /dev/null
                +++ b/src/proc/asset.hpp
                @@ -0,0 +1,125 @@
                +/*
                +  ASSET.hpp  -  Superinterface: bookeeping view of "things" present in the session
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +*/
                +
                +
                +#ifndef PROC_INTERFACE_ASSET_H
                +#define PROC_INTERFACE_ASSET_H
                +
                +#include 
                +#include 
                +#include 
                +#include "common/error.hpp"
                +
                +using std::string;
                +using std::vector;
                +using std::set;
                +
                +
                +namespace asset { class Category; }
                +
                +
                +namespace proc_interface
                +  {
                +  
                +  typedef void* PAsset; //////TODO
                +  
                +  /**
                +   * Superinterface describing especially the bookeeping properties of Assets
                +   */
                +  class Asset
                +    {
                +    public:
                +      /** Asset primary key. */
                +      const long id;
                +
                +      /** element ID, comprehensible but sanitized.
                +       *  The tuple (category, name, org) is unique.
                +       */
                +      const string name;
                +
                +      /**primary tree like classification of the asset  */
                +      const asset::Category* category;
                +
                +      /** origin or authorship id. 
                +       *  Can be a project abbreviation, a package id or just the authors nickname or UID.
                +       *  This allows for the compnent name to be more generic (e.g. "blur"). 
                +       *  Default for all assets provided by the core cinelerra-3 codebase is "cin3".
                +       */
                +      const string org;
                +
                +      /** version number of the thing or concept represented by this asset.
                +       *  Of each unique tuple (name, category, org) there will be only one version 
                +       *  in the whole system. Version 0 is reserved for internal purposes. 
                +       *  Versions are considered to be ordered, and any higher version is 
                +       *  supposed to be fully backwards compatible to all previous versions.
                +       */
                +      const unsigned int version;
                +
                +
                +    protected:
                +      /** additional classification, selections or departments this asset belongs to.
                +       *  Groups are optional, non-exclusive and may be overlapping.
                +       */
                +      set groups;
                +
                +      /** user visible Name-ID. To be localized. */
                +      const string shortDesc;
                +
                +      /** user visible qualification of the thing, unit or concept represented by this asset.
                +       *  perferably "in one line". To be localized.  */
                +      const string longDesc;
                +
                +
                +    public:
                +      /** List of entities this asset depends on or requires to be functional. 
                +       *  May be empty. The head of this list can be considered the primary prerequisite
                +       */
                +      vector getParents () ;
                +      
                +      /** All the other assets requiring this asset to be functional. 
                +       *  For example, all the clips depending on a given media file. 
                +       *  May be empty. The dependency relation is transitive.
                +       */
                +      vector getDependant () ;
                +      
                +      /** weather this asset is swithced on and consequently 
                +       *  included in the fixture and participates in rendering
                +       */
                +      bool isActive () ;
                +      
                +      /** change the enabled status of this asset.
                +       *  Note the corresponding #isActive predicate may 
                +       *  depend on the enablement status of parent assets as well
                +       */
                +      void enable ()  throw(cinelerra::error::State);
                +    };
                +
                +} // namespace proc_interface
                +
                +
                +
                +namespace asset
                +  {
                +  using proc_interface::Asset;
                +}
                +
                +#endif
                diff --git a/src/proc/asset/category.cpp b/src/proc/asset/category.cpp
                new file mode 100644
                index 000000000..edd1b85af
                --- /dev/null
                +++ b/src/proc/asset/category.cpp
                @@ -0,0 +1,31 @@
                +/*
                +  Category  -  tree like classification of Assets
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "proc/asset/category.hpp"
                +
                +namespace asset
                +  {
                +
                +
                +
                +} // namespace asset
                diff --git a/src/proc/asset/category.hpp b/src/proc/asset/category.hpp
                new file mode 100644
                index 000000000..cbf7e0d9f
                --- /dev/null
                +++ b/src/proc/asset/category.hpp
                @@ -0,0 +1,40 @@
                +/*
                +  CATEGORY.hpp  -  tree like classification of Assets
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +*/
                +
                +
                +#ifndef ASSET_CATEGORY_H
                +#define ASSET_CATEGORY_H
                +
                +
                +
                +namespace asset
                +  {
                +  /**
                +   * tree like classification of Assets
                +   */
                +  class Category
                +    {};
                +    
                +    
                +    
                +} // namespace asset
                +#endif
                diff --git a/src/proc/asset/clip.cpp b/src/proc/asset/clip.cpp
                new file mode 100644
                index 000000000..b01ba5155
                --- /dev/null
                +++ b/src/proc/asset/clip.cpp
                @@ -0,0 +1,33 @@
                +/*
                +  Clip(Asset)  -  bookkeeping (asset) view of a media clip.
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "proc/asset/clip.hpp"
                +
                +namespace asset
                +  {
                +  
                +  /** */
                +
                +
                +
                +} // namespace asset
                diff --git a/src/proc/asset/clip.hpp b/src/proc/asset/clip.hpp
                new file mode 100644
                index 000000000..fea774b49
                --- /dev/null
                +++ b/src/proc/asset/clip.hpp
                @@ -0,0 +1,47 @@
                +/*
                +  CLIP.hpp  -  bookkeeping (asset) view of a media clip.
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +*/
                +
                +
                +#ifndef ASSET_CLIP_H
                +#define ASSET_CLIP_H
                +
                +#include "proc/asset/media.hpp"
                +
                +
                +
                +namespace asset
                +  {
                +  /**
                +   * bookkeeping (Asset) view of a media clip.
                +   */
                +  class Clip : public Media
                +    {
                +    protected:
                +      /**media source of this clip  */
                +      const Media* source;
                +
                +    };
                +    
                +    
                +    
                +} // namespace asset
                +#endif
                diff --git a/src/proc/asset/codec.cpp b/src/proc/asset/codec.cpp
                new file mode 100644
                index 000000000..d7fdac062
                --- /dev/null
                +++ b/src/proc/asset/codec.cpp
                @@ -0,0 +1,31 @@
                +/*
                +  Codec(Asset)  -  description of some media data decoder or encoder facility
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "proc/asset/codec.hpp"
                +
                +namespace asset
                +  {
                +
                +
                +
                +} // namespace asset
                diff --git a/src/proc/asset/codec.hpp b/src/proc/asset/codec.hpp
                new file mode 100644
                index 000000000..8da2ff3bd
                --- /dev/null
                +++ b/src/proc/asset/codec.hpp
                @@ -0,0 +1,45 @@
                +/*
                +  CODEC.hpp  -  description of some media data decoder or encoder facility
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +*/
                +
                +
                +#ifndef ASSET_CODEC_H
                +#define ASSET_CODEC_H
                +
                +#include "proc/asset/proc.hpp"
                +
                +
                +
                +namespace asset
                +  {
                +  
                +  /**
                +   * description of some media data decoder or encoder facility
                +   */
                +  class Codec : public Proc
                +    {
                +      
                +    };
                +    
                +    
                +    
                +} // namespace asset
                +#endif
                diff --git a/src/proc/asset/dataset.cpp b/src/proc/asset/dataset.cpp
                new file mode 100644
                index 000000000..50e8e08ae
                --- /dev/null
                +++ b/src/proc/asset/dataset.cpp
                @@ -0,0 +1,31 @@
                +/*
                +  Dataset  -  meta asset describing a collection of control data
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "proc/asset/dataset.hpp"
                +
                +namespace asset
                +  {
                +
                +
                +
                +} // namespace asset
                diff --git a/src/proc/asset/dataset.hpp b/src/proc/asset/dataset.hpp
                new file mode 100644
                index 000000000..1d85c39e0
                --- /dev/null
                +++ b/src/proc/asset/dataset.hpp
                @@ -0,0 +1,42 @@
                +/*
                +  DATASET.hpp  -  meta asset describing a collection of control data
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +*/
                +
                +
                +#ifndef ASSET_DATASET_H
                +#define ASSET_DATASET_H
                +
                +#include "proc/asset/meta.hpp"
                +
                +
                +
                +namespace asset
                +  {
                +
                +
                +  /**
                +   * meta asset describing a collection of control data
                +   */
                +  class Dataset : public Meta
                +    {};
                +
                +} // namespace asset
                +#endif
                diff --git a/src/proc/asset/effect.cpp b/src/proc/asset/effect.cpp
                new file mode 100644
                index 000000000..283bef53a
                --- /dev/null
                +++ b/src/proc/asset/effect.cpp
                @@ -0,0 +1,31 @@
                +/*
                +  Effect(Asset)  -  Effect or media processing component
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "proc/asset/effect.hpp"
                +
                +namespace asset
                +  {
                +
                +
                +
                +} // namespace asset
                diff --git a/src/proc/asset/effect.hpp b/src/proc/asset/effect.hpp
                new file mode 100644
                index 000000000..78ac66837
                --- /dev/null
                +++ b/src/proc/asset/effect.hpp
                @@ -0,0 +1,45 @@
                +/*
                +  EFFECT.hpp  -  Effect or media processing component
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +*/
                +
                +
                +#ifndef ASSET_EFFECT_H
                +#define ASSET_EFFECT_H
                +
                +#include "proc/asset/proc.hpp"
                +
                +
                +
                +namespace asset
                +  {
                +  
                +  /**
                +   * Effect or media processing component
                +   */
                +  class Effect : public Proc
                +    {
                +      
                +    };
                +    
                +    
                +    
                +} // namespace asset
                +#endif
                diff --git a/src/proc/asset/media.cpp b/src/proc/asset/media.cpp
                new file mode 100644
                index 000000000..a50360e04
                --- /dev/null
                +++ b/src/proc/asset/media.cpp
                @@ -0,0 +1,33 @@
                +/*
                +  Media(Asset)  -  key abstraction: media-like assets
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "proc/asset/media.hpp"
                +
                +namespace asset
                +  {
                +  
                +  /** */
                +
                +
                +
                +} // namespace asset
                diff --git a/src/proc/asset/media.hpp b/src/proc/asset/media.hpp
                new file mode 100644
                index 000000000..ac0683704
                --- /dev/null
                +++ b/src/proc/asset/media.hpp
                @@ -0,0 +1,46 @@
                +/*
                +  MEDIA.hpp  -  key abstraction: media-like assets
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +*/
                +
                +
                +#ifndef ASSET_MEDIA_H
                +#define ASSET_MEDIA_H
                +
                +#include "proc/asset.hpp"
                +
                +
                +
                +namespace asset
                +  {
                +
                +
                +  /**
                +   * key abstraction: media-like assets
                +   */
                +  class Media : public proc_interface::Asset
                +    {
                +      
                +    };
                +    
                +    
                +    
                +} // namespace asset
                +#endif
                diff --git a/src/proc/asset/meta.cpp b/src/proc/asset/meta.cpp
                new file mode 100644
                index 000000000..fb0ff7c05
                --- /dev/null
                +++ b/src/proc/asset/meta.cpp
                @@ -0,0 +1,33 @@
                +/*
                +  Meta(Asset)  -  key abstraction: metadata and organisational asset
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "proc/asset/meta.hpp"
                +
                +namespace asset
                +  {
                +  
                +  /** */
                +
                +
                +
                +} // namespace asset
                diff --git a/src/proc/asset/meta.hpp b/src/proc/asset/meta.hpp
                new file mode 100644
                index 000000000..4cbd3f9c1
                --- /dev/null
                +++ b/src/proc/asset/meta.hpp
                @@ -0,0 +1,46 @@
                +/*
                +  META.hpp  -  key abstraction: metadata and organisational asset
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +*/
                +
                +
                +#ifndef ASSET_META_H
                +#define ASSET_META_H
                +
                +#include "proc/asset.hpp"
                +
                +
                +
                +namespace asset
                +  {
                +
                +
                +  /**
                +   * key abstraction: metadata and organisational asset
                +   */
                +  class Meta : public proc_interface::Asset
                +    {
                +      
                +    };
                +    
                +    
                +    
                +} // namespace asset
                +#endif
                diff --git a/src/proc/asset/outport.cpp b/src/proc/asset/outport.cpp
                new file mode 100644
                index 000000000..50e993ec9
                --- /dev/null
                +++ b/src/proc/asset/outport.cpp
                @@ -0,0 +1,31 @@
                +/*
                +  OutPort  -  structural asset corresponding to some port generating media output
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "proc/asset/outport.hpp"
                +
                +namespace asset
                +  {
                +
                +
                +
                +} // namespace asset
                diff --git a/src/proc/asset/outport.hpp b/src/proc/asset/outport.hpp
                new file mode 100644
                index 000000000..e589a9f05
                --- /dev/null
                +++ b/src/proc/asset/outport.hpp
                @@ -0,0 +1,46 @@
                +/*
                +  OUTPORT.hpp  -  structural asset corresponding to some port generating media output
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +*/
                +
                +
                +#ifndef ASSET_OUTPORT_H
                +#define ASSET_OUTPORT_H
                +
                +#include "proc/asset/struct.hpp"
                +
                +
                +
                +namespace asset
                +  {
                +
                +
                +  /**
                +   * structural asset corresponding to some port generating media output
                +   */
                +  class OutPort : public Struct
                +    {
                +      
                +    };
                +    
                +    
                +    
                +} // namespace asset
                +#endif
                diff --git a/src/proc/asset/preview.cpp b/src/proc/asset/preview.cpp
                new file mode 100644
                index 000000000..85dc98596
                --- /dev/null
                +++ b/src/proc/asset/preview.cpp
                @@ -0,0 +1,31 @@
                +/*
                +  Preview(Asset) -  alternative version of the media data, probably with lower resolution
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "proc/asset/preview.hpp"
                +
                +namespace asset
                +  {
                +
                +
                +
                +} // namespace asset
                diff --git a/src/proc/asset/preview.hpp b/src/proc/asset/preview.hpp
                new file mode 100644
                index 000000000..cec3f6284
                --- /dev/null
                +++ b/src/proc/asset/preview.hpp
                @@ -0,0 +1,45 @@
                +/*
                +  PREVIEW.hpp  -  alternative version of the media data, probably with lower resolution
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +*/
                +
                +
                +#ifndef ASSET_PREVIEW_H
                +#define ASSET_PREVIEW_H
                +
                +#include "proc/asset/media.hpp"
                +
                +
                +
                +namespace asset
                +  {
                +
                +  /**
                +   * alternative version of the media data, probably with lower resolution
                +   */
                +  class Preview : public Media
                +    {
                +      
                +    };
                +    
                +    
                +    
                +} // namespace asset
                +#endif
                diff --git a/src/proc/asset/proc.cpp b/src/proc/asset/proc.cpp
                new file mode 100644
                index 000000000..b82ea49d7
                --- /dev/null
                +++ b/src/proc/asset/proc.cpp
                @@ -0,0 +1,33 @@
                +/*
                +  Proc(Asset)  -  key abstraction: media-like assets
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "proc/asset/proc.hpp"
                +
                +namespace asset
                +  {
                +  
                +  /** */
                +
                +
                +
                +} // namespace asset
                diff --git a/src/proc/asset/proc.hpp b/src/proc/asset/proc.hpp
                new file mode 100644
                index 000000000..003635b4f
                --- /dev/null
                +++ b/src/proc/asset/proc.hpp
                @@ -0,0 +1,46 @@
                +/*
                +  PROC.hpp  -  key abstraction: media-like assets
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +*/
                +
                +
                +#ifndef ASSET_PROC_H
                +#define ASSET_PROC_H
                +
                +#include "proc/asset.hpp"
                +
                +
                +
                +namespace asset
                +  {
                +
                +
                +  /**
                +   * key abstraction: data processing asset
                +   */
                +  class Proc : public Asset
                +    {
                +      
                +    };
                +    
                +    
                +    
                +} // namespace asset
                +#endif
                diff --git a/src/proc/asset/struct.cpp b/src/proc/asset/struct.cpp
                new file mode 100644
                index 000000000..18769f497
                --- /dev/null
                +++ b/src/proc/asset/struct.cpp
                @@ -0,0 +1,31 @@
                +/*
                +  Struct(Asset)  -  key abstraction: structural asset
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "proc/asset/struct.hpp"
                +
                +namespace asset
                +  {
                +
                +
                +
                +} // namespace asset
                diff --git a/src/proc/asset/struct.hpp b/src/proc/asset/struct.hpp
                new file mode 100644
                index 000000000..787c172dc
                --- /dev/null
                +++ b/src/proc/asset/struct.hpp
                @@ -0,0 +1,46 @@
                +/*
                +  STRUCT.hpp  -  key abstraction: structural asset
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +*/
                +
                +
                +#ifndef ASSET_STRUCT_H
                +#define ASSET_STRUCT_H
                +
                +#include "proc/asset.hpp"
                +
                +
                +
                +namespace asset
                +  {
                +
                +
                +  /**
                +   * key abstraction: structural asset
                +   */
                +  class Struct : public Asset
                +    {
                +      
                +    };
                +    
                +    
                +    
                +} // namespace asset
                +#endif
                diff --git a/src/proc/asset/track.cpp b/src/proc/asset/track.cpp
                new file mode 100644
                index 000000000..1f9a4f03a
                --- /dev/null
                +++ b/src/proc/asset/track.cpp
                @@ -0,0 +1,33 @@
                +/*
                +  Track  -  structural asset holding the configuration of a track in the EDL
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "proc/asset/track.hpp"
                +
                +namespace asset
                +  {
                +  
                +  /** */
                +
                +
                +
                +} // namespace asset
                diff --git a/src/proc/asset/track.hpp b/src/proc/asset/track.hpp
                new file mode 100644
                index 000000000..baece5d4e
                --- /dev/null
                +++ b/src/proc/asset/track.hpp
                @@ -0,0 +1,46 @@
                +/*
                +  TRACK.hpp  -  structural asset holding the configuration of a track in the EDL
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +*/
                +
                +
                +#ifndef ASSET_TRACK_H
                +#define ASSET_TRACK_H
                +
                +#include "proc/asset/struct.hpp"
                +
                +
                +
                +namespace asset
                +  {
                +
                +
                +  /**
                +   * Structural Asset holding the configuration of a track in the EDL
                +   */
                +  class Track : public Struct
                +    {
                +      
                +    };
                +    
                +    
                +    
                +} // namespace asset
                +#endif
                diff --git a/src/proc/asset/unknown.cpp b/src/proc/asset/unknown.cpp
                new file mode 100644
                index 000000000..8e4e558cd
                --- /dev/null
                +++ b/src/proc/asset/unknown.cpp
                @@ -0,0 +1,33 @@
                +/*
                +  Unknown  -  placeholder for unknown or unavailable media source
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "proc/asset/unknown.hpp"
                +
                +namespace asset
                +  {
                +  
                +  /** */
                +  
                +  
                +  
                +} // namespace asset
                diff --git a/src/proc/asset/unknown.hpp b/src/proc/asset/unknown.hpp
                new file mode 100644
                index 000000000..c75cbcab5
                --- /dev/null
                +++ b/src/proc/asset/unknown.hpp
                @@ -0,0 +1,47 @@
                +/*
                +  UNKNOWN.hpp  -  placeholder for unknown or unavailable media source
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +*/
                +
                +
                +#ifndef ASSET_UNKNOWN_H
                +#define ASSET_UNKNOWN_H
                +
                +#include "proc/asset/preview.hpp"
                +
                +
                +
                +namespace asset
                +  {
                +
                +
                +  /**
                +   * Placeholder Asset for unknown or unavailable media source.
                +   */
                +  class Unknown : public Preview
                +    {
                +      
                +    };
                +    
                +    
                +    
                +    
                +} // namespace asset
                +#endif
                diff --git a/src/proc/assetmanager.cpp b/src/proc/assetmanager.cpp
                new file mode 100644
                index 000000000..14fc7afff
                --- /dev/null
                +++ b/src/proc/assetmanager.cpp
                @@ -0,0 +1,70 @@
                +/*
                +  AssetManager  -  Facade for the Asset subsystem
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "proc/assetmanager.hpp"
                +
                +namespace proc_interface
                +  {
                +
                +
                +
                +  /**
                +   * registers an asset object in the internal DB, providing its unique key
                +   */
                +  long
                +  AssetManager::reg (string& name, string& category, string& org, uint version)  
                +    //throw(cinelerra::error::Invalid)
                +  {
                +  }
                +
                +
                +  /**
                +   * find and return corresponging object
                +   */
                +  template         ////TODO: does this work????
                +  KIND
                +  AssetManager::getAsset (long id)  ////throw(cinelerra::Invalid)
                +  {
                +  }
                +
                +
                +  /**
                +   * @return true if the given id is registered in the internal asset DB
                +   */
                +  bool
                +  AssetManager::known (long id)
                +  {
                +  }
                +
                +
                +  /**
                +   * remove the given asset together with all its dependants from the internal DB
                +   */
                +  void
                +  AssetManager::remove (long id)  /////throw(cinelerra::Invalid, cinelerra::State)
                +    {
                +    }
                +
                +
                +
                +} // namespace proc_interface
                diff --git a/src/proc/assetmanager.hpp b/src/proc/assetmanager.hpp
                new file mode 100644
                index 000000000..b85113bbb
                --- /dev/null
                +++ b/src/proc/assetmanager.hpp
                @@ -0,0 +1,67 @@
                +/*
                +  ASSETMANAGER.hpp  -  Facade for the Asset subsystem
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +*/
                +
                +
                +#ifndef PROC_INTERFACE_ASSETMANAGER_H
                +#define PROC_INTERFACE_ASSETMANAGER_H
                +
                +#include 
                +
                +#include "common/error.hpp"
                +
                +
                +using std::string;
                +
                +
                +namespace proc_interface
                +  {
                +
                +  /**
                +   * Facade for the Asset subsystem
                +   */
                +  class AssetManager
                +    {
                +      int bla;
                +    public:
                +      /** registers an asset object in the internal DB, providing its unique key
                +       */
                +      static long reg (string& name, string& category, string& org, uint version)
                +      ;
                +  //      throw(cinelerra::error::Invalid);
                +      
                +      /** find and return corresponging object */
                +      template
                +//      void*  /////////////////TODO
                +      KIND
                +      getAsset (long id)  ;///throw(cinelerra::error::Invalid);
                +      
                +      /** @return true if the given id is registered in the internal asset DB  */
                +      bool known (long id) ;
                +      
                +      /**remove the given asset from the internal DB.
                +       * together with all its dependants 
                +       */
                +      void remove (long id)  ;///throw(cinelerra::error::Invalid, cinelerra::error::State);
                +    };
                +
                +} // namespace proc_interface
                +#endif
                diff --git a/uml/cinelerra3/5.session b/uml/cinelerra3/5.session
                index e0bcf446f..b106f468a 100644
                --- a/uml/cinelerra3/5.session
                +++ b/uml/cinelerra3/5.session
                @@ -1,27 +1,14 @@
                 window_sizes 1140 783 270 860 584 120
                 diagrams
                   active  classdiagram_ref 130309 // Asset Kinds
                -    853 560 100 4 0 2
                +    860 584 100 4 0 0
                 end
                 show_stereotypes
                 selected 
                -  package_ref 129 // cinelerra3
                +package_ref 129 // cinelerra3
                 open
                   
                -  package_ref 129413 // common
                -  deploymentview_ref 128517 // gen
                -  artifact_ref 135941 // category
                -  artifact_ref 136453 // media
                -  artifact_ref 136581 // proc
                -  artifact_ref 136709 // struct
                -  artifact_ref 136965 // preview
                -  artifact_ref 137093 // unknown
                -  artifact_ref 137221 // effect
                -  artifact_ref 137605 // outport
                -  artifact_ref 137477 // track
                -  deploymentview_ref 128773 // gen
                -  
                -  package_ref 129797 // gui
                +package_ref 128005 // design
                   class_ref 136453 // Asset
                   class_ref 136581 // AssetManager
                   class_ref 136709 // Media
                
                From f86493e4661f99e8933fd50e696e8beac9803496 Mon Sep 17 00:00:00 2001
                From: Ichthyostega 
                Date: Sun, 2 Sep 2007 23:57:40 +0200
                Subject: [PATCH 7/8] SCons: run tests in bindir
                
                ---
                 tests/SConscript | 12 +++++++-----
                 1 file changed, 7 insertions(+), 5 deletions(-)
                
                diff --git a/tests/SConscript b/tests/SConscript
                index 63fd423ab..f2dd39dba 100644
                --- a/tests/SConscript
                +++ b/tests/SConscript
                @@ -19,7 +19,7 @@ def SingleTestExecutableSubdir(env,tree):
                     tree = env.subst(tree)  # expand Construction Vars
                     exeName = 'test-%s' % tree
                     objects = srcSubtree(env,tree)
                -    return env.Program(exeName, objects + corelib)
                +    return env.Program('#$BINDIR/'+exeName, objects + corelib)
                 
                 
                 def treatPluginTestcase(env):
                @@ -30,10 +30,10 @@ def treatPluginTestcase(env):
                     prfx = 'plugin/example_plugin'
                     oC   = env.SharedObject(prfx,        prfx+'.c')
                     oCPP = env.SharedObject(prfx+'_cpp', prfx+'.cpp')
                -    testplugin = ( env.SharedLibrary('.libs/example_plugin',     oC,   SHLIBPREFIX='')
                -                 + env.SharedLibrary('.libs/example_plugin_cpp', oCPP, SHLIBPREFIX='')
                +    testplugin = ( env.SharedLibrary('#$BINDIR/.libs/example_plugin',     oC,   SHLIBPREFIX='')
                +                 + env.SharedLibrary('#$BINDIR/.libs/example_plugin_cpp', oCPP, SHLIBPREFIX='')
                                  )
                -    testExe = env.Program('test-plugin', ['plugin/plugin_main.c'] + corelib)
                +    testExe = env.Program('#$BINDIR/test-plugin', ['plugin/plugin_main.c'] + corelib)
                     env.Depends(testExe, testplugin)
                     return testExe
                         #-- it depentds (at the moment) on a specific isolated test-plugin,
                @@ -67,8 +67,10 @@ artifacts['testsuite'] = ts = [ SingleTestExecutableSubdir(env, dir) for dir in
                 #
                 testEnv = env.Clone()
                 testEnv.Append(ENV = {'VALGRINDFLAGS' : 'DISABLE'})
                +testDir = env.Dir('#$BINDIR')
                +runTest = env.File("test.sh").abspath
                 
                -runTs = testEnv.Command(',testlog', ts, "./test.sh",  chdir=1)
                +runTs = testEnv.Command(',testlog', ts, runTest,  chdir=testDir)
                 
                 
                 
                
                From 1cadae2d75a35b52abe617e57745c6d8cbcd2fdc Mon Sep 17 00:00:00 2001
                From: Ichthyostega 
                Date: Mon, 3 Sep 2007 02:33:47 +0200
                Subject: [PATCH 8/8] TDBS (test driven brain storming) :-)
                
                ---
                 tests/50components.tests                      |  2 +-
                 tests/51asset.tests                           | 14 ++++
                 tests/52engine.tests                          |  6 ++
                 tests/53session.tests                         | 14 ++++
                 tests/54builder.tests                         |  6 ++
                 tests/55controller.tests                      |  6 ++
                 tests/58proc-operate.tests                    |  6 ++
                 .../components/proc/asset/createassettest.cpp | 63 ++++++++++++++++
                 .../components/proc/asset/deleteassettest.cpp | 67 +++++++++++++++++
                 .../proc/asset/dependantassetstest.cpp        | 65 +++++++++++++++++
                 tests/components/proc/asset/testclipasset.hpp | 58 +++++++++++++++
                 .../components/proc/engine/sourcenodetest.cpp | 62 ++++++++++++++++
                 .../proc/mobject/builder/buildsegmenttest.cpp | 67 +++++++++++++++++
                 .../mobject/controller/rendersegmenttest.cpp  | 73 +++++++++++++++++++
                 .../proc/mobject/session/addcliptest.cpp      | 68 +++++++++++++++++
                 .../proc/mobject/session/deletecliptest.cpp   | 68 +++++++++++++++++
                 .../mobject/session/rebuildfixturetest.cpp    | 69 ++++++++++++++++++
                 .../proc/mobject/session/testclip.hpp         | 60 +++++++++++++++
                 .../proc/mobject/session/testsession1.hpp     | 63 ++++++++++++++++
                 19 files changed, 836 insertions(+), 1 deletion(-)
                 create mode 100644 tests/51asset.tests
                 create mode 100644 tests/52engine.tests
                 create mode 100644 tests/53session.tests
                 create mode 100644 tests/54builder.tests
                 create mode 100644 tests/55controller.tests
                 create mode 100644 tests/58proc-operate.tests
                 create mode 100644 tests/components/proc/asset/createassettest.cpp
                 create mode 100644 tests/components/proc/asset/deleteassettest.cpp
                 create mode 100644 tests/components/proc/asset/dependantassetstest.cpp
                 create mode 100644 tests/components/proc/asset/testclipasset.hpp
                 create mode 100644 tests/components/proc/engine/sourcenodetest.cpp
                 create mode 100644 tests/components/proc/mobject/builder/buildsegmenttest.cpp
                 create mode 100644 tests/components/proc/mobject/controller/rendersegmenttest.cpp
                 create mode 100644 tests/components/proc/mobject/session/addcliptest.cpp
                 create mode 100644 tests/components/proc/mobject/session/deletecliptest.cpp
                 create mode 100644 tests/components/proc/mobject/session/rebuildfixturetest.cpp
                 create mode 100644 tests/components/proc/mobject/session/testclip.hpp
                 create mode 100644 tests/components/proc/mobject/session/testsession1.hpp
                
                diff --git a/tests/50components.tests b/tests/50components.tests
                index f0f2746c5..11afe390f 100644
                --- a/tests/50components.tests
                +++ b/tests/50components.tests
                @@ -1,4 +1,4 @@
                -TESTING "Component Test Suite: ALL" ./test-components
                +TESTING "Component Test Suite: common and basic components" ./test-components --group=common
                 
                 
                 
                diff --git a/tests/51asset.tests b/tests/51asset.tests
                new file mode 100644
                index 000000000..37b7dac4f
                --- /dev/null
                +++ b/tests/51asset.tests
                @@ -0,0 +1,14 @@
                +TESTING "Component Test Suite: Asset Manager" ./test-components --group=asset
                +
                +
                +
                +PLANNED "CreateAsset_test" CreateAsset_test <
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "common/test/run.hpp"
                +//#include "common/factory.hpp"
                +//#include "common/util.hpp"
                +
                +//#include 
                +#include 
                +
                +//using boost::format;
                +using std::string;
                +using std::cout;
                +
                +
                +namespace asset
                +  {
                +  namespace test
                +    {
                +    
                +    
                +    
                +    
                +    /***********************************************************************
                +     * @test creating new Assets and registering them with the AssetManager.
                +     * @see  proc_interface::AssetManager#reg
                +     */
                +    class CreateAsset_test : public Test
                +      {
                +        virtual void run(Arg arg) 
                +          {
                +          } 
                +      };
                +    
                +    
                +    /** Register this test class... */
                +    LAUNCHER (CreateAsset_test, "unit asset");
                +    
                +    
                +    
                +  } // namespace test
                +
                +} // namespace asset
                diff --git a/tests/components/proc/asset/deleteassettest.cpp b/tests/components/proc/asset/deleteassettest.cpp
                new file mode 100644
                index 000000000..f7d8d5e9b
                --- /dev/null
                +++ b/tests/components/proc/asset/deleteassettest.cpp
                @@ -0,0 +1,67 @@
                +/*
                +  DeleteAsset(Test)  -  deleting and Asset with all dependencies
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "common/test/run.hpp"
                +//#include "common/factory.hpp"
                +//#include "common/util.hpp"
                +
                +//#include 
                +#include 
                +
                +//using boost::format;
                +using std::string;
                +using std::cout;
                +
                +
                +namespace asset
                +  {
                +  namespace test
                +    {
                +    
                +    
                +    
                +    
                +    /*******************************************************************
                +     * @test deleting an Asset includes removing all dependant Assets
                +     *       and all MObjects relying on these. Especially this means
                +     *       breaking all links between the involved Objects, so the
                +     *       shared-ptrs can do the actual cleanup.
                +     * @see  asset::Asset#unlink
                +     * @see  mobject::MObject#unlink
                +     */
                +    class DeleteAsset_test : public Test
                +      {
                +        virtual void run(Arg arg) 
                +          {
                +          } 
                +      };
                +    
                +    
                +    /** Register this test class... */
                +    LAUNCHER (DeleteAsset_test, "function asset");
                +    
                +    
                +    
                +  } // namespace test
                +
                +} // namespace asset
                diff --git a/tests/components/proc/asset/dependantassetstest.cpp b/tests/components/proc/asset/dependantassetstest.cpp
                new file mode 100644
                index 000000000..648f2defd
                --- /dev/null
                +++ b/tests/components/proc/asset/dependantassetstest.cpp
                @@ -0,0 +1,65 @@
                +/*
                +  DependantAssets(Test)  -  unittest for the object creating factory
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "common/test/run.hpp"
                +//#include "common/factory.hpp"
                +//#include "common/util.hpp"
                +
                +//#include 
                +#include 
                +
                +//using boost::format;
                +using std::string;
                +using std::cout;
                +
                +
                +namespace asset
                +  {
                +  namespace test
                +    {
                +    
                +    
                +    
                +    
                +    /*******************************************************************
                +     * @test the handling of Assets dependant on other Assets and the
                +     *       enabling/disabling of Assets.
                +     * @see  asset::Asset
                +     * @see  asset::Clip
                +     */
                +    class DependantAssets_test : public Test
                +      {
                +        virtual void run(Arg arg) 
                +          {
                +          } 
                +      };
                +    
                +    
                +    /** Register this test class... */
                +    LAUNCHER (DependantAssets_test, "unit function asset");
                +    
                +    
                +    
                +  } // namespace test
                +
                +} // namespace asset
                diff --git a/tests/components/proc/asset/testclipasset.hpp b/tests/components/proc/asset/testclipasset.hpp
                new file mode 100644
                index 000000000..3a06d1ba8
                --- /dev/null
                +++ b/tests/components/proc/asset/testclipasset.hpp
                @@ -0,0 +1,58 @@
                +/*
                +  TESTCLIPASSET.hpp  -  test Media-Asset (clip) for checking Assets and MObjects
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +*/
                +
                +
                +#ifndef ASSET_TESTCLIPASSET_H
                +#define ASSET_TESTCLIPASSET_H
                +
                +
                +#include "common/test/run.hpp"
                +//#include "common/factory.hpp"
                +//#include "common/util.hpp"
                +
                +//#include 
                +#include 
                +
                +//using boost::format;
                +using std::string;
                +using std::cout;
                +
                +
                +namespace asset
                +  {
                +  /**
                +   * An asset::Media instance Test Clip for checking
                +   * various Asset operations and for creating 
                +   * dependent Clip-MObjects.
                +   * 
                +   */
                +  class TestClipAsset
                +    {
                +    public:
                +    };
                +    
                +    
                +    
                +    
                +
                +} // namespace asset
                +#endif
                diff --git a/tests/components/proc/engine/sourcenodetest.cpp b/tests/components/proc/engine/sourcenodetest.cpp
                new file mode 100644
                index 000000000..e7fab2279
                --- /dev/null
                +++ b/tests/components/proc/engine/sourcenodetest.cpp
                @@ -0,0 +1,62 @@
                +/*
                +  SourceNode(Test)  -  unit test of the source readering render node
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "common/test/run.hpp"
                +//#include "common/factory.hpp"
                +//#include "common/util.hpp"
                +
                +//#include 
                +#include 
                +
                +//using boost::format;
                +using std::string;
                +using std::cout;
                +
                +
                +namespace engine
                +  {
                +  namespace test
                +    {
                +    
                +    
                +    
                +    
                +    /*******************************************************************
                +     * @test the source reading render node.
                +     */
                +    class SourceNode_test : public Test
                +      {
                +        virtual void run(Arg arg) 
                +          {
                +          } 
                +      };
                +    
                +    
                +    /** Register this test class... */
                +    LAUNCHER (SourceNode_test, "unit engine");
                +    
                +    
                +    
                +  } // namespace test
                +
                +} // namespace engine
                diff --git a/tests/components/proc/mobject/builder/buildsegmenttest.cpp b/tests/components/proc/mobject/builder/buildsegmenttest.cpp
                new file mode 100644
                index 000000000..800cb4558
                --- /dev/null
                +++ b/tests/components/proc/mobject/builder/buildsegmenttest.cpp
                @@ -0,0 +1,67 @@
                +/*
                +  BuildSegment(Test)  -  building the render-tree for a segment of the EDL
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "common/test/run.hpp"
                +//#include "common/factory.hpp"
                +//#include "common/util.hpp"
                +
                +//#include 
                +#include 
                +
                +//using boost::format;
                +using std::string;
                +using std::cout;
                +
                +
                +namespace mobject
                +  {
                +  namespace builder
                +    {
                +    namespace test
                +      {
                +      
                +      
                +      
                +      
                +      /*******************************************************************
                +       * @test the builder core functionality: create a render pipeline
                +       *       for a given segment of the EDL.
                +       */
                +      class BuildSegment_test : public Test
                +        {
                +          virtual void run(Arg arg) 
                +            {
                +            } 
                +        };
                +      
                +      
                +      /** Register this test class... */
                +      LAUNCHER (BuildSegment_test, "function builder");
                +      
                +      
                +      
                +    } // namespace test
                +    
                +  } // namespace builder
                +
                +} // namespace mobject
                diff --git a/tests/components/proc/mobject/controller/rendersegmenttest.cpp b/tests/components/proc/mobject/controller/rendersegmenttest.cpp
                new file mode 100644
                index 000000000..5ef4064f1
                --- /dev/null
                +++ b/tests/components/proc/mobject/controller/rendersegmenttest.cpp
                @@ -0,0 +1,73 @@
                +/*
                +  RenderSegment(Test)  -  Proc-Layer Integrationtest
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "common/test/run.hpp"
                +//#include "common/factory.hpp"
                +//#include "common/util.hpp"
                +
                +//#include 
                +#include 
                +
                +//using boost::format;
                +using std::string;
                +using std::cout;
                +
                +
                +namespace mobject
                +  {
                +  namespace controller
                +    {
                +    namespace test
                +      {
                +      
                +      
                +      
                +      
                +      /*******************************************************************
                +       * @test create a render process from a given segment of the EDL.
                +       *       Basically this includes cooperation of all parts of the
                +       *       Cinelerra Proc Layer. For a prepared test-EDL we invoke the
                +       *       controller to create a render process. This includes building
                +       *       the render pipeline. Finally, we analyze all the created 
                +       *       Structures. 
                +       * @note this test doesn't cover the actual rendering.
                +       * @see  proc_interface::ControllerFacade
                +       */
                +      class RenderSegment_test : public Test
                +        {
                +          virtual void run(Arg arg) 
                +            {
                +            } 
                +        };
                +      
                +      
                +      /** Register this test class... */
                +      LAUNCHER (RenderSegment_test, "function operate");
                +      
                +      
                +      
                +    } // namespace test
                +    
                +  } // namespace controller
                +
                +} // namespace mobject
                diff --git a/tests/components/proc/mobject/session/addcliptest.cpp b/tests/components/proc/mobject/session/addcliptest.cpp
                new file mode 100644
                index 000000000..f6cc5def1
                --- /dev/null
                +++ b/tests/components/proc/mobject/session/addcliptest.cpp
                @@ -0,0 +1,68 @@
                +/*
                +  AddClip(Test)  -  adding an Clip-MObject to the EDL/Session
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "common/test/run.hpp"
                +//#include "common/factory.hpp"
                +//#include "common/util.hpp"
                +
                +//#include 
                +#include 
                +
                +//using boost::format;
                +using std::string;
                +using std::cout;
                +
                +
                +namespace mobject
                +  {
                +  namespace session
                +    {
                +    namespace test
                +      {
                +      
                +      
                +      
                +      
                +      /*******************************************************************
                +       * @test adding an test clip to the EDL/Session.
                +       * @see  mobject::session::Clip
                +       * @see  mobject::session::EDL
                +       */
                +      class AddClip_test : public Test
                +        {
                +          virtual void run(Arg arg) 
                +            {
                +            } 
                +        };
                +      
                +      
                +      /** Register this test class... */
                +      LAUNCHER (AddClip_test, "unit session");
                +      
                +      
                +      
                +    } // namespace test
                +  
                +  } // namespace session
                +
                +} // namespace mobject
                diff --git a/tests/components/proc/mobject/session/deletecliptest.cpp b/tests/components/proc/mobject/session/deletecliptest.cpp
                new file mode 100644
                index 000000000..4a5c01567
                --- /dev/null
                +++ b/tests/components/proc/mobject/session/deletecliptest.cpp
                @@ -0,0 +1,68 @@
                +/*
                +  DeleteClip(Test)  -  removing an Clip-MObject from the Session
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "common/test/run.hpp"
                +//#include "common/factory.hpp"
                +//#include "common/util.hpp"
                +
                +//#include 
                +#include 
                +
                +//using boost::format;
                +using std::string;
                +using std::cout;
                +
                +
                +namespace mobject
                +  {
                +  namespace session
                +    {
                +    namespace test
                +      {
                +      
                +      
                +      
                +      
                +      /*******************************************************************
                +       * @test removing a test clip from the EDL.
                +       * @see  mobject::session::Clip
                +       * @see  mobject::session::EDL
                +       */
                +      class DeleteClip_test : public Test
                +        {
                +          virtual void run(Arg arg) 
                +            {
                +            } 
                +        };
                +      
                +      
                +      /** Register this test class... */
                +      LAUNCHER (DeleteClip_test, "function session");
                +      
                +      
                +      
                +    } // namespace test
                +  
                +  } // namespace session
                +
                +} // namespace mobject
                diff --git a/tests/components/proc/mobject/session/rebuildfixturetest.cpp b/tests/components/proc/mobject/session/rebuildfixturetest.cpp
                new file mode 100644
                index 000000000..01ad76b34
                --- /dev/null
                +++ b/tests/components/proc/mobject/session/rebuildfixturetest.cpp
                @@ -0,0 +1,69 @@
                +/*
                +  RebuildFixture(Test)  -  (re)building the explicit placements
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +* *****************************************************/
                +
                +
                +#include "common/test/run.hpp"
                +//#include "common/factory.hpp"
                +//#include "common/util.hpp"
                +
                +//#include 
                +#include 
                +
                +//using boost::format;
                +using std::string;
                +using std::cout;
                +
                +
                +namespace mobject
                +  {
                +  namespace session
                +    {
                +    namespace test
                +      {
                +      
                +      
                +      
                +      
                +      /*******************************************************************
                +       * @test (re)building the ExplicitPlacement objects from the objects
                +       *       placed into the Session/EDL.
                +       * @see  mobject::session::Fixture
                +       * @see  mobject::ExplicitPlacement
                +       */
                +      class RebuildFixture_test : public Test
                +        {
                +          virtual void run(Arg arg) 
                +            {
                +            } 
                +        };
                +      
                +      
                +      /** Register this test class... */
                +      LAUNCHER (RebuildFixture_test, "unit session");
                +      
                +      
                +      
                +    } // namespace test
                +  
                +  } // namespace session
                +
                +} // namespace mobject
                diff --git a/tests/components/proc/mobject/session/testclip.hpp b/tests/components/proc/mobject/session/testclip.hpp
                new file mode 100644
                index 000000000..ec9ec8715
                --- /dev/null
                +++ b/tests/components/proc/mobject/session/testclip.hpp
                @@ -0,0 +1,60 @@
                +/*
                +  TESTCLIP.hpp  -  test clip (stub) for checking EDL/Session functionality
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +*/
                +
                +
                +#ifndef MOBJECT_SESSION_TESTCLIP_H
                +#define MOBJECT_SESSION_TESTCLIP_H
                +
                +
                +#include "common/test/run.hpp"
                +//#include "common/factory.hpp"
                +//#include "common/util.hpp"
                +
                +//#include 
                +#include 
                +
                +//using boost::format;
                +using std::string;
                +using std::cout;
                +
                +
                +namespace mobject
                +  {
                +  namespace session
                +    {
                +    /**
                +     * Sample or Test Clip for checking
                +     * various EDL, session and builder operations.
                +     * 
                +     */
                +    class TestClip
                +      {
                +      public:
                +      };
                +    
                +    
                +    
                +    
                +  } // namespace session
                +
                +} // namespace mobject
                +#endif
                diff --git a/tests/components/proc/mobject/session/testsession1.hpp b/tests/components/proc/mobject/session/testsession1.hpp
                new file mode 100644
                index 000000000..5426047be
                --- /dev/null
                +++ b/tests/components/proc/mobject/session/testsession1.hpp
                @@ -0,0 +1,63 @@
                +/*
                +  TESTSESSION1.hpp  -  complete session configuration use for various tests
                + 
                +  Copyright (C)         CinelerraCV
                +    2007,               Christian Thaeter 
                + 
                +  This program is free software; you can redistribute it and/or
                +  modify it under the terms of the GNU General Public License as
                +  published by the Free Software Foundation; either version 2 of the
                +  License, or (at your option) any later version.
                + 
                +  This program is distributed in the hope that it will be useful,
                +  but WITHOUT ANY WARRANTY; without even the implied warranty of
                +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                +  GNU General Public License for more details.
                + 
                +  You should have received a copy of the GNU General Public License
                +  along with this program; if not, write to the Free Software
                +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                + 
                +*/
                +
                +
                +#ifndef MOBJECT_SESSION_TESTCLIP_H
                +#define MOBJECT_SESSION_TESTCLIP_H
                +
                +
                +#include "proc/mobject/session/session.hpp"
                +#include "common/error.hpp"
                +//#include "common/factory.hpp"
                +//#include "common/util.hpp"
                +
                +//#include 
                +#include 
                +
                +//using boost::format;
                +using std::string;
                +using std::cout;
                +
                +
                +namespace mobject
                +  {
                +  namespace session
                +    {
                +    typedef std::auto_ptr PSession;  /////TODO
                +    
                +    /**
                +     * Create a Test Session configuration usable for various Tests.
                +     * This Session holds two Clips and corresponds to "Example1"
                +     * in the UML design.
                +     */
                +    PSession Testsession1 ()
                +      {
                +        UNIMPLEMENTED ("Test-Session 1");
                +      };
                +    
                +    
                +    
                +    
                +  } // namespace session
                +
                +} // namespace mobject
                +#endif