From 5d54cfc89edcc1d1c8b5a093504fb9ee0c6a81e9 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Thu, 20 Sep 2007 05:36:08 +0200 Subject: [PATCH 01/14] planning next implementation steps --- tests/51asset.tests | 8 ++ .../proc/asset/compoundmediatest.cpp | 103 ++++++++++++++++++ .../proc/asset/mediastructurequerytest.cpp | 68 ++++++++++++ uml/cinelerra3/128133 | 35 +++++- uml/cinelerra3/130309.diagram | 54 ++++++--- uml/cinelerra3/130437.diagram | 17 ++- uml/cinelerra3/5.session | 22 ++-- wiki/renderengine.html | 18 ++- 8 files changed, 290 insertions(+), 35 deletions(-) create mode 100644 tests/components/proc/asset/compoundmediatest.cpp create mode 100644 tests/components/proc/asset/mediastructurequerytest.cpp diff --git a/tests/51asset.tests b/tests/51asset.tests index 9bc0186fd..f13edb706 100644 --- a/tests/51asset.tests +++ b/tests/51asset.tests @@ -16,6 +16,10 @@ return: 0 END +PLANNED "CompoundMedia_test" CompoundMedia_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/util.hpp" + +#include "proc/assetmanager.hpp" +#include "proc/asset/media.hpp" +#include "proc/asset/proc.hpp" + +#include "proc/asset/assetdiagnostics.hpp" + +using util::isnil; +using std::string; + + +namespace asset + { + namespace test + { + + + + + /*********************************************************************** + * Verifying the special operations available for compound media assets + * comprised of several elementary media assets. + */ + class CompoundMedia_test : public Test + { + virtual void run(Arg arg) + { + buildCompound(); + modifyCompound(); + verifyClipStructure(); + + if (!isnil (arg)) + dumpAssetManager(); + TRACE (assetmem, "leaving CreateAsset_test::run()"); + } + + + + typedef shared_ptr PM; + + /** @test building a compound media asset by using a special + * factory, normally intended for loading existing sessions. + */ + void buildCompound() + { + } + + /** @test adding and removing elementary media. + */ + void modifyCompound() + { + } + + + /** @test create a (compound) clip from some compound media asset + * and verify the clip mirrors the media asset's structure + */ + void verifyClipStructure() + { + } + + + bool checkProperties (PM object, Asset::Ident identity, string filename) + { + return identity == object->ident + && filename == object->getFilename(); + } + }; + + + /** Register this test class... */ + LAUNCHER (CompoundMedia_test, "unit asset"); + + + + } // namespace test + +} // namespace asset diff --git a/tests/components/proc/asset/mediastructurequerytest.cpp b/tests/components/proc/asset/mediastructurequerytest.cpp new file mode 100644 index 000000000..19a352806 --- /dev/null +++ b/tests/components/proc/asset/mediastructurequerytest.cpp @@ -0,0 +1,68 @@ +/* + MediaStructureQuery(Test) - check functionallity used for creating media 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 "common/test/run.hpp" +#include "common/util.hpp" + +#include "proc/assetmanager.hpp" +#include "proc/asset/media.hpp" +#include "proc/asset/proc.hpp" + +#include "proc/asset/assetdiagnostics.hpp" + +using util::isnil; +using std::string; + + +namespace asset + { + namespace test + { + + + + + /*********************************************************************** + * This test documents the Interface used by MediaFactory when loading + * media files for querying cinelerra's backend layer for information + * on how the media file is structured. + */ + class MediaStructureQuery_test : public Test + { + virtual void run(Arg arg) + { + UNIMPLEMENTED ("querying media file structure from backend"); + } + + + }; + + + /** Register this test class... */ + LAUNCHER (MediaStructureQuery_test, "unit asset"); + + + + } // namespace test + +} // namespace asset diff --git a/uml/cinelerra3/128133 b/uml/cinelerra3/128133 index 61a7035be..dd7cd31ca 100644 --- a/uml/cinelerra3/128133 +++ b/uml/cinelerra3/128133 @@ -1,6 +1,6 @@ format 40 "Asset" // ProcessingLayer::Asset - revision 6 + revision 7 modified_by 5 "hiv" // class settings //class diagram settings @@ -356,6 +356,39 @@ ${inlines} end end + class 138501 "CompoundMedia" + visibility public + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + comment "compound of several elementary media tracks, +e.g. the individual media streams found in one media file" + classrelation 142213 // + relation 140421 ---|> + a public + cpp default "${type}" + classrelation_ref 142213 // + b multiplicity "" parent class_ref 136709 // Media + end + + classrelation 142341 // tracks () + relation 140549 o--> + stereotype "vector" + a role_name "tracks" multiplicity "1..*" protected + comment "elementary media assets comprising this compound" + cpp default " ${comment}${static}${mutable}${volatile}${const}${stereotype}<${type} *> ${name}${value}; +" + classrelation_ref 142341 // tracks () + b multiplicity "*" parent class_ref 136709 // Media + end + end + class 136837 "Proc" visibility public cpp_decl "${comment}${template}class ${name}${inherit} diff --git a/uml/cinelerra3/130309.diagram b/uml/cinelerra3/130309.diagram index cf03630ad..d97905e09 100644 --- a/uml/cinelerra3/130309.diagram +++ b/uml/cinelerra3/130309.diagram @@ -10,22 +10,22 @@ classcanvas 128133 class_ref 136581 // AssetManager end packagecanvas 128517 package_ref 128133 // Asset - show_context_mode namespace xyzwh 217 182 1994 575 534 + show_context_mode namespace xyzwh 217 182 1994 608 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 + xyz 503 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 + xyz 655 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 + xyz 761 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 @@ -33,40 +33,44 @@ classcanvas 130821 class_ref 137221 // Category 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 + xyz 319 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 + xyz 382 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 + xyz 387 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 + xyz 477 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 + xyz 538 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 + xyz 615 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 + xyz 678 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 + xyz 757 445 2000 end classcanvas 133253 class_ref 138373 // DB 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 486 233 2000 end +classcanvas 133765 class_ref 138501 // CompoundMedia + 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 245 529 2005 + end relationcanvas 129157 relation_ref 138117 // geometry VHV from ref 128645 z 1999 to point 293 315 @@ -76,21 +80,21 @@ relationcanvas 129157 relation_ref 138117 // no_multiplicity_a no_multiplicity_b relationcanvas 129285 relation_ref 138245 // geometry VHV - from ref 128773 z 1999 to point 448 315 + from ref 128773 z 1999 to point 523 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 + from ref 128901 z 1999 to point 675 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 + from ref 129029 z 1999 to point 781 315 line 130565 z 1999 to point 138 315 line 130693 z 1999 to ref 128005 no_role_a no_role_b @@ -100,11 +104,17 @@ relationcanvas 130949 relation_ref 138629 // 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 + geometry VHV + from ref 131077 z 1999 to point 339 415 + line 134277 z 1999 to point 293 415 + line 134405 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 + geometry VHV + from ref 131461 z 2004 to point 411 415 + line 134021 z 2004 to point 293 415 + line 134149 z 2004 to ref 128645 no_role_a no_role_b no_multiplicity_a no_multiplicity_b relationcanvas 131845 relation_ref 139141 // @@ -137,6 +147,16 @@ relationcanvas 133381 relation_ref 140293 // line 133637 z 1999 to ref 133253 role_a_pos 518 208 3000 no_role_b multiplicity_a_pos 492 208 3000 multiplicity_b_pos 386 104 3000 +relationcanvas 134533 relation_ref 140421 // + from ref 133765 z 2004 to ref 128645 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 134917 relation_ref 140549 // + from ref 133765 z 2004 stereotype "<>" xyz 229 493 3000 to point 225 545 + line 135301 z 2004 to point 225 365 + line 135173 z 2004 to ref 128645 + role_a_pos 230 378 3000 no_role_b + multiplicity_a_pos 231 348 3000 multiplicity_b_pos 230 556 3000 line 128261 -_-_ geometry HV from ref 128005 z 1999 to point 331 150 line 128389 z 1999 to ref 128133 diff --git a/uml/cinelerra3/130437.diagram b/uml/cinelerra3/130437.diagram index c10d368c7..505e607ea 100644 --- a/uml/cinelerra3/130437.diagram +++ b/uml/cinelerra3/130437.diagram @@ -60,10 +60,14 @@ packagecanvas 135685 package_ref 128261 // MObject xyzwh 24 10 1994 185 313 packagecanvas 135813 - package_ref 128133 // AssetManager - xyzwh 454 10 1994 198 292 + package_ref 128133 // Asset + xyzwh 454 10 1994 276 313 note 136837 "the Builder implements each Clip by a source node and maybe some codec" xyzwh 53 376 2000 219 61 +classcanvas 137221 class_ref 138501 // CompoundMedia + 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 606 148 3005 + end relationcanvas 128517 relation_ref 139141 // from ref 128261 z 1999 to ref 128389 no_role_a no_role_b @@ -142,6 +146,15 @@ relationcanvas 136965 relation_ref 140165 // 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 +relationcanvas 137349 relation_ref 140421 // + from ref 137221 z 1999 to ref 128133 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 137477 relation_ref 140549 // + from ref 137221 z 1999 to point 654 68 + line 137733 z 1999 stereotype "<>" xyz 662 113 3000 to ref 128133 + role_a_pos 602 48 3000 no_role_b + multiplicity_a_pos 605 72 3000 multiplicity_b_pos 642 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 d275c7caf..cd8358b51 100644 --- a/uml/cinelerra3/5.session +++ b/uml/cinelerra3/5.session @@ -1,34 +1,28 @@ window_sizes 1140 783 270 860 633 71 diagrams classdiagram_ref 130309 // Asset Kinds - 860 607 100 4 0 0 - classdiagram_ref 130437 // Media-Asset Relations - 688 506 100 4 0 0 + 860 607 100 4 120 0 + active classdiagram_ref 130437 // Media-Asset Relations + 817 506 100 4 0 0 classdiagram_ref 128133 // Session structure 688 506 100 4 60 0 classdiagram_ref 128389 // Render Entities 688 506 100 4 120 0 - objectdiagram_ref 128901 // EDL Example2 - 688 506 100 4 132 0 - objectdiagram_ref 128773 // EDL Example1 - 688 506 100 4 0 0 - active objectdiagram_ref 129029 // Engine Example1 - 860 633 100 4 28 0 end show_stereotypes -selected objectdiagram_ref 129029 // Engine Example1 +selected classdiagram_ref 130437 // Media-Asset Relations open -package_ref 128005 // design + package_ref 128005 // design class_ref 136453 // Asset operation_ref 133125 // getID operation_ref 132357 // reg class_ref 136709 // Media + class_ref 138501 // CompoundMedia class_ref 137349 // Clip - class_ref 138501 // SpecialWish + classview_ref 128005 // Session -package_ref 128389 // RenderEngine - usecaseview_ref 128005 // Renderengine Use + package_ref 128389 // RenderEngine class_ref 135685 // Logic class_ref 135813 // Config class_ref 135941 // State diff --git a/wiki/renderengine.html b/wiki/renderengine.html index 67e3684f6..ff051b54d 100644 --- a/wiki/renderengine.html +++ b/wiki/renderengine.html @@ -558,6 +558,9 @@ is how to implement the relationship between [[MObject]]s and Assets. Do we use For every Asset we generate a __Ident tuple__ and a long ID (hash) derived from this Ident tuple. The constructor of the abstract base class {{{Asset}}} takes care of this step and automatically registeres the new Asset object with the AssetManager. Typically, the factory methods for concrete Asset classes provide some shortcuts providing sensible default values for some of the Ident tuple data fields. They may take additional parameters &mdash; for example the factory method for creating {{{asset::Media}}} takes a filename (and may at some point in the future aply "magic" based on examination of the file) +
+
The Asset Manager provides an Interface to some internal Database holding all Assets in the current Session and System state. It may be a real Database at some point (and for the moment it's a Hashtable). Each [[Asset]] is registered automatically with the Asset Manager; it can be queried either by it's //identification tuple// or by it's unique ID.
+
Automation is treated as a function over time. It is always tied to a specific Parameter (which can thus be variable over the course of the timeline). All details //how// this function is defined are completely abstracted away. The Parameter uses a ParamProvider to get the value for a given Time (point). Typically, this will use linear or bezier interpolation over a set of keyframes internally. Parameters can be configured to have different value ranges and distribution types (on-off, stepped, continuous, bounded)
 
@@ -948,13 +951,14 @@ For this Cinelerra3 design, we could consider making GOP just another raw media
 &rarr;see in [[Wikipedia|http://en.wikipedia.org/wiki/Group_of_pictures]]
 
-
+
This wiki page is the entry point to detail notes covering some technical decisions, details and problems encountered in the course of the implementation of the Cinelerra Renderengine, the Builder and the related parts.
 
 * [[Packages, Interfaces and Namespaces|InterfaceNamespaces]]
 * [[Memory Management Issues|MemoryManagement]]
 * [[Creating and registering Assets|AssetCreation]]
 * [[Creating new Objects|ObjectCreation]]
+* [[Multichannel Media|MultichannelMedia]]
 
 
@@ -1387,6 +1391,18 @@ For the case in question this seems to be the ''resource allocation is construct And, last but not least, doing all actual allocations is the job of the backend. Exceptions being long-lived objects, like the Session or the EDL, which are created once and don't bear the danger of causing memory pressure. Besides that, the ProcLayer code shouldn't issue "new" and "delete", rather it should use some central [[Factories]] for all allocation and freeing, so we can redirect these calls down to the backend, which may use pooling or special placement allocators or the like. The rationale is, for modern hardware/architectures, care has to be taken with heap allocations, esp. with many small objects and irregular usage patterns.
+
+
Based on practical experiences, Ichthyo tends to consider Multichannel Media as the base case, while counting media files providing just one single media stream as exotic corner cases. This may seem counter intuitive at first sight; you should think of  it as an attempt to avoid right from start some of the common shortcomings found in many video editors, especially
+* having to deal with keeping a "link" between audio and video clips
+* silly limitations on the supported audio setups (e.g. mono, stereo and 5.1)
+* unnecessary complexity when dealing with more realistic setups, esp. when dealing with dialogue scenes
+* inability to edit stereoscopic (3D) video in a natural fashion
+
+!Compound Media
+Basically, each [[media asset|MediaAsset]] is considered to be a compound of several elementary media (tracks), possibly of various different media kinds. Adding support for placeholders (''proxy clips'') at some point in future will add still more complexity (because then there will be even dependencies between some of these elementary media). We try to keep the structural limitations necessary to be able to handle, edit and render compound media to the bare minimum. This is only possible, if we try to configure as much as possible already at the "asset level" and make the rest of the proc layer behave just according to the configuration given with each asset.
+
+So, when creating a clip out of such a compound media asset, the clip has to be a compound of elementary clips mirroring the given media asset's structure. Besides, it should be possible to //detach// and //attach// elementary clips from a compound clip. On the other hand, the [[Fixture]] created from the current state of the [[EDL]] is explicit to a great extent. So, in the Fixture we deal only with elementary clips placed to absolute positions, and thus the builder will see only simple non-compound clips and translate them into the corresponding source reading nodes.
+
We have to consider carefully how to handle the Creation of new class instances. Because, when done naively, it can defeat all efforts of separating subsystems, or &mdash; the other extreme &mdash; lead to a //switch-on-typeID//  programming style. We strive at a solution somewhere in the middle by utilizing __Abstract Factories__ on Interface or key abstraction classes, but providing specialized overloads for the different use cases. So in each use case we have to decide if we want to create a representant of some general concept (Interface), or if we have a direct colaboration and thus need the Factory to provide
 a more specific sub-Interface or even a concrete type.

From 91a4835f6a229c2c2835a158cf3623cac22ee32d Mon Sep 17 00:00:00 2001
From: Ichthyostega 
Date: Thu, 20 Sep 2007 15:42:26 +0200
Subject: [PATCH 02/14] planning the handling of multichannel media/clips

---
 uml/cinelerra3/128133         | 63 ++++++++++++++++++++++++++++++++++-
 uml/cinelerra3/128133.diagram |  8 +++++
 uml/cinelerra3/128261         | 35 +++++++++++++++----
 uml/cinelerra3/130309.diagram | 33 +++++++++++++-----
 uml/cinelerra3/130437.diagram | 63 ++++++++++++++++++++++++-----------
 uml/cinelerra3/5.session      | 12 +++----
 wiki/renderengine.html        | 14 ++++++--
 7 files changed, 183 insertions(+), 45 deletions(-)

diff --git a/uml/cinelerra3/128133 b/uml/cinelerra3/128133
index dd7cd31ca..c192cb0d7 100644
--- a/uml/cinelerra3/128133
+++ b/uml/cinelerra3/128133
@@ -1,6 +1,6 @@
 format 40
 "Asset" // ProcessingLayer::Asset
-  revision 7
+  revision 8
   modified_by 5 "hiv"
   // class settings
   //class diagram settings
@@ -354,6 +354,46 @@ ${inlines}
 	    classrelation_ref 139909 // 
 	  b multiplicity "" parent class_ref 136453 // Asset
       end
+
+      operation 133253 "createClip"
+	public return_type class_ref 128901 // Clip
+	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 "create a (possibly compound) Clip refering to this media, ready to be added to the EDL."
+      end
+
+      operation 133381 "howtoProc"
+	public return_type class_ref 138757 // ProcPatt
+	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 "@return descriptor how to build a render pipeline corresponding to this media"
+      end
+
+      classrelation 143237 // 
+	relation 141317 -_->
+	  a default
+	    cpp default "Generated"
+	    classrelation_ref 143237 // 
+	  b multiplicity "" parent class_ref 138757 // ProcPatt
+      end
     end
 
     class 138501 "CompoundMedia"
@@ -496,6 +536,7 @@ ${inlines}
 	  b multiplicity "*" parent class_ref 136709 // Media
 	  association_type class_ref 136709 // Media
       end
+
     end
 
     class 137477 "Unknown"
@@ -624,6 +665,26 @@ ${inlines}
       end
     end
 
+    class 138757 "ProcPatt"
+      visibility package 
+      cpp_decl "${comment}${template}class ${name}${inherit}
+  {
+${members}  };
+${inlines}
+"
+      java_decl ""
+      idl_decl ""
+      explicit_switch_type ""
+      
+      classrelation 143109 // 
+	relation 141189 ---|>
+	  a public
+	    cpp default "${type}"
+	    classrelation_ref 143109 // 
+	  b multiplicity "" parent class_ref 136965 // Struct
+      end
+    end
+
     class 138245 "Dataset"
       visibility package 
       cpp_decl "${comment}${template}class ${name}${inherit}
diff --git a/uml/cinelerra3/128133.diagram b/uml/cinelerra3/128133.diagram
index 32bf1532d..037598822 100644
--- a/uml/cinelerra3/128133.diagram
+++ b/uml/cinelerra3/128133.diagram
@@ -90,6 +90,10 @@ classcanvas 138629 class_ref 135173 // Segment
   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 417 678 2000
   end
+classcanvas 139013 class_ref 138629 // CompoundClip
+  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 266 466 2000
+  end
 relationcanvas 128389 relation_ref 128005 // 
   from ref 128005 z 1999 stereotype "<>" xyz 139 626 3000 to ref 128133
   role_a_pos 201 603 3000 no_role_b
@@ -202,4 +206,8 @@ relationcanvas 138757 relation_ref 137093 // 
   line 138885 z 1999 to ref 135813
   role_a_pos 524 717 3000 no_role_b
   multiplicity_a_pos 505 783 3000 no_multiplicity_b
+relationcanvas 139141 relation_ref 140805 // 
+  from ref 139013 z 1999 to ref 131461
+  no_role_a no_role_b
+  no_multiplicity_a no_multiplicity_b
 end
diff --git a/uml/cinelerra3/128261 b/uml/cinelerra3/128261
index e6d8a8100..5cd38d425 100644
--- a/uml/cinelerra3/128261
+++ b/uml/cinelerra3/128261
@@ -1,6 +1,6 @@
 format 40
 "MObject" // ProcessingLayer::MObject
-  revision 17
+  revision 18
   modified_by 5 "hiv"
   // class settings
   //class diagram settings
@@ -415,18 +415,39 @@ ${inlines}
 	comment "startpos in source"
       end
 
-      classrelation 141829 // source ()
-	relation 140037 --->
-	  a role_name "source" multiplicity "1" const_relation protected
+      classrelation 142469 // source ()
+	relation 140677 --->
+	  a role_name "source" multiplicity "1" 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
+	    classrelation_ref 142469 // source ()
+	  b multiplicity "*" parent class_ref 136709 // Media
       end
     end
 
+    class 138629 "CompoundClip"
+      visibility package 
+      cpp_decl "${comment}${template}class ${name}${inherit}
+  {
+${members}  };
+${inlines}
+"
+      java_decl ""
+      idl_decl ""
+      explicit_switch_type ""
+      
+      associated_diagram classdiagram_ref 128133 // Session structure
+      classrelation 142597 // 
+	relation 140805 ---|>
+	  a public
+	    cpp default "${type}"
+	    classrelation_ref 142597 // 
+	  b multiplicity "" parent class_ref 128901 // Clip
+      end
+
+    end
+
     class 129029 "Effect"
       visibility package 
       cpp_decl "${comment}${template}class ${name}${inherit}
diff --git a/uml/cinelerra3/130309.diagram b/uml/cinelerra3/130309.diagram
index d97905e09..b79866fd7 100644
--- a/uml/cinelerra3/130309.diagram
+++ b/uml/cinelerra3/130309.diagram
@@ -13,7 +13,7 @@ packagecanvas 128517
    show_context_mode namespace  xyzwh 217 182 1994 608 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
+  xyz 259 330 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
@@ -71,10 +71,14 @@ classcanvas 133765 class_ref 138501 // CompoundMedia
   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 245 529 2005
   end
+classcanvas 135813 class_ref 138757 // ProcPatt
+  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 638 506 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
+  from ref 128645 z 1999 to point 293 307
+  line 129797 z 1999 to point 138 307
   line 129925 z 1999 to ref 128005
   no_role_a no_role_b
   no_multiplicity_a no_multiplicity_b
@@ -105,15 +109,15 @@ relationcanvas 130949 relation_ref 138629 // 
   multiplicity_a_pos 260 250 3000 multiplicity_b_pos 194 194 3000
 relationcanvas 131205 relation_ref 138757 // 
   geometry VHV
-  from ref 131077 z 1999 to point 339 415
-  line 134277 z 1999 to point 293 415
+  from ref 131077 z 1999 to point 339 423
+  line 134277 z 1999 to point 293 423
   line 134405 z 1999 to ref 128645
   no_role_a no_role_b
   no_multiplicity_a no_multiplicity_b
 relationcanvas 131717 relation_ref 139013 // 
   geometry VHV
-  from ref 131461 z 2004 to point 411 415
-  line 134021 z 2004 to point 293 415
+  from ref 131461 z 2004 to point 411 423
+  line 134021 z 2004 to point 293 423
   line 134149 z 2004 to ref 128645
   no_role_a no_role_b
   no_multiplicity_a no_multiplicity_b
@@ -155,8 +159,19 @@ relationcanvas 134917 relation_ref 140549 // 
   from ref 133765 z 2004 stereotype "<>" xyz 229 493 3000 to point 225 545
   line 135301 z 2004 to point 225 365
   line 135173 z 2004 to ref 128645
-  role_a_pos 230 378 3000 no_role_b
-  multiplicity_a_pos 231 348 3000 multiplicity_b_pos 230 556 3000
+  role_a_pos 217 343 3000 no_role_b
+  multiplicity_a_pos 232 376 3000 multiplicity_b_pos 230 556 3000
+relationcanvas 136069 relation_ref 141189 // 
+  from ref 135813 z 1999 to ref 128901
+  no_role_a no_role_b
+  no_multiplicity_a no_multiplicity_b
+relationcanvas 136197 relation_ref 141317 // 
+  from ref 128645 z 1999 to point 324 392
+  line 136581 z 1999 to point 447 392
+  line 136453 z 1999 to point 471 525
+  line 136325 z 1999 to ref 135813
+  no_role_a no_role_b
+  no_multiplicity_a no_multiplicity_b
 line 128261 -_-_ geometry HV
   from ref 128005 z 1999 to point 331 150
   line 128389 z 1999 to ref 128133
diff --git a/uml/cinelerra3/130437.diagram b/uml/cinelerra3/130437.diagram
index 505e607ea..6ec723dd0 100644
--- a/uml/cinelerra3/130437.diagram
+++ b/uml/cinelerra3/130437.diagram
@@ -6,7 +6,7 @@ classcanvas 128005 class_ref 137349 // Clip
   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
+  xyz 533 42 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
@@ -58,16 +58,28 @@ classcanvas 134661 class_ref 133253 // Frame
   end
 packagecanvas 135685 
   package_ref 128261 // MObject
-    xyzwh 24 10 1994 185 313
+    xyzwh 24 10 1994 187 356
 packagecanvas 135813 
   package_ref 128133 // Asset
-    xyzwh 454 10 1994 276 313
+    xyzwh 454 10 1994 367 311
 note 136837 "the Builder implements each Clip by a source node and maybe some codec"
   xyzwh 53 376 2000 219 61
 classcanvas 137221 class_ref 138501 // CompoundMedia
   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 606 148 3005
   end
+classcanvas 138373 class_ref 138629 // CompoundClip
+  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 72 301 2000
+  end
+classcanvas 138885 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 758 51 2005
+  end
+classcanvas 139013 class_ref 138757 // ProcPatt
+  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 751 115 2000
+  end
 relationcanvas 128517 relation_ref 139141 // 
   from ref 128261 z 1999 to ref 128389
   no_role_a no_role_b
@@ -130,31 +142,44 @@ relationcanvas 135301 relation_ref 134021 // 
   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 136069 z 1999 to point 433 25
   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
+  from ref 128005 z 1999 to point 489 78
   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
+  role_a_pos 488 56 3000 no_role_b
+  multiplicity_a_pos 516 89 3000 multiplicity_b_pos 477 123 3000
 relationcanvas 137349 relation_ref 140421 // 
   from ref 137221 z 1999 to ref 128133
   no_role_a no_role_b
   no_multiplicity_a no_multiplicity_b
 relationcanvas 137477 relation_ref 140549 // 
-  from ref 137221 z 1999 to point 654 68
-  line 137733 z 1999 stereotype "<>" xyz 662 113 3000 to ref 128133
-  role_a_pos 602 48 3000 no_role_b
-  multiplicity_a_pos 605 72 3000 multiplicity_b_pos 642 123 3000
-line 136453 -_-_
-  from ref 136325 z 1998 to ref 128901
+  from ref 137221 z 1999 to point 654 77
+  line 137733 z 1999 stereotype "<>" xyz 670 122 3000 to ref 128133
+  role_a_pos 615 55 3000 no_role_b
+  multiplicity_a_pos 590 122 3000 multiplicity_b_pos 642 123 3000
+relationcanvas 137861 relation_ref 140677 // 
+  from ref 128901 z 1999 to point 218 232
+  line 138245 z 1999 to point 383 49
+  line 137989 z 1999 to point 492 49
+  line 138117 z 1999 to ref 128133
+  role_a_pos 488 44 3000 no_role_b
+  multiplicity_a_pos 516 77 3000 multiplicity_b_pos 149 235 3000
+relationcanvas 138501 relation_ref 140805 // 
+  from ref 138373 z 1999 to ref 128901
+  no_role_a no_role_b
+  no_multiplicity_a no_multiplicity_b
+relationcanvas 139141 relation_ref 141189 // 
+  from ref 139013 z 1999 to ref 138885
+  no_role_a no_role_b
+  no_multiplicity_a no_multiplicity_b
+relationcanvas 139397 relation_ref 141317 // 
+  from ref 128133 z 1999 to point 599 104
+  line 140165 z 1999 to point 697 104
+  line 139781 z 1999 to ref 139013
+  no_role_a no_role_b
+  no_multiplicity_a no_multiplicity_b
 end
diff --git a/uml/cinelerra3/5.session b/uml/cinelerra3/5.session
index cd8358b51..5ad4f0dd7 100644
--- a/uml/cinelerra3/5.session
+++ b/uml/cinelerra3/5.session
@@ -3,14 +3,12 @@ diagrams
   classdiagram_ref 130309 // Asset Kinds
     860 607 100 4 120 0
   active  classdiagram_ref 130437 // Media-Asset Relations
-    817 506 100 4 0 0
+    817 506 100 4 0 38
   classdiagram_ref 128133 // Session structure
-    688 506 100 4 60 0
-  classdiagram_ref 128389 // Render Entities
-    688 506 100 4 120 0
+    688 506 100 4 180 80
 end
 show_stereotypes
-selected classdiagram_ref 130437 // Media-Asset Relations
+selected classrelation_ref 143237 // 
 open
   
   package_ref 128005 // design
@@ -20,7 +18,9 @@ open
   class_ref 136709 // Media
   class_ref 138501 // CompoundMedia
   class_ref 137349 // Clip
-  classview_ref 128005 // Session
+  class_ref 138757 // ProcPatt
+  class_ref 128901 // Clip
+  class_ref 138629 // CompoundClip
   
   package_ref 128389 // RenderEngine
   class_ref 135685 // Logic
diff --git a/wiki/renderengine.html b/wiki/renderengine.html
index ff051b54d..6c7bee04f 100644
--- a/wiki/renderengine.html
+++ b/wiki/renderengine.html
@@ -1391,7 +1391,7 @@ For the case in question this seems to be the ''resource allocation is construct
 And, last but not least, doing all actual allocations is the job of the backend. Exceptions being long-lived objects, like the Session or the EDL, which are created once and don't bear the danger of causing memory pressure. Besides that, the ProcLayer code shouldn't issue "new" and "delete", rather it should use some central [[Factories]] for all allocation and freeing, so we can redirect these calls down to the backend, which may use pooling or special placement allocators or the like. The rationale is, for modern hardware/architectures, care has to be taken with heap allocations, esp. with many small objects and irregular usage patterns.
 
-
+
Based on practical experiences, Ichthyo tends to consider Multichannel Media as the base case, while counting media files providing just one single media stream as exotic corner cases. This may seem counter intuitive at first sight; you should think of  it as an attempt to avoid right from start some of the common shortcomings found in many video editors, especially
 * having to deal with keeping a "link" between audio and video clips
 * silly limitations on the supported audio setups (e.g. mono, stereo and 5.1)
@@ -1399,9 +1399,17 @@ And, last but not least, doing all actual allocations is the job of the backend.
 * inability to edit stereoscopic (3D) video in a natural fashion
 
 !Compound Media
-Basically, each [[media asset|MediaAsset]] is considered to be a compound of several elementary media (tracks), possibly of various different media kinds. Adding support for placeholders (''proxy clips'') at some point in future will add still more complexity (because then there will be even dependencies between some of these elementary media). We try to keep the structural limitations necessary to be able to handle, edit and render compound media to the bare minimum. This is only possible, if we try to configure as much as possible already at the "asset level" and make the rest of the proc layer behave just according to the configuration given with each asset.
+Basically, each [[media asset|MediaAsset]] is considered to be a compound of several elementary media (tracks), possibly of various different media kinds. Adding support for placeholders (''proxy clips'') at some point in future will add still more complexity (because then there will be even dependencies between some of these elementary media). To handle, edit and render compound media, we need to impose some structural limitations. But anyhow, we try to configure as much as possible already at the "asset level" and make the rest of the proc layer behave just according to the configuration given with each asset.
 
-So, when creating a clip out of such a compound media asset, the clip has to be a compound of elementary clips mirroring the given media asset's structure. Besides, it should be possible to //detach// and //attach// elementary clips from a compound clip. On the other hand, the [[Fixture]] created from the current state of the [[EDL]] is explicit to a great extent. So, in the Fixture we deal only with elementary clips placed to absolute positions, and thus the builder will see only simple non-compound clips and translate them into the corresponding source reading nodes.
+So, when creating a clip out of such a compound media asset, the clip has to be a compound of elementary clips mirroring the given media asset's structure. Besides, it should be possible to //detach// and //attach// elementary clips from a compound clip. On the other hand, the [[Fixture]] created from the current state of the [[EDL]] is explicit to a great extent. So, in the Fixture we deal only with elementary clips placed to absolute positions, and thus the builder will see only simple non-compound clips and translate them into the corresponding source reading nodes. + +!Handling +* from a Media asset, we can get a [[Processing Pattern|ProcPatt]] describing how to build a render pipeline for this media +* we can create a Clip (MObject) from each Media, which will be linked back to the media asset internally. +* moreover, creating a Clip will create and register a Clip asset as well, and this Clip asset will be tied to the original Clip and will show up in some special Category +* media can be compound and the created Clips will mirror this compound structure +* {{red{to be defined}}} a way to distinguish Elementay Clips (non-compound) and to express that only such can be passed to the Builder +* the Builder gets at the ProcPatt (descriptor) of the underlying media for each clip and uses this description as a template to build the render pipeline. That is, the ProcPatt specifies the codec asset and maybe some additional effect assets (deinterlace, scale) necessary for feeding media data corresponding to this clip/media into the render nodes network.
We have to consider carefully how to handle the Creation of new class instances. Because, when done naively, it can defeat all efforts of separating subsystems, or &mdash; the other extreme &mdash; lead to a //switch-on-typeID//  programming style. We strive at a solution somewhere in the middle by utilizing __Abstract Factories__ on Interface or key abstraction classes, but providing specialized overloads for the different use cases. So in each use case we have to decide if we want to create a representant of some general concept (Interface), or if we have a direct colaboration and thus need the Factory to provide

From f2c302707103be623182565c792788d40465a5e0 Mon Sep 17 00:00:00 2001
From: Ichthyostega 
Date: Fri, 21 Sep 2007 03:40:04 +0200
Subject: [PATCH 03/14] further problem analysis

---
 uml/cinelerra3/128133         | 25 ++++++++++++++++++++++---
 uml/cinelerra3/128261         | 10 +++++++++-
 uml/cinelerra3/130437.diagram | 21 +++++++++++++++++----
 uml/cinelerra3/5.session      |  8 ++++----
 wiki/renderengine.html        | 10 +++++++---
 5 files changed, 59 insertions(+), 15 deletions(-)

diff --git a/uml/cinelerra3/128133 b/uml/cinelerra3/128133
index c192cb0d7..11a8c01b5 100644
--- a/uml/cinelerra3/128133
+++ b/uml/cinelerra3/128133
@@ -1,6 +1,6 @@
 format 40
 "Asset" // ProcessingLayer::Asset
-  revision 8
+  revision 10
   modified_by 5 "hiv"
   // class settings
   //class diagram settings
@@ -390,7 +390,7 @@ ${class}::${name} ${(}${)}${const}${volatile} ${throw}${staticnl}
       classrelation 143237 // 
 	relation 141317 -_->
 	  a default
-	    cpp default "Generated"
+	    cpp default "#include in header"
 	    classrelation_ref 143237 // 
 	  b multiplicity "" parent class_ref 138757 // ProcPatt
       end
@@ -536,7 +536,6 @@ ${inlines}
 	  b multiplicity "*" parent class_ref 136709 // Media
 	  association_type class_ref 136709 // Media
       end
-
     end
 
     class 137477 "Unknown"
@@ -719,5 +718,25 @@ ${inlines}
       
       comment "Implementation of the registry holding all Asset instances known to the Asset Manager subsystem. As of 8/2007 implemented by a hashtable."
     end
+
+    class 138885 "SimpleClip"
+      visibility package 
+      cpp_decl "${comment}${template}class ${name}${inherit}
+  {
+${members}  };
+${inlines}
+"
+      java_decl ""
+      idl_decl ""
+      explicit_switch_type ""
+      
+      classrelation 143365 // 
+	relation 141445 ---|>
+	  a public
+	    cpp default "${type}"
+	    classrelation_ref 143365 // 
+	  b multiplicity "" parent class_ref 128901 // Clip
+      end
+    end
   end
 end
diff --git a/uml/cinelerra3/128261 b/uml/cinelerra3/128261
index 5cd38d425..0e2183209 100644
--- a/uml/cinelerra3/128261
+++ b/uml/cinelerra3/128261
@@ -1,6 +1,6 @@
 format 40
 "MObject" // ProcessingLayer::MObject
-  revision 18
+  revision 19
   modified_by 5 "hiv"
   // class settings
   //class diagram settings
@@ -446,6 +446,14 @@ ${inlines}
 	  b multiplicity "" parent class_ref 128901 // Clip
       end
 
+      classrelation 143493 // components ()
+	relation 141573 o-->
+	  a role_name "components" multiplicity "1..*" protected
+	    cpp default "    ${comment}${static}${mutable}${volatile}${const}${type}* ${name}${value};
+"
+	    classrelation_ref 143493 // components ()
+	  b multiplicity "*" parent class_ref 128901 // Clip
+      end
     end
 
     class 129029 "Effect"
diff --git a/uml/cinelerra3/130437.diagram b/uml/cinelerra3/130437.diagram
index 6ec723dd0..1ed28785b 100644
--- a/uml/cinelerra3/130437.diagram
+++ b/uml/cinelerra3/130437.diagram
@@ -70,7 +70,7 @@ classcanvas 137221 class_ref 138501 // CompoundMedia
   end
 classcanvas 138373 class_ref 138629 // CompoundClip
   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 72 301 2000
+  xyz 110 293 2000
   end
 classcanvas 138885 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
@@ -80,6 +80,10 @@ classcanvas 139013 class_ref 138757 // ProcPatt
   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 751 115 2000
   end
+classcanvas 140293 class_ref 138885 // SimpleClip
+  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 32 293 3005
+  end
 relationcanvas 128517 relation_ref 139141 // 
   from ref 128261 z 1999 to ref 128389
   no_role_a no_role_b
@@ -150,7 +154,7 @@ relationcanvas 136965 relation_ref 140165 // 
   geometry VH
   from ref 128005 z 1999 to point 489 78
   line 137093 z 1999 to ref 128133
-  role_a_pos 488 56 3000 no_role_b
+  role_a_pos 475 61 3000 no_role_b
   multiplicity_a_pos 516 89 3000 multiplicity_b_pos 477 123 3000
 relationcanvas 137349 relation_ref 140421 // 
   from ref 137221 z 1999 to ref 128133
@@ -158,7 +162,7 @@ relationcanvas 137349 relation_ref 140421 // 
   no_multiplicity_a no_multiplicity_b
 relationcanvas 137477 relation_ref 140549 // 
   from ref 137221 z 1999 to point 654 77
-  line 137733 z 1999 stereotype "<>" xyz 670 122 3000 to ref 128133
+  line 137733 z 1999 stereotype "<>" xyz 658 123 3000 to ref 128133
   role_a_pos 615 55 3000 no_role_b
   multiplicity_a_pos 590 122 3000 multiplicity_b_pos 642 123 3000
 relationcanvas 137861 relation_ref 140677 // 
@@ -166,7 +170,7 @@ relationcanvas 137861 relation_ref 140677 // 
   line 138245 z 1999 to point 383 49
   line 137989 z 1999 to point 492 49
   line 138117 z 1999 to ref 128133
-  role_a_pos 488 44 3000 no_role_b
+  role_a_pos 392 51 3000 no_role_b
   multiplicity_a_pos 516 77 3000 multiplicity_b_pos 149 235 3000
 relationcanvas 138501 relation_ref 140805 // 
   from ref 138373 z 1999 to ref 128901
@@ -182,4 +186,13 @@ relationcanvas 139397 relation_ref 141317 // 
   line 139781 z 1999 to ref 139013
   no_role_a no_role_b
   no_multiplicity_a no_multiplicity_b
+relationcanvas 140421 relation_ref 141445 // 
+  from ref 140293 z 1999 to ref 128901
+  no_role_a no_role_b
+  no_multiplicity_a no_multiplicity_b
+relationcanvas 140549 relation_ref 141573 // 
+  from ref 138373 z 1999 to point 154 263
+  line 140677 z 1999 to ref 128901
+  role_a_pos 149 247 3000 no_role_b
+  multiplicity_a_pos 160 260 3000 multiplicity_b_pos 142 268 3000
 end
diff --git a/uml/cinelerra3/5.session b/uml/cinelerra3/5.session
index 5ad4f0dd7..27d9ec386 100644
--- a/uml/cinelerra3/5.session
+++ b/uml/cinelerra3/5.session
@@ -2,13 +2,13 @@ window_sizes 1140 783 270 860 633 71
 diagrams
   classdiagram_ref 130309 // Asset Kinds
     860 607 100 4 120 0
-  active  classdiagram_ref 130437 // Media-Asset Relations
-    817 506 100 4 0 38
   classdiagram_ref 128133 // Session structure
-    688 506 100 4 180 80
+    688 506 100 4 180 0
+  active  classdiagram_ref 130437 // Media-Asset Relations
+    860 633 100 4 0 0
 end
 show_stereotypes
-selected classrelation_ref 143237 // 
+selected classdiagram_ref 130437 // Media-Asset Relations
 open
   
   package_ref 128005 // design
diff --git a/wiki/renderengine.html b/wiki/renderengine.html
index 6c7bee04f..cd9a0e683 100644
--- a/wiki/renderengine.html
+++ b/wiki/renderengine.html
@@ -2021,7 +2021,7 @@ DAMAGE.
 //Note, we have yet to specify how exactly the building and rendering will work together with the backend. There are several possibilities how to structure the Playlist//
 
-
+
Open issues, Things to be worked out, Problems still to be solved... 
 
 !!Parameter Handling
@@ -2040,11 +2040,15 @@ From experience, mainly with other applications, we can draw the following concl
 How to handle the simultaneous rendering of several output streams (video, audio channels). Shall we treat the EDL as one entity containing different output channels, or should it rather be seen as a composite of several sub-~EDLs, each for only one output channel? This decision will be reflected in the overall structure of the network of render nodes: We could have a list of channel-output generating pipelines in each processor (for every segment), or we could have independently segmented lists of Processors for every output channel/type. The problem is, //it is not clear what approach to prefer at the moment//  because we are just guessing.
 
 !!Tracks, Channels, Layers
-Closely related to this is the not-so-obvious problem how to understand the common global structures found in most audio and video editing applications. Mostly, they stem from imitating hardware recording and editing solutions, thus easing the transition for professionals grown up with analog hardware based media. But as digital media are the de-facto standard nowadays, we could have a look at all those accidental complexity introduced by sticking to the hardware tool metaphor.
+Closely related to this is the not-so-obvious problem how to understand the common global structures found in most audio and video editing applications. Mostly, they stem from imitating hardware recording and editing solutions, thus easing the transition for professionals grown up with analogue hardware based media. But as digital media are the de-facto standard nowadays, we could rethink some of this accidental complexity introduced by sticking to the hardware tool metaphor.
 * is it really necessary to have fixed global tracks?
 * is it really helpful to feed "source tracks" into global processing busses/channels?
 Users accustomed with modern GUI applications typically expect that //everything is a object//  and can be pulled around and  manipulated individually. This seems natural at start, but raises the problem of providing a efficient workflow for handling larger projects and editing tasks. So, if we don't have a hard wired multitrack+bus architecture, we need some sort of templating to get the standard editing use case done efficiently.
-
+ +!!Compound and Multiplicity +Simple relations can be hard wired. But, on the contrary, it would be as naive to define a Clip as having a Video track and two audio tracks, as it would be naive to overlook the problem of holding video and corresponding audio together. And, moreover, the default case has to be processed in a //straight forward// fashion, with as few tests and decisions as possible. So, basically each component participating in getting the core processing done has to mirror the structure pattern of the other parts, so that processing can be done without testing and forking. But this leaves us with the problem where to put the initial knowledge about the structural pattern used for building up the compound structures and &mdash; especially &mdash; the problem how to treat different kinds of structural patterns, how to detect the pattern to be applied and how to treat multiple instances of the same structural pattern. + +One example of this problem is the [[handling of multichannel media|MultichannelMedia]]. Following the above reasoning, we end with having a [["structural pattern"|StructPatt]], typically one video stream with MPEG decoder and a pair of audio streams which need either to be routed to some "left" and "right" output ports, or have to be passed through a panning filter accordingly. Now the problem is: //create a new instance of this structure for each new media, or detect which media to subsume under a existing pattern instance.//
The middle Layer of our current Architecture plan, i.e. the layer managing all processing and manipulation, while the actual data handling is done in the backend and the user interaction belongs to the GUI Layer.

From 1b40817d56f186587e512995067ba4319226b71f Mon Sep 17 00:00:00 2001
From: Ichthyostega 
Date: Sat, 22 Sep 2007 02:53:03 +0200
Subject: [PATCH 04/14] design: processing pattern (prereq. for further
 implementing the builder)

---
 doc/devel/uml/class128901.html       |   7 +-
 doc/devel/uml/class136581.html       |  10 +-
 doc/devel/uml/class136709.html       |   8 +-
 doc/devel/uml/class136965.html       |   2 +-
 doc/devel/uml/class137349.html       |   2 +-
 doc/devel/uml/class137477.html       |   2 +-
 doc/devel/uml/class137605.html       |   2 +-
 doc/devel/uml/class138373.html       |  20 ++++
 doc/devel/uml/class138501.html       |  24 +++++
 doc/devel/uml/class138629.html       |  24 +++++
 doc/devel/uml/class138757.html       |  24 +++++
 doc/devel/uml/class138885.html       |  23 +++++
 doc/devel/uml/class139013.html       |  21 ++++
 doc/devel/uml/class139141.html       |  25 +++++
 doc/devel/uml/class139269.html       |  23 +++++
 doc/devel/uml/classes.html           |   8 ++
 doc/devel/uml/classes_list.html      |   8 ++
 doc/devel/uml/fig128133.png          | Bin 55553 -> 56590 bytes
 doc/devel/uml/fig130309.png          | Bin 26962 -> 41258 bytes
 doc/devel/uml/fig130437.png          | Bin 24470 -> 44658 bytes
 doc/devel/uml/index.html             |  16 ++-
 doc/devel/uml/index_65.html          |   4 +-
 doc/devel/uml/index_66.html          |   1 +
 doc/devel/uml/index_67.html          |  32 +++---
 doc/devel/uml/index_68.html          |   6 +-
 doc/devel/uml/index_69.html          |   2 +-
 doc/devel/uml/index_70.html          |   4 +-
 doc/devel/uml/index_71.html          |   1 +
 doc/devel/uml/index_72.html          |   1 +
 doc/devel/uml/index_73.html          |   3 +-
 doc/devel/uml/index_77.html          |   2 +-
 doc/devel/uml/index_78.html          |   1 +
 doc/devel/uml/index_79.html          |   2 +-
 doc/devel/uml/index_80.html          |   2 +
 doc/devel/uml/index_82.html          |   5 +-
 doc/devel/uml/index_83.html          |   4 +-
 doc/devel/uml/index_84.html          |   7 +-
 doc/devel/uml/index_86.html          |  16 +--
 doc/devel/uml/packages.html          |   2 +-
 doc/devel/uml/public_operations.html |   8 +-
 doc/devel/uml/public_properties.html |   2 +
 uml/cinelerra3/128133                |  93 ++++++++++++++++-
 uml/cinelerra3/130309.diagram        |  37 ++++++-
 uml/cinelerra3/130437.diagram        | 144 +++++++++++++++++++--------
 uml/cinelerra3/5.session             |  13 ++-
 uml/cinelerra3/cinelerra3.prj        |   2 +-
 wiki/renderengine.html               |  34 ++++++-
 47 files changed, 566 insertions(+), 111 deletions(-)
 create mode 100644 doc/devel/uml/class138373.html
 create mode 100644 doc/devel/uml/class138501.html
 create mode 100644 doc/devel/uml/class138629.html
 create mode 100644 doc/devel/uml/class138757.html
 create mode 100644 doc/devel/uml/class138885.html
 create mode 100644 doc/devel/uml/class139013.html
 create mode 100644 doc/devel/uml/class139141.html
 create mode 100644 doc/devel/uml/class139269.html

diff --git a/doc/devel/uml/class128901.html b/doc/devel/uml/class128901.html
index 554e5a32c..a4c14a225 100644
--- a/doc/devel/uml/class128901.html
+++ b/doc/devel/uml/class128901.html
@@ -16,11 +16,12 @@
 
 
 
-

Declaration :

Artifact : clip

+

Declaration :

Directly inherited by : CompoundClip SimpleClip

+

Artifact : clip

Attribut start
-

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

+

Declaration :

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

startpos in source

+
Relation source (<unidirectional association>)

Declaration :

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

the media source this clip referes to

All public operations : apply

diff --git a/doc/devel/uml/class136581.html b/doc/devel/uml/class136581.html index b81f1f7ef..f9cfcc755 100644 --- a/doc/devel/uml/class136581.html +++ b/doc/devel/uml/class136581.html @@ -17,11 +17,13 @@

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 getID

Declaration :

  • Uml : static, + getID(in idi : Asset) :
  • C++ : public: static getID ()
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

+
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

+
Operation reg

Declaration :

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

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

+
Relation registry (<unidirectional association>)

Declaration :

  • Uml : # registry : DB, multiplicity : 1
  • C++ : protected: DB* registry

@internal Table or DB holding all registered asset instances.

+

All public operations : getAsset , getID , known , remove

diff --git a/doc/devel/uml/class136709.html b/doc/devel/uml/class136709.html index c7f46adb3..1117fdbef 100644 --- a/doc/devel/uml/class136709.html +++ b/doc/devel/uml/class136709.html @@ -16,9 +16,11 @@ -

Declaration :

  • C++ : class Media : public Asset

Directly inherited by : Clip Preview

+

Declaration :

  • C++ : class Media : public Asset

Directly inherited by : Clip CompoundMedia Preview

key abstraction: media-like assets

Artifact : media

-
-

All public operations : enable , getDependant , getParents , isActive

+ +
Operation createClip

Declaration :

  • Uml : + createClip() : Clip
  • C++ : public: Clip createClip ()

create a (possibly compound) Clip refering to this media, ready to be added to the EDL.

+
Operation howtoProc

Declaration :

@return descriptor how to build a render pipeline corresponding to this media

+

All public operations : createClip , enable , getDependant , getParents , howtoProc , isActive

diff --git a/doc/devel/uml/class136965.html b/doc/devel/uml/class136965.html index d2f992c0a..d666bf3f2 100644 --- a/doc/devel/uml/class136965.html +++ b/doc/devel/uml/class136965.html @@ -16,7 +16,7 @@ -

Declaration :

  • C++ : class Struct : public Asset

Directly inherited by : OutPort Track

+

Declaration :

  • C++ : class Struct : public Asset

Directly inherited by : OutPort ProcPatt Track

key abstraction: structural asset

Artifact : struct

All public operations : enable , getDependant , getParents , isActive

diff --git a/doc/devel/uml/class137349.html b/doc/devel/uml/class137349.html index 2b1885473..7d1b67bef 100644 --- a/doc/devel/uml/class137349.html +++ b/doc/devel/uml/class137349.html @@ -19,6 +19,6 @@

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

+

All public operations : createClip , enable , getDependant , getParents , howtoProc , isActive

diff --git a/doc/devel/uml/class137477.html b/doc/devel/uml/class137477.html index 4e36b6db4..18188f2f5 100644 --- a/doc/devel/uml/class137477.html +++ b/doc/devel/uml/class137477.html @@ -18,6 +18,6 @@

Declaration :

  • C++ : class Unknown : public Preview

placeholder for unknown or unavailable media source

Artifact : unknown

-

All public operations : enable , getDependant , getParents , isActive

+

All public operations : createClip , enable , getDependant , getParents , howtoProc , isActive

diff --git a/doc/devel/uml/class137605.html b/doc/devel/uml/class137605.html index e154ffd5f..7ba8853f4 100644 --- a/doc/devel/uml/class137605.html +++ b/doc/devel/uml/class137605.html @@ -19,6 +19,6 @@

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

+

All public operations : createClip , enable , getDependant , getParents , howtoProc , isActive

diff --git a/doc/devel/uml/class138373.html b/doc/devel/uml/class138373.html new file mode 100644 index 000000000..59b8657a5 --- /dev/null +++ b/doc/devel/uml/class138373.html @@ -0,0 +1,20 @@ + + + + + + +Class DB + + + + + +
Class DB
+

+ + + + +

Declaration :

  • C++ : class DB

Implementation of the registry holding all Asset instances known to the Asset Manager subsystem. As of 8/2007 implemented by a hashtable.

Artifact : db

+ diff --git a/doc/devel/uml/class138501.html b/doc/devel/uml/class138501.html new file mode 100644 index 000000000..03c3ffaa4 --- /dev/null +++ b/doc/devel/uml/class138501.html @@ -0,0 +1,24 @@ + + + + + + +Class CompoundMedia + + + + + +
Class CompoundMedia
+

+ + + + +

Declaration :

  • C++ : class CompoundMedia : public Media

compound of several elementary media tracks,
e.g. the individual media streams found in one media file

+ +
Relation tracks (<directional aggregation>)

Declaration :

  • Uml : # tracks : Media, multiplicity : 1..*
  • C++ : protected: vector<Media *> tracks

elementary media assets comprising this compound

+

All public operations : createClip , enable , getDependant , getParents , howtoProc , isActive

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

+ + + + +

Declaration :

  • C++ : class CompoundClip : public Clip

Diagram : Session structure

+ +
Relation components (<directional aggregation>)

Declaration :

  • Uml : # components : Clip, multiplicity : 1..*
  • C++ : protected: Clip* components
+

All public operations : apply

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

+ + + + +

Declaration :

  • C++ : class ProcPatt : public Struct
+ +
Relation instructions (<directional aggregation by value>)

Declaration :

+

All public operations : enable , getDependant , getParents , isActive

+ + diff --git a/doc/devel/uml/class138885.html b/doc/devel/uml/class138885.html new file mode 100644 index 000000000..598ee1c5b --- /dev/null +++ b/doc/devel/uml/class138885.html @@ -0,0 +1,23 @@ + + + + + + +Class SimpleClip + + + + + +
Class SimpleClip
+

+ + + + +

Declaration :

  • C++ : class SimpleClip : public Clip
+
+

All public operations : apply

+ + diff --git a/doc/devel/uml/class139013.html b/doc/devel/uml/class139013.html new file mode 100644 index 000000000..911e23339 --- /dev/null +++ b/doc/devel/uml/class139013.html @@ -0,0 +1,21 @@ + + + + + + +Class BuildInstruct + + + + + +
Class BuildInstruct
+

+ + + + +

Declaration :

  • C++ : class BuildInstruct

Directly inherited by : DoAttach DoRecurse

+ + diff --git a/doc/devel/uml/class139141.html b/doc/devel/uml/class139141.html new file mode 100644 index 000000000..1a1d63db8 --- /dev/null +++ b/doc/devel/uml/class139141.html @@ -0,0 +1,25 @@ + + + + + + +Class DoAttach + + + + + +
Class DoAttach
+

+ + + + +

Declaration :

+ +
Relation nodes (<directional aggregation>)

Declaration :

  • Uml : + nodes : Proc, multiplicity : 1..*
  • C++ : public: const Proc* nodes
+
Attribut point
+

Declaration :

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

identifying the point where the nodes should be attached

+ + diff --git a/doc/devel/uml/class139269.html b/doc/devel/uml/class139269.html new file mode 100644 index 000000000..3e1dd987b --- /dev/null +++ b/doc/devel/uml/class139269.html @@ -0,0 +1,23 @@ + + + + + + +Class DoRecurse + + + + + +
Class DoRecurse
+

+ + + + +

Declaration :

+ +
Relation subPattern (<unidirectional association>)

Declaration :

  • Uml : # subPattern : ProcPatt, multiplicity : 1
  • C++ : protected: const ProcPatt* subPattern
+ + diff --git a/doc/devel/uml/classes.html b/doc/devel/uml/classes.html index cfbf35142..b522e0caf 100644 --- a/doc/devel/uml/classes.html +++ b/doc/devel/uml/classes.html @@ -27,18 +27,24 @@ 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 +BuildInstruct Categorytree like classification of Assets Clipbookkeeping (asset) view of a media clip. Clip Codecdescription of some media data decoder or encoder facility CodecAdapter +CompoundClip +CompoundMediacompound of several elementary media tracks,
e.g. the individual media streams found in one media file 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 +DBImplementation of the registry holding all Asset instances known to the Asset Manager subsystem. As of 8/2007 implemented by a hashtable. DirectPlacement +DoAttach +DoRecurse EDL EffectEffect or media processing component Effect @@ -88,6 +94,7 @@ Prockey abstraction: data processing asset Processor ProcNodeinterfaceKey abstraction of the Render Engine: A Data processing Node +ProcPatt ProjectorSpecial video processing node used to scale and translate image data. RelativePlacement RelTypeenumthe possible kinds of RelativePlacements @@ -97,6 +104,7 @@ Segment SegmentationToolTool implementation for deriving a partitioning of the current timeline such, that each segement has a constant configuration. "Constant" means here, that any remaining changes over time can be represented by automation solely, without the need to change the node connections. Session +SimpleClip SmartPointerauxiliary SourceSource Node: represents a media source to pull data from. State diff --git a/doc/devel/uml/classes_list.html b/doc/devel/uml/classes_list.html index 78eefaa82..ffe1ccbab 100644 --- a/doc/devel/uml/classes_list.html +++ b/doc/devel/uml/classes_list.html @@ -28,18 +28,24 @@ Auto
Buildable
BuilderFacade
+BuildInstruct
Category
Clip
Clip
Codec
CodecAdapter
+CompoundClip
+CompoundMedia
Condition
Config
ConManager
Constraint
ControllerFacade
Dataset
+DB
DirectPlacement
+DoAttach
+DoRecurse
EDL
Effect
Effect
@@ -89,6 +95,7 @@ Proc
Processor
ProcNode
+ProcPatt
Projector
RelativePlacement
RelType
@@ -98,6 +105,7 @@ Segment
SegmentationTool
Session
+SimpleClip
SmartPointer
Source
State
diff --git a/doc/devel/uml/fig128133.png b/doc/devel/uml/fig128133.png index 9a168025423ab2c06ca981a4c11d63115c6c9b7e..1b1f3347e6dbee4efc05749f87e7946ffb41a85b 100644 GIT binary patch delta 42674 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⋙qUF}$-Nd-G;t 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%0DWak{Yc7)1!8D8Hf(hw$o#zS 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 O;q-%xT@iE3PyYleZkpKu diff --git a/doc/devel/uml/fig130309.png b/doc/devel/uml/fig130309.png index 436fda8d2b2e93f742f5dc7c3da079be13911c4a..e2c7d63134853f977e19a4a8f9dd73e3ec21605e 100644 GIT binary patch literal 41258 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%0AFC=>X;!RVMCqgwr?1l4S=CW(l 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
xu( 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≧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 literal 24470 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
Artifact Cinelerra3

Depends on common

Depends on gui

Depends on proc

Depends on backend

the main executable to be built

-

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

+

executable associated with : 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, link, parameter, renderengine

Artifact main

Artifact source

@@ -238,6 +238,10 @@ Documentation
Artifact track

structural asset holding the configuration of a track in the EDL

Artifact source associated with : Track

+ +
Artifact db
+

registry holding known Asset instances.

+

Artifact source associated with : DB

@@ -517,7 +521,7 @@ Documentation

2 Package ProcessingLayer

-

2.1 Package AssetManager

+

2.1 Package Asset

2.1.1 Class View Assets

@@ -531,6 +535,7 @@ Documentation
Class Asset
Class Media
+
Class Proc
Class Struct
Class Meta
@@ -542,7 +547,13 @@ Documentation
Class Codec
Class Track
Class OutPort
+
Class ProcPatt
Class Dataset
+
Class DB
+
+
+
Class DoAttach
+
Class DoRecurse
@@ -564,6 +575,7 @@ Documentation
Class Clip
+
Class Effect
Class Meta
diff --git a/doc/devel/uml/index_65.html b/doc/devel/uml/index_65.html index aba7859ea..b2473717c 100644 --- a/doc/devel/uml/index_65.html +++ b/doc/devel/uml/index_65.html @@ -38,16 +38,16 @@ AssetclassSuperinterface describing especially the bookeeping properties of Assets assetartifactSuperinterface: bookeeping view of "things" present in the session assetpackagesourcecode package

Asset Management +Assetpackage 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 diff --git a/doc/devel/uml/index_66.html b/doc/devel/uml/index_66.html index 13b6639cd..1d3f8104b 100644 --- a/doc/devel/uml/index_66.html +++ b/doc/devel/uml/index_66.html @@ -39,6 +39,7 @@ 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 builderfacadeartifactFacade and service access point for the Builder Subsystem building the Engineactivity +BuildInstructclass buildProcessoroperation diff --git a/doc/devel/uml/index_67.html b/doc/devel/uml/index_67.html index 2db26987f..9cba96588 100644 --- a/doc/devel/uml/index_67.html +++ b/doc/devel/uml/index_67.html @@ -27,24 +27,24 @@ 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 +class instanceclass instance Clipclassbookkeeping (asset) view of a media clip. clipartifacta Media Clip clipartifactbookkeeping (asset) view of a media clip. @@ -59,6 +59,9 @@ CommonLibcomponent CommonLibpackage complete Render Engineactivity object +componentsrelation +CompoundClipclass +CompoundMediaclasscompound of several elementary media tracks,
e.g. the individual media streams found in one media file ConditionclassI provided a reworked Condition class in my cinelerra2 repository Configclass configureoperation @@ -78,6 +81,7 @@ controllerfacadeartifactFacade and service access point for the Proc Layer Controller ControllerFacadecomponent create ProcNodeopaque activity action +createClipoperationcreate a (possibly compound) Clip refering to this media, ready to be added to the EDL. currFramerelation diff --git a/doc/devel/uml/index_68.html b/doc/devel/uml/index_68.html index d35b2ba3d..81b2f665f 100644 --- a/doc/devel/uml/index_68.html +++ b/doc/devel/uml/index_68.html @@ -20,16 +20,20 @@ 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 +DBclassImplementation of the registry holding all Asset instances known to the Asset Manager subsystem. As of 8/2007 implemented by a hashtable. +dbartifactregistry holding known Asset instances. 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 Paramsexpansion region determine Render Paramsopaque activity action +determine Render Paramsexpansion region devnullclass instance DirectPlacementclass Dispatchercomponent +DoAttachclass +DoRecurseclass diff --git a/doc/devel/uml/index_69.html b/doc/devel/uml/index_69.html index caf706b98..0c7bddcba 100644 --- a/doc/devel/uml/index_69.html +++ b/doc/devel/uml/index_69.html @@ -18,8 +18,8 @@ - + diff --git a/doc/devel/uml/index_70.html b/doc/devel/uml/index_70.html index e83866113..3eb653613 100644 --- a/doc/devel/uml/index_70.html +++ b/doc/devel/uml/index_70.html @@ -32,9 +32,9 @@ - - + + diff --git a/doc/devel/uml/index_71.html b/doc/devel/uml/index_71.html index be8d16dcd..84b5e66ce 100644 --- a/doc/devel/uml/index_71.html +++ b/doc/devel/uml/index_71.html @@ -36,6 +36,7 @@ + diff --git a/doc/devel/uml/index_72.html b/doc/devel/uml/index_72.html index 7273d52e0..58b669cd2 100644 --- a/doc/devel/uml/index_72.html +++ b/doc/devel/uml/index_72.html @@ -21,6 +21,7 @@ + diff --git a/doc/devel/uml/index_73.html b/doc/devel/uml/index_73.html index f6ab37369..3701bbfcd 100644 --- a/doc/devel/uml/index_73.html +++ b/doc/devel/uml/index_73.html @@ -21,9 +21,10 @@ - + + diff --git a/doc/devel/uml/index_77.html b/doc/devel/uml/index_77.html index 1219f0f58..793afbce2 100644 --- a/doc/devel/uml/index_77.html +++ b/doc/devel/uml/index_77.html @@ -27,8 +27,8 @@ - + diff --git a/doc/devel/uml/index_78.html b/doc/devel/uml/index_78.html index 876afc08d..d4d5daa81 100644 --- a/doc/devel/uml/index_78.html +++ b/doc/devel/uml/index_78.html @@ -20,6 +20,7 @@ +
NameKindDescription
edlartifactthe (high level) Edit Decision List within the current Session
EDLcomponent
EDLclass
EDLcomponent
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
fixedplacementartifact
Fixtureactivity object
fixtureartifactthe (low level) representation of the EDL with concrete placement data
Fixtureclass
Fixturecomponent
fixturerelation
Fixturecomponent
Fixtureclass
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
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, ...
getIDoperation
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
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
howtoProcoperation@return descriptor how to build a render pipeline corresponding to this media
Hubclass
hubartifactspecial ProcNode used to build data distributing connections
HUEclass instance
In Memory Databaseclass diagram
inFixtureactivity action pin
inputclass instance
inputclass instance
inputclass instance
inputclass instance
instanceoperation
instructionsrelation
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
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
metaartifactabstract base class of all MObjects representing meta data or processing instructions
Metaclass
mobjectartifactKey Abstraction: A Media Object in the Session
mobjectpackagesourcecode package

MObject Subsystem
including the Session (EDL), Builder and Processing Controller
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.
nodesrelation
diff --git a/doc/devel/uml/index_79.html b/doc/devel/uml/index_79.html index 2a52fbc5c..a8226191c 100644 --- a/doc/devel/uml/index_79.html +++ b/doc/devel/uml/index_79.html @@ -19,8 +19,8 @@ NameKindDescription offsetattributeOffset the actual position by this (time) value relative to the anchor point. TODO: Representation? 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 ouputclass instance OutPortclassstructural asset corresponding to some port generating media output outportartifactstructural asset corresponding to some port generating media output diff --git a/doc/devel/uml/index_80.html b/doc/devel/uml/index_80.html index 2a0a4cf37..27ab841fa 100644 --- a/doc/devel/uml/index_80.html +++ b/doc/devel/uml/index_80.html @@ -34,6 +34,7 @@ PluginAdapterclassAdapter used to integrage an effects processor in the render pipeline pluginadapterartifactAdapter for integrating various Effect processors in the render pipeline pnodenode +pointattributeidentifying the point where the nodes should be attached Posix Threads Abstractionclass viewC++ wrapers for pthreads Prefetchclass Previewclassalternative version of the media data, probably with lower resolution @@ -50,6 +51,7 @@ ProcNodecomponent ProcNodeclassKey abstraction of the Render Engine: A Data processing Node procnodeartifactKey abstraction of the Render Engine: a Processing Node +ProcPattclass ProjectorclassSpecial video processing node used to scale and translate image data. projectorartifactvideo ProcNode for scaling and translating image data providerrelation diff --git a/doc/devel/uml/index_82.html b/doc/devel/uml/index_82.html index 84c63934b..5eb845aba 100644 --- a/doc/devel/uml/index_82.html +++ b/doc/devel/uml/index_82.html @@ -18,11 +18,12 @@ - + + - + diff --git a/doc/devel/uml/index_83.html b/doc/devel/uml/index_83.html index dc307832f..e5e139dc4 100644 --- a/doc/devel/uml/index_83.html +++ b/doc/devel/uml/index_83.html @@ -37,10 +37,11 @@ + - + @@ -55,6 +56,7 @@ +
NameKindDescription
refPointclass instance
registeroperationregisters an asset object in the internal DB, providing its unique key
regoperationregisters an asset object in the internal DB, providing its unique key
registryrelation@internal Table or DB holding all registered asset instances.
relativeplacementartifactPlacement implemnetaion providing various ways of attaching a MObject to another one
RelativePlacementclass
relTypeattributethe kind of relation denoted by this Placement
RelTypeclassthe possible kinds of RelativePlacements
relTypeattributethe kind of relation denoted by this Placement
removeoperationremove the given asset <i>together with all its dependants</i> from the internal DB
Render Entitiesclass diagram
Render Requestactivity parameter
setup Build Paramsopaque activity action
setup StateProxyopaque activity action
shortDescattributeuser visible Name-ID. To be localized.
SimpleClipclass
SmartPointerclass
SmartPointersclass view
sourcerelationmedia source of this clip
sourcerelationthe media source this clip referes to
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
Structclasskey abstraction: structural asset
structartifactkey abstraction: structural asset
subjectrelation
subPatternrelation
diff --git a/doc/devel/uml/index_84.html b/doc/devel/uml/index_84.html index 044cdcb55..90cbd038f 100644 --- a/doc/devel/uml/index_84.html +++ b/doc/devel/uml/index_84.html @@ -35,16 +35,17 @@ trackartifactstructural asset holding the configuration of a track in the EDL trackartifactdescriptor for one track in the Session Trackclass +tracksrelationelementary media assets comprising this compound tracksrelation tracksrelation Trafoclass trafoartifacttransforming processing Node 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_86.html b/doc/devel/uml/index_86.html index 1ca19fe37..191657818 100644 --- a/doc/devel/uml/index_86.html +++ b/doc/devel/uml/index_86.html @@ -20,22 +20,22 @@ 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 +vid1class instance +vid_aclass instance +vid_Aclass instance vid_aclass instance vid_Aclass instance -vid_Aclass instance -vid_aclass instance -videoclass instance -videoclass instance +vid_Aclass instance videoclass instance videoclass instance +videoclass instance +videoclass instance video1class 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/packages.html b/doc/devel/uml/packages.html index 80440f99d..0a87e3bd1 100644 --- a/doc/devel/uml/packages.html +++ b/doc/devel/uml/packages.html @@ -17,7 +17,7 @@ - + diff --git a/doc/devel/uml/public_operations.html b/doc/devel/uml/public_operations.html index 45b6f8e10..728368c81 100644 --- a/doc/devel/uml/public_operations.html +++ b/doc/devel/uml/public_operations.html @@ -22,6 +22,7 @@ + @@ -30,26 +31,27 @@ + + - - + + - diff --git a/doc/devel/uml/public_properties.html b/doc/devel/uml/public_properties.html index 5c6c3f844..d1d591657 100644 --- a/doc/devel/uml/public_properties.html +++ b/doc/devel/uml/public_properties.html @@ -20,7 +20,9 @@ + +
assetsrcsourcecode package

Asset Management
AssetManager
Asset
backendsrcsourcecode package

Data backend classes here...
BackendLayer
Builder
buildEngineBuilderFacadeMain Operation of the Builder: create a render engine for a given part of the timeline
buildProcessorPathManager
configureToolFactory
createClipMediacreate a (possibly compound) Clip refering to this media, ready to be added to the EDL.
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
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, ...
getIDAssetManager
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
howtoProcMedia@return descriptor how to build a render pipeline corresponding to this media
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.
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
treatNodeCreatorTool
treatSegmentationTool
treatSegmentationTool
treatSegmentationTool
treatSegmentationTool
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
categoryAssetprimary tree like classification of the asset
idAssetAsset primary key.
nameAssetelement ID, comprehensible but sanitized. The tuple (category, name, org) is unique.
nodesDoAttach
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".
pointDoAttachidentifying the point where the nodes should be attached
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 11a8c01b5..64b57bac8 100644 --- a/uml/cinelerra3/128133 +++ b/uml/cinelerra3/128133 @@ -1,6 +1,6 @@ format 40 "Asset" // ProcessingLayer::Asset - revision 10 + revision 11 modified_by 5 "hiv" // class settings //class diagram settings @@ -682,6 +682,16 @@ ${inlines} classrelation_ref 143109 // b multiplicity "" parent class_ref 136965 // Struct end + + classrelation 143621 // instructions () + relation 141701 *--> + stereotype "vector" + a role_name "instructions" multiplicity "1..*" const_relation protected + cpp default " ${comment}${static}${mutable}${volatile}${const}${stereotype}<${type}> ${name}${value}; +" + classrelation_ref 143621 // instructions () + b multiplicity "1" parent class_ref 139013 // BuildInstruct + end end class 138245 "Dataset" @@ -738,5 +748,86 @@ ${inlines} b multiplicity "" parent class_ref 128901 // Clip end end + + class 139013 "BuildInstruct" + visibility package + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + end + + class 139141 "DoAttach" + visibility package + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + classrelation 143749 // + relation 141829 ---|> + a public + cpp default "${type}" + classrelation_ref 143749 // + b multiplicity "" parent class_ref 139013 // BuildInstruct + end + + classrelation 144133 // nodes () + relation 142213 o--> + stereotype "vector" + a role_name "nodes" multiplicity "1..*" const_relation public + cpp default " ${comment}${static}${mutable}${volatile}${const}${type}* ${name}${value}; +" + classrelation_ref 144133 // nodes () + b multiplicity "" parent class_ref 136837 // Proc + end + + attribute 131461 "point" + const_attribute public explicit_type "string" + cpp_decl " ${comment}${static}${mutable}${volatile}${const}${type} ${name}${value}; +" + java_decl "" + idl_decl "" + comment "identifying the point where the nodes should be attached" + end + end + + class 139269 "DoRecurse" + visibility package + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + classrelation 143877 // + relation 141957 ---|> + a public + cpp default "${type}" + classrelation_ref 143877 // + b multiplicity "" parent class_ref 139013 // BuildInstruct + end + + classrelation 144005 // subPattern () + relation 142085 ---> + a role_name "subPattern" multiplicity "1" const_relation protected + cpp default " ${comment}${static}${mutable}${volatile}${const}${type}* ${name}${value}; +" + classrelation_ref 144005 // subPattern () + b multiplicity "*" parent class_ref 138757 // ProcPatt + end + end end end diff --git a/uml/cinelerra3/130309.diagram b/uml/cinelerra3/130309.diagram index b79866fd7..bfff7acc4 100644 --- a/uml/cinelerra3/130309.diagram +++ b/uml/cinelerra3/130309.diagram @@ -10,7 +10,7 @@ classcanvas 128133 class_ref 136581 // AssetManager end packagecanvas 128517 package_ref 128133 // Asset - show_context_mode namespace xyzwh 217 182 1994 608 534 + show_context_mode namespace xyzwh 215 182 1994 610 571 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 259 330 2005 @@ -75,6 +75,18 @@ classcanvas 135813 class_ref 138757 // ProcPatt 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 638 506 2000 end +classcanvas 136709 class_ref 139141 // DoAttach + 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 567 688 2000 + end +classcanvas 136837 class_ref 139013 // BuildInstruct + 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 605 620 2000 + end +classcanvas 136965 class_ref 139269 // DoRecurse + 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 639 688 2000 + end relationcanvas 129157 relation_ref 138117 // geometry VHV from ref 128645 z 1999 to point 293 307 @@ -172,6 +184,29 @@ relationcanvas 136197 relation_ref 141317 // line 136325 z 1999 to ref 135813 no_role_a no_role_b no_multiplicity_a no_multiplicity_b +relationcanvas 137093 relation_ref 141701 // + from ref 135813 z 1999 stereotype "<>" xyz 632 569 3000 to ref 136837 + role_a_pos 655 600 3000 no_role_b + multiplicity_a_pos 622 599 3000 multiplicity_b_pos 643 557 3000 +relationcanvas 137221 relation_ref 141829 // + from ref 136709 z 1999 to ref 136837 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 137349 relation_ref 141957 // + from ref 136965 z 1999 to ref 136837 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 137477 relation_ref 142085 // + from ref 136965 z 1999 to point 728 656 + line 137605 z 1999 to point 728 562 + line 137733 z 1999 to ref 135813 + role_a_pos 704 524 3000 no_role_b + multiplicity_a_pos 736 560 3000 multiplicity_b_pos 705 688 3000 +relationcanvas 137861 relation_ref 142213 // + from ref 136709 z 1999 stereotype "<>" xyz 538 659 3000 to point 595 388 + line 137989 z 1999 to ref 128773 + role_a_pos 559 553 3000 no_role_b + multiplicity_a_pos 571 541 3000 no_multiplicity_b line 128261 -_-_ geometry HV from ref 128005 z 1999 to point 331 150 line 128389 z 1999 to ref 128133 diff --git a/uml/cinelerra3/130437.diagram b/uml/cinelerra3/130437.diagram index 1ed28785b..afc8cb1fb 100644 --- a/uml/cinelerra3/130437.diagram +++ b/uml/cinelerra3/130437.diagram @@ -2,19 +2,19 @@ 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 + xyz 463 147 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 533 42 2005 + xyz 527 41 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 + xyz 530 231 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 + xyz 535 147 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 @@ -30,43 +30,43 @@ classcanvas 129157 class_ref 128773 // AbstractMO 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 + xyz 265 278 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 + xyz 390 406 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 + xyz 314 476 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 + xyz 311 406 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 + xyz 149 597 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 + xyz 206 597 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 + xyz 193 472 2000 end packagecanvas 135685 package_ref 128261 // MObject xyzwh 24 10 1994 187 356 packagecanvas 135813 package_ref 128133 // Asset - xyzwh 454 10 1994 367 311 + xyzwh 447 9 1994 391 570 note 136837 "the Builder implements each Clip by a source node and maybe some codec" xyzwh 53 376 2000 219 61 classcanvas 137221 class_ref 138501 // CompoundMedia 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 606 148 3005 + xyz 600 147 3005 end classcanvas 138373 class_ref 138629 // CompoundClip 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 @@ -74,16 +74,40 @@ classcanvas 138373 class_ref 138629 // CompoundClip end classcanvas 138885 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 758 51 2005 + xyz 735 49 2005 end classcanvas 139013 class_ref 138757 // ProcPatt 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 751 115 2000 + xyz 728 113 2000 end classcanvas 140293 class_ref 138885 // SimpleClip 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 32 293 3005 end +classcanvas 140805 class_ref 139013 // BuildInstruct + 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 694 231 2000 + end +classcanvas 141061 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 598 392 2000 + end +classcanvas 141189 class_ref 139141 // DoAttach + 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 656 299 2000 + end +classcanvas 141317 class_ref 139269 // DoRecurse + 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 728 299 2000 + end +classcanvas 142725 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 564 480 2004 + end +classcanvas 142981 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 618 480 2004 + end relationcanvas 128517 relation_ref 139141 // from ref 128261 z 1999 to ref 128389 no_role_a no_role_b @@ -108,70 +132,70 @@ relationcanvas 129669 relation_ref 129285 // 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 + from ref 131205 z 1999 to point 331 372 + line 132485 z 1999 to point 302 372 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 + from ref 130309 z 1999 to point 235 278 + line 132869 z 1999 to point 235 308 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 + role_a_pos 217 286 3000 no_role_b + no_multiplicity_a multiplicity_b_pos 248 305 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 + from ref 130821 z 1999 to point 412 372 + line 134021 z 1999 to point 302 372 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 + from ref 134277 z 1999 to point 173 564 + line 134917 z 1999 to point 230 564 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 + from ref 134405 z 1999 to point 230 564 + line 135429 z 1999 to point 230 564 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 25 + from ref 130821 z 1999 to point 427 382 + line 136069 z 1999 to point 427 24 line 136197 z 1999 to ref 128133 no_role_a no_role_b no_multiplicity_a no_multiplicity_b relationcanvas 136965 relation_ref 140165 // geometry VH - from ref 128005 z 1999 to point 489 78 + from ref 128005 z 1999 to point 483 77 line 137093 z 1999 to ref 128133 - role_a_pos 475 61 3000 no_role_b - multiplicity_a_pos 516 89 3000 multiplicity_b_pos 477 123 3000 + role_a_pos 469 60 3000 no_role_b + multiplicity_a_pos 510 88 3000 multiplicity_b_pos 471 122 3000 relationcanvas 137349 relation_ref 140421 // from ref 137221 z 1999 to ref 128133 no_role_a no_role_b no_multiplicity_a no_multiplicity_b relationcanvas 137477 relation_ref 140549 // - from ref 137221 z 1999 to point 654 77 - line 137733 z 1999 stereotype "<>" xyz 658 123 3000 to ref 128133 - role_a_pos 615 55 3000 no_role_b - multiplicity_a_pos 590 122 3000 multiplicity_b_pos 642 123 3000 + from ref 137221 z 1999 to point 648 76 + line 137733 z 1999 stereotype "<>" xyz 652 122 3000 to ref 128133 + role_a_pos 609 54 3000 no_role_b + multiplicity_a_pos 584 121 3000 multiplicity_b_pos 636 122 3000 relationcanvas 137861 relation_ref 140677 // from ref 128901 z 1999 to point 218 232 - line 138245 z 1999 to point 383 49 - line 137989 z 1999 to point 492 49 + line 138245 z 1999 to point 377 48 + line 137989 z 1999 to point 486 48 line 138117 z 1999 to ref 128133 - role_a_pos 392 51 3000 no_role_b - multiplicity_a_pos 516 77 3000 multiplicity_b_pos 149 235 3000 + role_a_pos 386 50 3000 no_role_b + multiplicity_a_pos 510 76 3000 multiplicity_b_pos 149 235 3000 relationcanvas 138501 relation_ref 140805 // from ref 138373 z 1999 to ref 128901 no_role_a no_role_b @@ -181,8 +205,8 @@ relationcanvas 139141 relation_ref 141189 // no_role_a no_role_b no_multiplicity_a no_multiplicity_b relationcanvas 139397 relation_ref 141317 // - from ref 128133 z 1999 to point 599 104 - line 140165 z 1999 to point 697 104 + from ref 128133 z 1999 to point 593 103 + line 140165 z 1999 to point 684 103 line 139781 z 1999 to ref 139013 no_role_a no_role_b no_multiplicity_a no_multiplicity_b @@ -195,4 +219,40 @@ relationcanvas 140549 relation_ref 141573 // line 140677 z 1999 to ref 128901 role_a_pos 149 247 3000 no_role_b multiplicity_a_pos 160 260 3000 multiplicity_b_pos 142 268 3000 +relationcanvas 140933 relation_ref 141701 // + from ref 139013 z 1999 stereotype "<>" xyz 713 174 3000 to ref 140805 + role_a_pos 745 206 3000 no_role_b + multiplicity_a_pos 712 206 3000 multiplicity_b_pos 733 164 3000 +relationcanvas 141445 relation_ref 141829 // + geometry VHV + from ref 141189 z 1999 to point 685 284 + line 141957 z 1999 to point 732 284 + line 142085 z 1999 to ref 140805 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 141573 relation_ref 141957 // + geometry VHV + from ref 141317 z 1999 to point 761 284 + line 141701 z 1999 to point 732 284 + line 141829 z 1999 to ref 140805 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 142213 relation_ref 142085 // + from ref 141317 z 1999 to point 812 270 + line 142341 z 1999 to point 812 131 + line 142469 z 1999 to ref 139013 + role_a_pos 780 159 3000 no_role_b + multiplicity_a_pos 794 142 3000 multiplicity_b_pos 794 299 3000 +relationcanvas 142597 relation_ref 142213 // + from ref 141189 z 1999 stereotype "<>" xyz 656 360 3000 to ref 141061 + role_a_pos 643 374 3000 no_role_b + multiplicity_a_pos 614 367 3000 no_multiplicity_b +relationcanvas 142853 relation_ref 139269 // + from ref 142725 z 1999 to ref 141061 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 143109 relation_ref 139397 // + from ref 142981 z 1999 to ref 141061 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b end diff --git a/uml/cinelerra3/5.session b/uml/cinelerra3/5.session index 27d9ec386..41ab92dac 100644 --- a/uml/cinelerra3/5.session +++ b/uml/cinelerra3/5.session @@ -1,14 +1,14 @@ window_sizes 1140 783 270 860 633 71 diagrams - classdiagram_ref 130309 // Asset Kinds - 860 607 100 4 120 0 + active classdiagram_ref 130309 // Asset Kinds + 860 633 100 4 180 0 classdiagram_ref 128133 // Session structure - 688 506 100 4 180 0 - active classdiagram_ref 130437 // Media-Asset Relations + 688 506 100 4 120 0 + classdiagram_ref 130437 // Media-Asset Relations 860 633 100 4 0 0 end show_stereotypes -selected classdiagram_ref 130437 // Media-Asset Relations +selected objectdiagram_ref 128773 // EDL Example1 open package_ref 128005 // design @@ -19,10 +19,13 @@ open class_ref 138501 // CompoundMedia class_ref 137349 // Clip class_ref 138757 // ProcPatt + class_ref 139141 // DoAttach + class_ref 139269 // DoRecurse class_ref 128901 // Clip class_ref 138629 // CompoundClip package_ref 128389 // RenderEngine + usecaseview_ref 128005 // Renderengine Use 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 9608f43c3..7d03110f4 100644 --- a/uml/cinelerra3/cinelerra3.prj +++ b/uml/cinelerra3/cinelerra3.prj @@ -1,6 +1,6 @@ format 40 "cinelerra3" - revision 27 + revision 28 modified_by 5 "hiv" cpp_root_dir "../../src/" diff --git a/wiki/renderengine.html b/wiki/renderengine.html index cd9a0e683..53f84aa82 100644 --- a/wiki/renderengine.html +++ b/wiki/renderengine.html @@ -1305,6 +1305,19 @@ From experiences with other middle scale projects, I prefer having the test code [img[Example: Interfaces/Namespaces of the ~Session-Subsystems|uml/fig130053.png]] +
+
Opening and accessing media files on disk poses several problems, most of which belong to the domain of cinelerra's data backend. Here, we focus on the questions related to making media data available to the EDL and the render engine. Each media will be represented by an MediaAsset object, which indeed could be a compound object (in case of MultichannelMedia). Building this asset object thus includes getting informations from the real file on disk. For delegating this to the backend, we use the following query interface:
+* {{{openFile(char* name)}}} requests accessing the file and yields some (opaque) handle when successful.
+* {{{getChannel(int)}}} will then be issued in sequence with ascending index numbers, until it returns {{{NULL}}}.
+* the returned struct (pointer) will provide the following information:
+** some identifier which can be used to create a name for the corresponding media (channel) asset
+** some identifier characterizing the access method (codec) needed to get at the media data. This should be rather a high level description of the media stream type, e.g. "H264"
+** some (opaque) handle usable for accessing this specific stream. When the render engine later on pulls data for this channel, it will pass this handle down to the backend.
+
+{{red{to be defined in more detail later...}}}
+
+{{red{how to create a test stub for this interface...?}}}
+
All sorts of "things" to be placed and manipulated by the user in the EDL. This interface abstracts the details and just provides
 * a duration
@@ -1391,7 +1404,7 @@ For the case in question this seems to be the ''resource allocation is construct
 And, last but not least, doing all actual allocations is the job of the backend. Exceptions being long-lived objects, like the Session or the EDL, which are created once and don't bear the danger of causing memory pressure. Besides that, the ProcLayer code shouldn't issue "new" and "delete", rather it should use some central [[Factories]] for all allocation and freeing, so we can redirect these calls down to the backend, which may use pooling or special placement allocators or the like. The rationale is, for modern hardware/architectures, care has to be taken with heap allocations, esp. with many small objects and irregular usage patterns.
 
-
+
Based on practical experiences, Ichthyo tends to consider Multichannel Media as the base case, while counting media files providing just one single media stream as exotic corner cases. This may seem counter intuitive at first sight; you should think of  it as an attempt to avoid right from start some of the common shortcomings found in many video editors, especially
 * having to deal with keeping a "link" between audio and video clips
 * silly limitations on the supported audio setups (e.g. mono, stereo and 5.1)
@@ -1408,7 +1421,7 @@ So, when creating a clip out of such a compound media asset, the clip has to be
 * we can create a Clip (MObject) from each Media, which will be linked back to the media asset internally.
 * moreover, creating a Clip will create and register a Clip asset as well, and this Clip asset will be tied to the original Clip and will show up in some special Category
 * media can be compound and the created Clips will mirror this compound structure
-* {{red{to be defined}}} a way to distinguish Elementay Clips (non-compound) and to express that only such can be passed to the Builder
+* we distinguish elementay (non-compound) Clips from compound clips by concrete subtype. The builder can only handle elementary clips, because he needs to build a separate pipeline for every output channel. So the work of splitting common effect stacks for clips with several channels needs to be done when calculating the Fixture for the current EDL. The Builder expects to be able to build the render nodes corresponding to each entity found in the Fixture one by one.
 * the Builder gets at the ProcPatt (descriptor) of the underlying media for each clip and uses this description as a template to build the render pipeline. That is, the ProcPatt specifies the codec asset and maybe some additional effect assets (deinterlace, scale) necessary for feeding media data corresponding to this clip/media into the render nodes network.
@@ -2021,7 +2034,7 @@ DAMAGE. //Note, we have yet to specify how exactly the building and rendering will work together with the backend. There are several possibilities how to structure the Playlist//
-
+
Open issues, Things to be worked out, Problems still to be solved... 
 
 !!Parameter Handling
@@ -2048,7 +2061,7 @@ Users accustomed with modern GUI applications typically expect that //everything
 !!Compound and Multiplicity
 Simple relations can be hard wired. But, on the contrary, it would be as naive to define a Clip as having a Video track and two audio tracks, as it would be naive to overlook the problem of holding video and corresponding audio together. And, moreover, the default case has to be processed in a //straight forward// fashion, with as few tests and decisions as possible. So, basically each component participating in getting the core processing done has to mirror the structure pattern of the other parts, so that  processing can be done without testing and forking. But this leaves us with the problem where to put the initial knowledge about the structural pattern used for building up the compound structures and &mdash; especially &mdash; the problem how to treat different kinds of structural patterns, how to detect the pattern to be applied and how to treat multiple instances of the same structural pattern.
 
-One example of this problem is the [[handling of multichannel media|MultichannelMedia]]. Following the above reasoning, we end with having a [["structural pattern"|StructPatt]], typically one video stream with MPEG decoder and a pair of audio streams which need either to be routed to some "left" and "right" output ports, or have to be passed through a panning filter accordingly. Now the problem is: //create a new instance of this structure for each new media, or detect which media to subsume under a existing pattern instance.//
+One example of this problem is the [[handling of multichannel media|MultichannelMedia]]. Following the above reasoning, we end with having a [["structural processing pattern"|ProcPatt]], typically one video stream with MPEG decoder and a pair of audio streams which need either to be routed to some "left" and "right" output ports, or have to be passed through a panning filter accordingly. Now the problem is: //create a new instance of this structure for each new media, or detect which media to subsume under a existing pattern instance.//
The middle Layer of our current Architecture plan, i.e. the layer managing all processing and manipulation, while the actual data handling is done in the backend and the user interaction belongs to the GUI Layer.
@@ -2061,6 +2074,19 @@ One example of this problem is the [[handling of multichannel media|Multichannel
 
A data processing node within the Render Engine. Its key feature is the possibility to pull from it one (freely addressable) [[Frame]] of calculated data. Further, each ~ProcNode has the ability to be wired with other nodes and [[Parameter Providers|ParamProvider]]
 
+
+
This special type of [[structural Asset|StructAsset]] represents information how to build some part of the render engine's processing nodes network. It can be thought of as a template or blueprint for construction. Most notably, it is used for creating nodes reading, decoding and delivering source media material to the render network. Each [[media Asset|MediaAsset]] has associated processing patterns describing the codecs and other transformations needed to get at the media data of this asset. (and because media assets are typically compound objects, the referred ~ProcPatt will be compound too). Obviously, the possibilities opened by using processing patterns go far beyond.
+
+Technically, a processing pattern is a list of building instructions, which will be //executed// by the [[Builder]] on the render node network under construction. This implies the possibility to define further instruction kinds when needed in future; at the moment the relevant sorts of instructions are
+* attach the given sequence of nodes to the specified point
+* recursively execute a nested ~ProcPatt
+More specifically, a sequence of nodes is given by a sequence of prototypical effect and codec assets (and from each of them we can create the corresponding render node). And the point to attach these nodes is given by an identifier &mdash; in most cases just "{{current}}", denoting the point the builder was just working at, when he treated some MObject which in turn yielded this processing pattern in question.
+
+Like all [[structural assets|StructAsset]], ~ProcPatt employs a special naming scheme within the asset name field, which directly mirrors its purpose and allows to bind to existing processing pattern instances when needed. The idea is letting all assets in need of a similar processing pattern refer to one shared ~ProcPatt instance. For example, within a MPEG video media asset, at some point there will be a ~ProcPatt labeled "{{{stream(mpeg)}}}". In consequence, all MPEG video will use the same pattern of node wiring. And, of course, this pattern could be changed, either globally, or by binding a single clip to some other processing pattern (for making a punctual exception from the general rule)
+
+//Note,// nothing has been said about how processing patterns are defined. One can expect for some //default patterns// beeing defined somewhere in the application, any session could overrule these defaults, and when there is no default, we can expect some mechanism deriving sensible fallback patterns //for every specific use case// of processing patterns. See the problem of [[Loading Media]] as an example.
+
+
a given Render Engine configuration is a list of Processors. Each Processor in turn contains a Graph of ProcNode.s to do the acutal data processing. In order to cary out any calculations, the Processor needs to be called with a StateProxy containing the state information for this RenderProcess
 
From cc3d3397a7c958a54918abab9c358a8652af8a9e Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Sat, 22 Sep 2007 16:00:36 +0200 Subject: [PATCH 05/14] documented the new design in more detail --- doc/devel/uml/class135557.html | 2 +- doc/devel/uml/class137989.html | 3 +- doc/devel/uml/class139397.html | 22 +++++ doc/devel/uml/class139525.html | 20 +++++ doc/devel/uml/classdiagrams.html | 3 + doc/devel/uml/classes.html | 2 + doc/devel/uml/classes_list.html | 2 + doc/devel/uml/componentdiagrams.html | 1 + doc/devel/uml/fig128005.png | Bin 38305 -> 42604 bytes doc/devel/uml/fig130693.png | Bin 0 -> 12650 bytes doc/devel/uml/fig130821.png | Bin 0 -> 14943 bytes doc/devel/uml/fig130949.png | Bin 0 -> 7478 bytes doc/devel/uml/fig131077.png | Bin 0 -> 19924 bytes doc/devel/uml/fig131205.png | Bin 0 -> 15040 bytes doc/devel/uml/index.html | 59 ++++++++++++-- doc/devel/uml/index_60.html | 4 +- doc/devel/uml/index_65.html | 7 +- doc/devel/uml/index_66.html | 2 + doc/devel/uml/index_67.html | 28 +++---- doc/devel/uml/index_68.html | 3 +- doc/devel/uml/index_70.html | 2 +- doc/devel/uml/index_73.html | 4 +- doc/devel/uml/index_76.html | 1 + doc/devel/uml/index_77.html | 4 + doc/devel/uml/index_79.html | 4 +- doc/devel/uml/index_80.html | 1 + doc/devel/uml/index_83.html | 5 +- doc/devel/uml/index_84.html | 6 +- doc/devel/uml/index_85.html | 1 + doc/devel/uml/index_86.html | 20 ++--- doc/devel/uml/index_87.html | 1 + doc/devel/uml/navig.html | 2 +- doc/devel/uml/usecasediagrams.html | 22 +++++ doc/devel/uml/usecases.html | 25 ++++++ src/proc/asset/media.hpp | 6 +- uml/cinelerra3/128005 | 28 ++++++- uml/cinelerra3/128005.diagram | 14 +++- uml/cinelerra3/128133 | 54 +++++++++++- uml/cinelerra3/128138 | 8 +- uml/cinelerra3/128389 | 4 +- uml/cinelerra3/128389.diagram | 20 ++--- uml/cinelerra3/129157 | 118 ++++++++++++++++++++++++++- uml/cinelerra3/130053 | 3 +- uml/cinelerra3/130053.diagram | 4 + uml/cinelerra3/130309.diagram | 92 ++++++++++----------- uml/cinelerra3/130693.diagram | 23 ++++++ uml/cinelerra3/130821.diagram | 37 +++++++++ uml/cinelerra3/130949.diagram | 21 +++++ uml/cinelerra3/131077.diagram | 92 +++++++++++++++++++++ uml/cinelerra3/131205.diagram | 79 ++++++++++++++++++ uml/cinelerra3/5.session | 35 +++----- uml/cinelerra3/cinelerra3.prj | 2 +- wiki/renderengine.html | 26 +++++- 53 files changed, 768 insertions(+), 154 deletions(-) create mode 100644 doc/devel/uml/class139397.html create mode 100644 doc/devel/uml/class139525.html create mode 100644 doc/devel/uml/fig130693.png create mode 100644 doc/devel/uml/fig130821.png create mode 100644 doc/devel/uml/fig130949.png create mode 100644 doc/devel/uml/fig131077.png create mode 100644 doc/devel/uml/fig131205.png create mode 100644 doc/devel/uml/usecasediagrams.html create mode 100644 doc/devel/uml/usecases.html create mode 100644 uml/cinelerra3/130693.diagram create mode 100644 uml/cinelerra3/130821.diagram create mode 100644 uml/cinelerra3/130949.diagram create mode 100644 uml/cinelerra3/131077.diagram create mode 100644 uml/cinelerra3/131205.diagram diff --git a/doc/devel/uml/class135557.html b/doc/devel/uml/class135557.html index fdcef57fa..cb97dca6f 100644 --- a/doc/devel/uml/class135557.html +++ b/doc/devel/uml/class135557.html @@ -17,7 +17,7 @@

Declaration :

Directly inherited by : Config External Invalid Logic State

-

Artifact : error

+

Artifact : error, Component(s) : CommonLib

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

diff --git a/doc/devel/uml/class137989.html b/doc/devel/uml/class137989.html index 5ee601cc6..6c5bf6158 100644 --- a/doc/devel/uml/class137989.html +++ b/doc/devel/uml/class137989.html @@ -17,7 +17,8 @@

Declaration :

  • C++ : class Track : public Struct

structural asset holding the configuration of a track in the EDL

Artifact : track

-
+ +
Relation wiringTemplate (<unidirectional association>)

Declaration :

  • Uml : # wiringTemplate : ProcPatt, multiplicity : 1
  • C++ : protected: ProcPatt* wiringTemplate

All public operations : enable , getDependant , getParents , isActive

diff --git a/doc/devel/uml/class139397.html b/doc/devel/uml/class139397.html new file mode 100644 index 000000000..1bfe82fbf --- /dev/null +++ b/doc/devel/uml/class139397.html @@ -0,0 +1,22 @@ + + + + + + +Class MediaFactory + + + + + +
Class MediaFactory
+

+ + + + +

Declaration :

  • C++ : class MediaFactory

Depends on BackendLayer

Depends on BackendLayer

specialized Asset Factory for configuring (new) media asset instances based on existing media files on disk; can create placeholder assets as well

Artifact : media

+
+ + diff --git a/doc/devel/uml/class139525.html b/doc/devel/uml/class139525.html new file mode 100644 index 000000000..e5acd9bec --- /dev/null +++ b/doc/devel/uml/class139525.html @@ -0,0 +1,20 @@ + + + + + + +Class MediaAccessFacade + + + + + +
Class MediaAccessFacade
+

+ + + + +

Declaration :

  • C++ : class MediaAccessFacade

provides functions for querying (opening) a media file, detecting the channels or streams found within this file, etc. Delegating to the actual backend functions

Component(s) : Media Access

+ diff --git a/doc/devel/uml/classdiagrams.html b/doc/devel/uml/classdiagrams.html index 8c55bf4b0..63f1a4fcf 100644 --- a/doc/devel/uml/classdiagrams.html +++ b/doc/devel/uml/classdiagrams.html @@ -23,9 +23,12 @@ File MappingShows whats used to access Frames HierarchyCinelerra Exception hierarchy In Memory Database +interface components Media-Asset Relations +Proc-Asset Relations Render Entities Session structure +Struct-Asset Relations diff --git a/doc/devel/uml/classes.html b/doc/devel/uml/classes.html index b522e0caf..a34ff3876 100644 --- a/doc/devel/uml/classes.html +++ b/doc/devel/uml/classes.html @@ -78,6 +78,8 @@ Logic Mask Mediakey abstraction: media-like assets +MediaAccessFacadeboundaryprovides functions for querying (opening) a media file, detecting the channels or streams found within this file, etc. Delegating to the actual backend functions +MediaFactoryspecialized Asset Factory for configuring (new) media asset instances based on existing media files on disk; can create placeholder assets as well Metakey abstraction: metadata and organisational asset Meta MObjectinterface diff --git a/doc/devel/uml/classes_list.html b/doc/devel/uml/classes_list.html index ffe1ccbab..b394be64d 100644 --- a/doc/devel/uml/classes_list.html +++ b/doc/devel/uml/classes_list.html @@ -79,6 +79,8 @@ Logic
Mask
Media
+MediaAccessFacade
+MediaFactory
Meta
Meta
MObject
diff --git a/doc/devel/uml/componentdiagrams.html b/doc/devel/uml/componentdiagrams.html index 15a1086a2..967828869 100644 --- a/doc/devel/uml/componentdiagrams.html +++ b/doc/devel/uml/componentdiagrams.html @@ -16,6 +16,7 @@ +
backend-components
OverviewThis drawing shows the top level compoents and relations
proc-components
diff --git a/doc/devel/uml/fig128005.png b/doc/devel/uml/fig128005.png index 68d6a056f9d4741ebf13eae4e28b2bb03e948933..7290793c8a6a17876c0d310300a50540f5f28411 100644 GIT binary patch literal 42604 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 literal 38305 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 literal 0 HcmV?d00001 diff --git a/doc/devel/uml/fig130821.png b/doc/devel/uml/fig130821.png new file mode 100644 index 0000000000000000000000000000000000000000..8f9dab369ff404ec3f3d028bdf1961375048ca84 GIT binary patch literal 14943 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 literal 0 HcmV?d00001 diff --git a/doc/devel/uml/fig131205.png b/doc/devel/uml/fig131205.png new file mode 100644 index 0000000000000000000000000000000000000000..04fc181b776b859a86cd6c5f15a36733529f4d6e GIT binary patch literal 15040 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 literal 0 HcmV?d00001 diff --git a/doc/devel/uml/index.html b/doc/devel/uml/index.html index 9f3edecf9..6e665f205 100644 --- a/doc/devel/uml/index.html +++ b/doc/devel/uml/index.html @@ -29,7 +29,7 @@ Documentation

Overview



This drawing shows the top level compoents and relations

Component CommonLib
-

provided classes : Time

+

provided classes : Error, Time

Component Builder

provided classes : StateProxy

@@ -73,6 +73,11 @@ Documentation
Component RenderPathManager

provided classes : PathManager

+ +
Component MediaFactory
+

required classes : MediaAccessFacade

+ +
Component AssetDB

1.2 Component View interfaces

@@ -87,6 +92,12 @@ Documentation
Component ConManager

required classes : ParamProvider

+ +

+

backend-components



+ +
Component Media Access
+

provided classes : MediaAccessFacade

1.3 Package codegen

@@ -101,7 +112,7 @@ Documentation
Artifact Cinelerra3

Depends on common

Depends on gui

Depends on proc

Depends on backend

the main executable to be built

-

executable associated with : 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, link, parameter, renderengine

+

executable associated with : 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, link, parameter, renderengine, allocation, vframe

Artifact main

Artifact source

@@ -197,7 +208,7 @@ Documentation
Artifact media

key abstraction: media-like assets

-

Artifact source associated with : Media

+

Artifact source associated with : Media, MediaFactory

Artifact proc

key abstraction: media-like assets

@@ -532,9 +543,16 @@ Documentation

Media-Asset Relations



+ +

+

Proc-Asset Relations



+ +

+

Struct-Asset Relations



Class Asset
Class Media
+
Class Proc
Class Struct
@@ -982,11 +1000,36 @@ reuse exiting Engine

Selection :

    Transformation

    3 Package BackendLayer

    + +

    3.1 Class View Interface

    +
    + +

    +

    interface components



    +
    +
    + +

    3.2 Use Case View usage

    +
    + +

    +

    backend use cases



    + +

    3.2.1 Use Case load Media

    +
    +
    + +

    3.2.2 Use Case access File

    + +

    3.2.3 Use Case detect Channels

    + +

    3.2.4 Use Case access Channel

    +
    -

    3.1 Package design

    +

    3.3 Package design

    -

    3.1.1 Class View Backend Components

    +

    3.3.1 Class View Backend Components

    @@ -1007,15 +1050,15 @@ reuse exiting Engine

    Selection :

      Transformation
      -

      3.1.1.1 Activity get frame

      +

      3.3.1.1 Activity get frame

      Pre Condition :

        Post Condition :

          -

          3.2 Component View Cache

          +

          3.4 Component View Cache

          -

          3.3 Component View FileMapping

          +

          3.5 Component View FileMapping

          4 Package GUI

          diff --git a/doc/devel/uml/index_60.html b/doc/devel/uml/index_60.html index cc286ecf2..4909e634c 100644 --- a/doc/devel/uml/index_60.html +++ b/doc/devel/uml/index_60.html @@ -17,8 +17,8 @@ - + @@ -30,8 +30,8 @@ - + diff --git a/doc/devel/uml/index_65.html b/doc/devel/uml/index_65.html index b2473717c..7fc8a769c 100644 --- a/doc/devel/uml/index_65.html +++ b/doc/devel/uml/index_65.html @@ -19,6 +19,8 @@ + + @@ -40,18 +42,19 @@ + - + - + diff --git a/doc/devel/uml/index_66.html b/doc/devel/uml/index_66.html index 1d3f8104b..2f6812bb3 100644 --- a/doc/devel/uml/index_66.html +++ b/doc/devel/uml/index_66.html @@ -19,6 +19,8 @@ + + diff --git a/doc/devel/uml/index_67.html b/doc/devel/uml/index_67.html index 9cba96588..d9c7fd522 100644 --- a/doc/devel/uml/index_67.html +++ b/doc/devel/uml/index_67.html @@ -27,27 +27,27 @@ - - - - - - - - - - - - + + + + + + + + + + + + - + @@ -73,8 +73,8 @@ - + diff --git a/doc/devel/uml/index_68.html b/doc/devel/uml/index_68.html index 81b2f665f..75c620c08 100644 --- a/doc/devel/uml/index_68.html +++ b/doc/devel/uml/index_68.html @@ -27,8 +27,9 @@ - + + diff --git a/doc/devel/uml/index_70.html b/doc/devel/uml/index_70.html index 3eb653613..14b9fb500 100644 --- a/doc/devel/uml/index_70.html +++ b/doc/devel/uml/index_70.html @@ -33,8 +33,8 @@ - + diff --git a/doc/devel/uml/index_73.html b/doc/devel/uml/index_73.html index 3701bbfcd..6bb5ea25f 100644 --- a/doc/devel/uml/index_73.html +++ b/doc/devel/uml/index_73.html @@ -21,10 +21,12 @@ - + + + diff --git a/doc/devel/uml/index_76.html b/doc/devel/uml/index_76.html index ddbe5c66d..9403a79d7 100644 --- a/doc/devel/uml/index_76.html +++ b/doc/devel/uml/index_76.html @@ -23,6 +23,7 @@ + diff --git a/doc/devel/uml/index_77.html b/doc/devel/uml/index_77.html index 793afbce2..dac7b6a5a 100644 --- a/doc/devel/uml/index_77.html +++ b/doc/devel/uml/index_77.html @@ -24,7 +24,11 @@ + + + + diff --git a/doc/devel/uml/index_79.html b/doc/devel/uml/index_79.html index a8226191c..4902abfdc 100644 --- a/doc/devel/uml/index_79.html +++ b/doc/devel/uml/index_79.html @@ -19,9 +19,9 @@ - - + + diff --git a/doc/devel/uml/index_80.html b/doc/devel/uml/index_80.html index 27ab841fa..2380ad9ce 100644 --- a/doc/devel/uml/index_80.html +++ b/doc/devel/uml/index_80.html @@ -44,6 +44,7 @@ + diff --git a/doc/devel/uml/index_83.html b/doc/devel/uml/index_83.html index e5e139dc4..15423df50 100644 --- a/doc/devel/uml/index_83.html +++ b/doc/devel/uml/index_83.html @@ -30,8 +30,8 @@ - + @@ -40,8 +40,8 @@ - + @@ -55,6 +55,7 @@ +
          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
          NameKindDescription
          abstractmoartifactabstract base class for all Media Objects
          AbstractMOclass
          access Channeluse case
          access Fileuse case
          activity finalactivity final
          activity finalactivity final
          AFrameclass
          assetpackagesourcecode package

          Asset Management
          Assetpackage
          Asset Kindsclass diagram
          AssetDBcomponent
          AssetManagementcomponent
          AssetManagerclassFacade for the Asset subsystem
          assetmanagerartifactFacade for the Asset subsystem
          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
          autoartifactMedia Object holding automation data
          AutoclassAutomation data for some parameter (i.e. a time varying function)
          Automation Entitiesclass diagram
          NameKindDescription
          backendpackagesourcecode package

          Data backend classes here...
          Backend Componentsclass view
          backend use casesuse case diagram
          backend-componentscomponent diagram
          BackendLayerpackage
          buildoperation
          build flowactivity diagram
          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
          Clipclassbookkeeping (asset) view of a media clip.
          clipartifacta Media Clip
          clipartifactbookkeeping (asset) view of a media clip.
          clipartifacta Media Clip
          Clipclass
          clipsrelation
          Codecclassdescription of some media data decoder or encoder facility
          connectopaque activity action
          Constraintclass
          Controllercomponent
          Controllerpackage
          controllerpackagesourcecode package

          The Processing and Render Controller,
          located within the MObject Subsystem
          Controllerpackage
          Controller Entitiesclass diagram
          Controller Workingsclass view
          ControllerFacadeclassProvides unified access to the Proc-Subsystem Controller. Especially, this Facade class provides the functions to get a render engine to carry out actual renderings.
          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
          detect Channelsuse case
          determine Render Paramsexpansion region
          determine Render Paramsopaque activity action
          devnullclass instance
          DirectPlacementclass
          Dispatchercomponent
          Fixtureactivity object
          fixtureartifactthe (low level) representation of the EDL with concrete placement data
          fixturerelation
          Fixturecomponent
          Fixtureclass
          Fixturecomponent
          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
          In Memory Databaseclass diagram
          inFixtureactivity action pin
          inputclass instance
          inputclass instance
          inputclass instance
          inputclass instance
          instanceoperation
          instructionsrelation
          Interfaceclass view
          interface componentsclass diagram
          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
          lengthattributeduration (span) of this timeline segment.
          Linkclass
          linkartifactforwarding, adapting or connecting ProcNode
          load Mediause case
          Lockclass
          Lockclass
          Logicclass
          maskartifactVideo ProcNode for masking regions of the image (automatable)
          Mediaclasskey abstraction: media-like assets
          mediaartifactkey abstraction: media-like assets
          Media Accesscomponent
          Media-Asset Relationsclass diagram
          MediaAccessFacadeclassprovides functions for querying (opening) a media file, detecting the channels or streams found within this file, etc. Delegating to the actual backend functions
          MediaFactorycomponent
          MediaFactoryclassspecialized Asset Factory for configuring (new) media asset instances based on existing media files on disk; can create placeholder assets as well
          merge activity nodemerge activity node
          Metaclasskey abstraction: metadata and organisational asset
          metaartifactkey abstraction: metadata and organisational asset
          NameKindDescription
          offsetattributeOffset the actual position by this (time) value relative to the anchor point. TODO: Representation?
          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
          ouputclass instance
          ouputclass instance
          OutPortclassstructural asset corresponding to some port generating media output
          outportartifactstructural asset corresponding to some port generating media output
          outputrelation
          procnode
          procartifactkey abstraction: media-like assets
          procattributeholds the Processor (Render Engine Element) to be built by the current build step
          Proc-Asset Relationsclass diagram
          proc-componentscomponent diagram
          ProcessingLayerpackage
          Processorclass
          Service Componentsclass view
          Sessioncomponent
          sessionartifactholds the complete session to be edited by the user
          Sessionclass view
          sessionpackagesourcecode package

          Everything concerning the EDL and Session, within the MObject Subsystem
          Sessionclass view
          Sessionclass
          Session structureclass diagram
          setup Build Paramsopaque activity action
          SimpleClipclass
          SmartPointerclass
          SmartPointersclass view
          sourcerelationmedia source of this clip
          sourcerelationthe media source this clip referes to
          sourcerelationmedia source of this clip
          SourceclassSource Node: represents a media source to pull data from.
          sourceartifactRepresentation of a Media source
          Source Overviewdeployment diagram
          std::exceptionclass
          Structclasskey abstraction: structural asset
          structartifactkey abstraction: structural asset
          Struct-Asset Relationsclass diagram
          subjectrelation
          subPatternrelation
          diff --git a/doc/devel/uml/index_84.html b/doc/devel/uml/index_84.html index 90cbd038f..b86c2c7b0 100644 --- a/doc/devel/uml/index_84.html +++ b/doc/devel/uml/index_84.html @@ -40,13 +40,13 @@ tracksrelation Trafoclass trafoartifacttransforming processing Node -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 b5f26dfb9..6075e15d1 100644 --- a/doc/devel/uml/index_85.html +++ b/doc/devel/uml/index_85.html @@ -19,6 +19,7 @@ NameKindDescription Unknownclassplaceholder for unknown or unavailable media source unknownartifactplaceholder for unknown or unavailable media source +usageuse case view 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 191657818..1a10d10b0 100644 --- a/doc/devel/uml/index_86.html +++ b/doc/devel/uml/index_86.html @@ -20,23 +20,23 @@ 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 +vid1class instance +vid_Aclass instance vid_aclass instance vid_Aclass instance -vid_Aclass instance -videoclass instance -videoclass instance +vid_aclass instance +vid_Aclass instance videoclass instance +videoclass instance +videoclass instance videoclass instance -video1class instance -video1class instance -video1class 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 4af6e38d9..cdf4db578 100644 --- a/doc/devel/uml/index_87.html +++ b/doc/devel/uml/index_87.html @@ -19,6 +19,7 @@ NameKindDescription whatoperation whatoperationthe base class of all exceptions thrown by the standard library +wiringTemplaterelation Wishclass write_bufferrelation WriteBufferclass diff --git a/doc/devel/uml/navig.html b/doc/devel/uml/navig.html index 2bdbe6770..1d6f86b34 100644 --- a/doc/devel/uml/navig.html +++ b/doc/devel/uml/navig.html @@ -9,7 +9,7 @@


          -

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

          +

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

          < 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/usecasediagrams.html b/doc/devel/uml/usecasediagrams.html new file mode 100644 index 000000000..62cd42a0e --- /dev/null +++ b/doc/devel/uml/usecasediagrams.html @@ -0,0 +1,22 @@ + + + + + + +Use Case Diagram Index + + + + + +
          Use Case Diagram Index
          +

          + + + + + +
          backend use cases
          + + diff --git a/doc/devel/uml/usecases.html b/doc/devel/uml/usecases.html new file mode 100644 index 000000000..d55241488 --- /dev/null +++ b/doc/devel/uml/usecases.html @@ -0,0 +1,25 @@ + + + + + + +Use Cases Index + + + + + +
          Use Cases Index
          +

          + + + + + + + + +
          access Channel
          access File
          detect Channels
          load Media
          + + diff --git a/src/proc/asset/media.hpp b/src/proc/asset/media.hpp index 350ba86f2..66c21da04 100644 --- a/src/proc/asset/media.hpp +++ b/src/proc/asset/media.hpp @@ -22,8 +22,8 @@ /** @file media.hpp - ** Media data is a specific Kind of Asset. - ** For the different Kinds of Assets, we use sub-intefaces inheriting + ** Media data is a specific kind of Asset. + ** For the different kinds of Assets, we use sub-intefaces inheriting ** from the general Asset interface. To be able to get asset::Media instances ** directly from the AssetManager, we define a specialization of the Asset ID. ** @@ -89,7 +89,7 @@ namespace asset /** - * Factory specialized for createing Media Asset objects. + * Factory specialized for creating Media Asset objects. */ class MediaFactory : public cinelerra::Factory { diff --git a/uml/cinelerra3/128005 b/uml/cinelerra3/128005 index 0d1ddaf0c..e16107985 100644 --- a/uml/cinelerra3/128005 +++ b/uml/cinelerra3/128005 @@ -1,6 +1,6 @@ format 40 "design" // design - revision 9 + revision 10 modified_by 5 "hiv" // class settings //class diagram settings @@ -42,6 +42,7 @@ Not a real code package, rather a container for design drafts, specifications, d component 129925 "CommonLib" provided_classes + class_ref 135557 // Error class_ref 134917 // Time end end @@ -84,10 +85,10 @@ Not a real code package, rather a container for design drafts, specifications, d -_-> on component_ref 128005 // Builder end - end component 128645 "AssetManagement" + stereotype "subsystem" end component 128773 "Dispatcher" @@ -129,6 +130,16 @@ Not a real code package, rather a container for design drafts, specifications, d end end + component 130181 "MediaFactory" + stereotype "component" + required_classes + class_ref 139525 // MediaAccessFacade + end + end + + component 130309 "AssetDB" + stereotype "service" + end end componentview 128133 "interfaces" @@ -157,6 +168,19 @@ Not a real code package, rather a container for design drafts, specifications, d class_ref 134661 // ParamProvider end end + + componentdiagram 130693 "backend-components" + package_name_in_tab default show_context 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 + size A4 + end + + component 130437 "Media Access" + stereotype "service" + provided_classes + class_ref 139525 // MediaAccessFacade + end + end end package_ref 128645 // codegen diff --git a/uml/cinelerra3/128005.diagram b/uml/cinelerra3/128005.diagram index cf3c8dfa1..a16e8f676 100644 --- a/uml/cinelerra3/128005.diagram +++ b/uml/cinelerra3/128005.diagram @@ -1,4 +1,4 @@ -format 38 +format 40 fragment 128005 "UI Layer" xyzwh 321 22 2000 829 100 @@ -11,8 +11,8 @@ fragment 128261 "Backend Layer" xyzwh 64 848 2000 1089 105 end packagecanvas 128389 - package_ref 128133 // AssetManager - xyzwh 561 201 2005 265 214 + package_ref 128133 // Asset + xyzwh 561 201 2005 265 241 packagecanvas 128517 package_ref 128261 // MObject xyzwh 94 201 2006 458 335 @@ -38,7 +38,7 @@ note 129541 "Structures edited by the User" xyzwh 43 269 2016 181 41 componentcanvas 129669 component_ref 128645 // AssetManagement draw_component_as_icon default show_component_req_prov default show_component_rea default - xyzwh 577 241 2010 208 159 + xyzwh 577 232 2010 217 201 componentcanvas 129797 component_ref 128773 // Dispatcher draw_component_as_icon default show_component_req_prov default show_component_rea default xyzwh 406 31 2005 193 75 @@ -59,6 +59,12 @@ note 131973 "just works, never decides" xyzwh 317 668 2015 110 59 note 132101 "codecs, stream I/O here" xyzwh 376 592 2005 166 39 +componentcanvas 132229 component_ref 130181 // MediaFactory + draw_component_as_icon default show_component_req_prov default show_component_rea default + xyzwh 593 354 2015 158 67 +componentcanvas 132357 component_ref 130309 // AssetDB + draw_component_as_icon default show_component_req_prov default show_component_rea default + xyzwh 629 289 2020 155 63 simplerelationcanvas 131205 simplerelation_ref 128005 from ref 130053 z 2004 to ref 130181 simplerelationcanvas 131333 simplerelation_ref 128133 diff --git a/uml/cinelerra3/128133 b/uml/cinelerra3/128133 index 64b57bac8..9e7642989 100644 --- a/uml/cinelerra3/128133 +++ b/uml/cinelerra3/128133 @@ -1,6 +1,6 @@ format 40 "Asset" // ProcessingLayer::Asset - revision 11 + revision 12 modified_by 5 "hiv" // class settings //class diagram settings @@ -53,6 +53,16 @@ format 40 size A4 end + classdiagram 131077 "Proc-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 + + classdiagram 131205 "Struct-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} @@ -396,6 +406,39 @@ ${class}::${name} ${(}${)}${const}${volatile} ${throw}${staticnl} end end + class 139397 "MediaFactory" + visibility public + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + comment "specialized Asset Factory for configuring (new) media asset instances based on existing media files on disk; can create placeholder assets as well" + simplerelation 129285 + -_-> + on + package_ref 129157 // BackendLayer + end + + simplerelation 129413 + -_-> + on + package_ref 129157 // BackendLayer + end + + classrelation 144261 // + relation 142341 -_-> + a default + cpp default "Generated" + classrelation_ref 144261 // + b multiplicity "" parent class_ref 139525 // MediaAccessFacade + end + end + class 138501 "CompoundMedia" visibility public cpp_decl "${comment}${template}class ${name}${inherit} @@ -641,6 +684,15 @@ ${inlines} classrelation_ref 141317 // b multiplicity "" parent class_ref 136965 // Struct end + + classrelation 144389 // wiringTemplate () + relation 142469 ---> + a role_name "wiringTemplate" multiplicity "1" protected + cpp default " ${comment}${static}${mutable}${volatile}${const}${type}* ${name}${value}; +" + classrelation_ref 144389 // wiringTemplate () + b multiplicity "" parent class_ref 138757 // ProcPatt + end end class 138117 "OutPort" diff --git a/uml/cinelerra3/128138 b/uml/cinelerra3/128138 index 33c1211c8..be431c6db 100644 --- a/uml/cinelerra3/128138 +++ b/uml/cinelerra3/128138 @@ -1,7 +1,7 @@ format 40 "design" // BackendLayer::design - revision 8 - modified_by 10 "ct" + revision 9 + modified_by 5 "hiv" // class settings //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 @@ -318,7 +318,7 @@ ${inlines} classrelation_ref 129802 // end - classrelation 130058 // write_buffer () + classrelation 130058 // relation_ref 129418 // end end @@ -528,7 +528,7 @@ ${inlines} b role_name "write_buffer" multiplicity "0..1" protected cpp default " ${comment}${static}${mutable}${volatile}${const}${type}* ${name}${value}; " - classrelation_ref 130058 // write_buffer () + classrelation_ref 130058 // end classrelation 130314 // diff --git a/uml/cinelerra3/128389 b/uml/cinelerra3/128389 index 6581cb200..35d64e6bd 100644 --- a/uml/cinelerra3/128389 +++ b/uml/cinelerra3/128389 @@ -1,6 +1,6 @@ format 40 "RenderEngine" // ProcessingLayer::RenderEngine - revision 11 + revision 12 modified_by 5 "hiv" // class settings //class diagram settings @@ -563,7 +563,7 @@ ${inlines} classrelation 141701 // relation 139909 -_-> a default - cpp default "Generated" + cpp default "#include in header" classrelation_ref 141701 // b multiplicity "" parent class_ref 136709 // Media end diff --git a/uml/cinelerra3/128389.diagram b/uml/cinelerra3/128389.diagram index 7c1a670cd..b031adc09 100644 --- a/uml/cinelerra3/128389.diagram +++ b/uml/cinelerra3/128389.diagram @@ -14,11 +14,11 @@ classcanvas 128389 class_ref 131589 // ExitNode end classcanvas 128517 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 462 265 2000 + xyz 462 264 2000 end classcanvas 129029 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 496 444 2000 + xyz 496 443 2000 end classcanvas 129157 class_ref 131973 // Link 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 @@ -38,7 +38,7 @@ classcanvas 129541 class_ref 132357 // Mask end classcanvas 129669 class_ref 132485 // PluginAdapter 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 506 622 2000 + xyz 506 621 2000 end classcanvas 129797 class_ref 132613 // GLPipe 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 @@ -82,7 +82,7 @@ classcanvas 137221 class_ref 133765 // Source end classcanvas 139781 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 599 622 2000 + xyz 599 621 2000 end relationcanvas 128261 relation_ref 131845 // from ref 128005 z 1999 stereotype "<>" xyz 178 278 3000 to point 216 200 @@ -102,8 +102,8 @@ relationcanvas 129925 relation_ref 132101 // no_multiplicity_a no_multiplicity_b relationcanvas 130053 relation_ref 132229 // geometry VHV - from ref 129029 z 1999 to point 516 384 - line 130949 z 1999 to point 499 384 + from ref 129029 z 1999 to point 516 383 + line 130949 z 1999 to point 499 383 line 131077 z 1999 to ref 128517 no_role_a no_role_b no_multiplicity_a no_multiplicity_b @@ -198,11 +198,11 @@ relationcanvas 137989 relation_ref 134917 // no_role_a no_role_b no_multiplicity_a no_multiplicity_b relationcanvas 139397 relation_ref 135429 // - from ref 128517 z 1999 to point 432 265 - line 139525 z 1999 to point 432 295 + from ref 128517 z 1999 to point 432 264 + line 139525 z 1999 to point 432 294 line 139653 z 1999 to ref 128517 - role_a_pos 414 273 3000 no_role_b - no_multiplicity_a multiplicity_b_pos 445 292 3000 + role_a_pos 414 272 3000 no_role_b + no_multiplicity_a multiplicity_b_pos 445 291 3000 relationcanvas 139909 relation_ref 136965 // from ref 139781 z 1999 to ref 129029 no_role_a no_role_b diff --git a/uml/cinelerra3/129157 b/uml/cinelerra3/129157 index 10e4a87d1..c1920331a 100644 --- a/uml/cinelerra3/129157 +++ b/uml/cinelerra3/129157 @@ -1,14 +1,14 @@ -format 38 +format 40 "BackendLayer" // BackendLayer - revision 5 - modified_by 10 "ct" + revision 6 + modified_by 5 "hiv" // class settings //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 //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,6 +26,116 @@ 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 129029 "Interface" + //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 130949 "interface components" + 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 + + class 139525 "MediaAccessFacade" + 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 "provides functions for querying (opening) a media file, detecting the channels or streams found within this file, etc. Delegating to the actual backend functions" + end + end + + usecaseview 128133 "usage" + //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 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 + write_horizontally default package_name_in_tab default show_context default auto_label_position default draw_all_relations default shadow default + usecasediagram 130821 "backend use cases" + package_name_in_tab default show_context default auto_label_position default draw_all_relations default shadow default + size A4 + end + + usecase 128005 "load Media" + //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 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 + write_horizontally default package_name_in_tab default show_context default auto_label_position default draw_all_relations default shadow default + simplerelation 129029 + -_-> + stereotype "include" + on usecase_ref 128133 // access File + end + + simplerelation 129157 + -_-> + stereotype "include" + on usecase_ref 128261 // detect Channels + comment "after accessing the file, detect the channel/stream structure" + end + end + + usecase 128133 "access File" + //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 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 + write_horizontally default package_name_in_tab default show_context default auto_label_position default draw_all_relations default shadow default + end + + usecase 128261 "detect Channels" + //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 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 + write_horizontally default package_name_in_tab default show_context default auto_label_position default draw_all_relations default shadow default + end + + usecase 128389 "access Channel" + //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 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 + write_horizontally default package_name_in_tab default show_context default auto_label_position default draw_all_relations default shadow default + end + end + package_ref 128138 // design componentview 128138 "Cache" diff --git a/uml/cinelerra3/130053 b/uml/cinelerra3/130053 index 27985ba52..c61e1e94f 100644 --- a/uml/cinelerra3/130053 +++ b/uml/cinelerra3/130053 @@ -1,6 +1,6 @@ format 40 "asset" // design::codegen::proc::asset - revision 5 + revision 6 modified_by 5 "hiv" // class settings //class diagram settings @@ -151,6 +151,7 @@ ${members} ${namespace_end}" associated_classes class_ref 136709 // Media + class_ref 139397 // MediaFactory end comment "key abstraction: media-like assets" end diff --git a/uml/cinelerra3/130053.diagram b/uml/cinelerra3/130053.diagram index 36438c6a4..da938cd73 100644 --- a/uml/cinelerra3/130053.diagram +++ b/uml/cinelerra3/130053.diagram @@ -88,6 +88,8 @@ arrowjunctioncanvas 139397 class_ref 130437 // PathManager xyz 350 458 2000 label_xy 328 479 arrowjunctioncanvas 140549 class_ref 128261 // Fixture xyz 494 749 2000 label_xy 487 770 +arrowjunctioncanvas 140805 class_ref 135557 // Error + xyz 790 194 2000 label_xy 787 215 line 132101 ---O from ref 129541 z 1999 to point 301 541 line 139269 z 1999 to ref 131973 @@ -131,5 +133,7 @@ line 139525 ---O geometry HV line 139781 z 1999 to ref 139397 line 140677 ---( from ref 135685 z 1999 to ref 140549 +line 140933 ---O + from ref 132869 z 1999 to ref 140805 preferred_whz 0 0 0.8 end diff --git a/uml/cinelerra3/130309.diagram b/uml/cinelerra3/130309.diagram index bfff7acc4..d9d44ae03 100644 --- a/uml/cinelerra3/130309.diagram +++ b/uml/cinelerra3/130309.diagram @@ -10,126 +10,126 @@ classcanvas 128133 class_ref 136581 // AssetManager end packagecanvas 128517 package_ref 128133 // Asset - show_context_mode namespace xyzwh 215 182 1994 610 571 + show_context_mode namespace xyzwh 214 182 1994 610 571 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 259 330 2005 + xyz 258 330 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 503 347 2005 + xyz 502 330 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 655 347 2005 + xyz 654 330 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 761 347 2005 + xyz 760 330 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 + xyz 276 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 319 445 2000 + xyz 318 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 382 529 2000 + xyz 381 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 387 445 2005 + xyz 386 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 477 445 2000 + xyz 476 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 538 445 2000 + xyz 537 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 615 445 2000 + xyz 614 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 678 445 2000 + xyz 677 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 757 445 2000 + xyz 756 445 2000 end classcanvas 133253 class_ref 138373 // DB 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 486 233 2000 + xyz 485 233 2000 end classcanvas 133765 class_ref 138501 // CompoundMedia 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 245 529 2005 + xyz 244 529 2005 end classcanvas 135813 class_ref 138757 // ProcPatt 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 638 506 2000 + xyz 637 506 2000 end classcanvas 136709 class_ref 139141 // DoAttach 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 567 688 2000 + xyz 566 688 2000 end classcanvas 136837 class_ref 139013 // BuildInstruct 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 605 620 2000 + xyz 604 620 2000 end classcanvas 136965 class_ref 139269 // DoRecurse 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 639 688 2000 + xyz 638 688 2000 end relationcanvas 129157 relation_ref 138117 // geometry VHV - from ref 128645 z 1999 to point 293 307 + from ref 128645 z 1999 to point 292 307 line 129797 z 1999 to point 138 307 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 523 315 - line 130053 z 1999 to point 138 315 + from ref 128773 z 1999 to point 522 307 + line 130053 z 1999 to point 138 307 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 675 315 - line 130309 z 1999 to point 138 315 + from ref 128901 z 1999 to point 674 307 + line 130309 z 1999 to point 138 307 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 781 315 - line 130565 z 1999 to point 138 315 + from ref 129029 z 1999 to point 780 307 + line 130565 z 1999 to point 138 307 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 + role_a_pos 222 217 3000 no_role_b + multiplicity_a_pos 259 250 3000 multiplicity_b_pos 194 194 3000 relationcanvas 131205 relation_ref 138757 // geometry VHV - from ref 131077 z 1999 to point 339 423 - line 134277 z 1999 to point 293 423 + from ref 131077 z 1999 to point 338 423 + line 134277 z 1999 to point 292 423 line 134405 z 1999 to ref 128645 no_role_a no_role_b no_multiplicity_a no_multiplicity_b relationcanvas 131717 relation_ref 139013 // geometry VHV - from ref 131461 z 2004 to point 411 423 - line 134021 z 2004 to point 293 423 + from ref 131461 z 2004 to point 410 423 + line 134021 z 2004 to point 292 423 line 134149 z 2004 to ref 128645 no_role_a no_role_b no_multiplicity_a no_multiplicity_b @@ -159,20 +159,20 @@ relationcanvas 133125 relation_ref 139781 // no_multiplicity_a no_multiplicity_b relationcanvas 133381 relation_ref 140293 // geometry HV - from ref 128133 z 1999 to point 506 93 + from ref 128133 z 1999 to point 505 93 line 133637 z 1999 to ref 133253 - role_a_pos 518 208 3000 no_role_b - multiplicity_a_pos 492 208 3000 multiplicity_b_pos 386 104 3000 + role_a_pos 517 208 3000 no_role_b + multiplicity_a_pos 491 208 3000 multiplicity_b_pos 386 104 3000 relationcanvas 134533 relation_ref 140421 // from ref 133765 z 2004 to ref 128645 no_role_a no_role_b no_multiplicity_a no_multiplicity_b relationcanvas 134917 relation_ref 140549 // - from ref 133765 z 2004 stereotype "<>" xyz 229 493 3000 to point 225 545 + from ref 133765 z 2004 stereotype "<>" xyz 228 493 3000 to point 225 545 line 135301 z 2004 to point 225 365 line 135173 z 2004 to ref 128645 - role_a_pos 217 343 3000 no_role_b - multiplicity_a_pos 232 376 3000 multiplicity_b_pos 230 556 3000 + role_a_pos 216 343 3000 no_role_b + multiplicity_a_pos 231 376 3000 multiplicity_b_pos 229 556 3000 relationcanvas 136069 relation_ref 141189 // from ref 135813 z 1999 to ref 128901 no_role_a no_role_b @@ -185,9 +185,9 @@ relationcanvas 136197 relation_ref 141317 // no_role_a no_role_b no_multiplicity_a no_multiplicity_b relationcanvas 137093 relation_ref 141701 // - from ref 135813 z 1999 stereotype "<>" xyz 632 569 3000 to ref 136837 - role_a_pos 655 600 3000 no_role_b - multiplicity_a_pos 622 599 3000 multiplicity_b_pos 643 557 3000 + from ref 135813 z 1999 stereotype "<>" xyz 631 569 3000 to ref 136837 + role_a_pos 657 595 3000 no_role_b + multiplicity_a_pos 621 595 3000 multiplicity_b_pos 642 557 3000 relationcanvas 137221 relation_ref 141829 // from ref 136709 z 1999 to ref 136837 no_role_a no_role_b @@ -200,13 +200,13 @@ relationcanvas 137477 relation_ref 142085 // from ref 136965 z 1999 to point 728 656 line 137605 z 1999 to point 728 562 line 137733 z 1999 to ref 135813 - role_a_pos 704 524 3000 no_role_b - multiplicity_a_pos 736 560 3000 multiplicity_b_pos 705 688 3000 + role_a_pos 703 523 3000 no_role_b + multiplicity_a_pos 703 556 3000 multiplicity_b_pos 704 688 3000 relationcanvas 137861 relation_ref 142213 // from ref 136709 z 1999 stereotype "<>" xyz 538 659 3000 to point 595 388 line 137989 z 1999 to ref 128773 - role_a_pos 559 553 3000 no_role_b - multiplicity_a_pos 571 541 3000 no_multiplicity_b + role_a_pos 556 343 3000 no_role_b + multiplicity_a_pos 556 376 3000 no_multiplicity_b line 128261 -_-_ geometry HV from ref 128005 z 1999 to point 331 150 line 128389 z 1999 to ref 128133 diff --git a/uml/cinelerra3/130693.diagram b/uml/cinelerra3/130693.diagram new file mode 100644 index 000000000..1602c55a2 --- /dev/null +++ b/uml/cinelerra3/130693.diagram @@ -0,0 +1,23 @@ +format 40 + +packagecanvas 128005 + package_ref 129541 // backend + xyzwh 59 425 1994 717 262 +packagecanvas 128133 + package_ref 130053 // asset + color lightblue xyzwh 437 34 1994 342 257 +componentcanvas 128261 component_ref 130181 // MediaFactory + draw_component_as_icon default show_component_req_prov default show_component_rea default + xyzwh 536 127 2005 155 63 +componentcanvas 128389 component_ref 130437 // Media Access + draw_component_as_icon default show_component_req_prov default show_component_rea default + xyzwh 550 504 2005 155 63 +arrowjunctioncanvas 128517 class_ref 139525 // MediaAccessFacade + xyz 617 395 2000 label_xy 575 414 +arrowjunctioncanvas 128773 class_ref 139525 // MediaAccessFacade + xyz 616 349 2000 label_xy 574 368 +line 128645 ---O + from ref 128389 z 1999 to ref 128517 +line 128901 ---( + from ref 128261 z 1999 to ref 128773 +end diff --git a/uml/cinelerra3/130821.diagram b/uml/cinelerra3/130821.diagram new file mode 100644 index 000000000..369aa3f38 --- /dev/null +++ b/uml/cinelerra3/130821.diagram @@ -0,0 +1,37 @@ +format 40 + +packagecanvas 128005 + package_ref 128133 // Asset + xyzwh 32 26 2000 226 311 +classcanvas 128133 class_ref 139397 // MediaFactory + xyz 131 95 3005 label_xy 118 135 +usecasecanvas 128389 usecase_ref 128005 // load Media + xyzwh 340 148 3005 64 32 label_xy 346 180 +usecasecanvas 128645 usecase_ref 128133 // access File + xyzwh 537 190 3005 64 32 label_xy 540 222 +usecasecanvas 128773 usecase_ref 128261 // detect Channels + xyzwh 502 254 3005 64 32 label_xy 495 286 +subject 129413 "" + xyzwh 12 5 2005 280 676 +subject 129541 "" + xyzwh 305 6 2000 351 673 +packagecanvas 129669 + package_ref 128389 // RenderEngine + xyzwh 31 344 2010 227 327 +classcanvas 129797 class_ref 132741 // StateProxy + xyz 129 449 3005 label_xy 122 489 +usecasecanvas 129925 usecase_ref 128389 // access Channel + xyzwh 457 378 3005 64 32 label_xy 450 410 +note 130437 "using channel handle" + xyzwh 471 323 3009 128 35 +line 128517 ---> + from ref 128133 z 3004 to ref 128389 +simplerelationcanvas 129157 simplerelation_ref 129029 + from ref 128389 z 3004 stereotype "<>" xyz 452 185 3000 to ref 128645 +simplerelationcanvas 129285 simplerelation_ref 129157 + from ref 128389 z 3004 stereotype "<>" xyz 424 216 3000 to ref 128773 +line 130053 ---> + from ref 129797 z 3004 to ref 129925 +line 130309 -_-_ + from ref 128773 z 3004 to ref 129925 +end diff --git a/uml/cinelerra3/130949.diagram b/uml/cinelerra3/130949.diagram new file mode 100644 index 000000000..8b766f1c6 --- /dev/null +++ b/uml/cinelerra3/130949.diagram @@ -0,0 +1,21 @@ +format 40 + +classcanvas 128005 class_ref 139525 // MediaAccessFacade + 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 149 277 2000 + end +packagecanvas 128133 + package_ref 129157 // BackendLayer + xyzwh 49 191 1995 561 424 +packagecanvas 128261 + package_ref 128133 // Asset + xyzwh 324 29 2000 287 138 +classcanvas 128389 class_ref 139397 // MediaFactory + 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 375 83 2005 + end +relationcanvas 129285 relation_ref 142341 // + from ref 128389 z 1999 to ref 128005 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +end diff --git a/uml/cinelerra3/131077.diagram b/uml/cinelerra3/131077.diagram new file mode 100644 index 000000000..5da417c64 --- /dev/null +++ b/uml/cinelerra3/131077.diagram @@ -0,0 +1,92 @@ +format 40 + +classcanvas 128005 class_ref 139013 // BuildInstruct + 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 693 369 2000 + end +classcanvas 128133 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 591 79 2005 + end +classcanvas 128261 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 581 216 2000 + end +classcanvas 128389 class_ref 138757 // ProcPatt + 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 726 255 2000 + end +classcanvas 128517 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 550 152 2000 + end +classcanvas 128645 class_ref 139141 // DoAttach + 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 655 437 2000 + end +packagecanvas 128773 + package_ref 128133 // Asset + show_context_mode namespace xyzwh 406 24 1994 417 478 +packagecanvas 129669 + package_ref 128389 // RenderEngine + xyzwh 20 90 1994 330 411 +classcanvas 129797 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 198 348 2000 + end +classcanvas 129925 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 79 137 2000 + end +classcanvas 130053 class_ref 132485 // PluginAdapter + 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 233 285 2000 + end +classcanvas 130181 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 96 238 2000 + end +relationcanvas 128901 relation_ref 142213 // + from ref 128645 z 1999 stereotype "<>" xyz 626 407 3000 to point 683 134 + line 129029 z 1999 to ref 128133 + role_a_pos 645 92 3000 no_role_b + multiplicity_a_pos 645 125 3000 no_multiplicity_b +relationcanvas 129157 relation_ref 139269 // + from ref 128517 z 1999 to ref 128133 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 129285 relation_ref 139397 // + from ref 128261 z 1999 to ref 128133 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 129413 relation_ref 141701 // + from ref 128389 z 1999 stereotype "<>" xyz 714 332 3000 to ref 128005 + role_a_pos 746 344 3000 no_role_b + multiplicity_a_pos 710 344 3000 multiplicity_b_pos 731 306 3000 +relationcanvas 129541 relation_ref 141829 // + from ref 128645 z 1999 to ref 128005 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 130309 relation_ref 135429 // + from ref 129925 z 1999 to point 49 137 + line 130437 z 1999 to point 49 167 + line 130565 z 1999 to ref 129925 + role_a_pos 31 145 3000 no_role_b + no_multiplicity_a multiplicity_b_pos 62 164 3000 +relationcanvas 130693 relation_ref 132229 // + from ref 130181 z 1999 to ref 129925 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 131077 relation_ref 136965 // + from ref 129797 z 1999 to ref 130181 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 131205 relation_ref 132997 // + from ref 130053 z 1999 to ref 130181 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +line 131333 -_-_ + from ref 130053 z 1999 to ref 128517 +line 131461 -_-_ + from ref 129797 z 1999 to ref 128261 +end diff --git a/uml/cinelerra3/131205.diagram b/uml/cinelerra3/131205.diagram new file mode 100644 index 000000000..02ad56b41 --- /dev/null +++ b/uml/cinelerra3/131205.diagram @@ -0,0 +1,79 @@ +format 40 + +packagecanvas 128005 + package_ref 128133 // Asset + xyzwh 328 34 1994 448 544 +classcanvas 128133 class_ref 139013 // BuildInstruct + 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 651 391 2000 + end +classcanvas 128261 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 481 508 2005 + end +classcanvas 128389 class_ref 138757 // ProcPatt + 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 684 277 2000 + end +classcanvas 128517 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 510 196 2000 + end +classcanvas 128645 class_ref 139141 // DoAttach + 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 613 459 2000 + end +classcanvas 128773 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 604 196 2000 + end +classcanvas 128901 class_ref 139269 // DoRecurse + 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 685 459 2000 + end +classcanvas 129029 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 701 101 2005 + end +relationcanvas 129157 relation_ref 139653 // + geometry VHV + from ref 128517 z 1999 to point 535 167 + line 130437 z 1999 to point 721 167 + line 130565 z 1999 to ref 129029 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 129285 relation_ref 141189 // + from ref 128389 z 1999 to point 721 228 + line 130693 z 1999 to ref 129029 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 129413 relation_ref 139525 // + geometry VHV + from ref 128773 z 1999 to point 624 167 + line 130181 z 1999 to point 721 167 + line 130309 z 1999 to ref 129029 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 129541 relation_ref 141701 // + from ref 128389 z 1999 stereotype "<>" xyz 678 340 3000 to ref 128133 + role_a_pos 704 366 3000 no_role_b + multiplicity_a_pos 668 366 3000 multiplicity_b_pos 689 328 3000 +relationcanvas 129669 relation_ref 141829 // + from ref 128645 z 1999 to ref 128133 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 129797 relation_ref 142213 // + from ref 128645 z 1999 stereotype "<>" xyz 510 628 3000 to ref 128261 + role_a_pos 535 494 3000 no_role_b + multiplicity_a_pos 535 527 3000 no_multiplicity_b +relationcanvas 130053 relation_ref 141957 // + from ref 128901 z 1999 to ref 128133 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 130821 relation_ref 142469 // + geometry VH + from ref 128773 z 1999 to point 624 296 + line 131205 z 1999 to ref 128389 + role_a_pos 587 295 3000 no_role_b + multiplicity_a_pos 667 307 3000 no_multiplicity_b +end diff --git a/uml/cinelerra3/5.session b/uml/cinelerra3/5.session index 41ab92dac..15afb5ad6 100644 --- a/uml/cinelerra3/5.session +++ b/uml/cinelerra3/5.session @@ -1,38 +1,23 @@ window_sizes 1140 783 270 860 633 71 diagrams - active classdiagram_ref 130309 // Asset Kinds + classdiagram_ref 130309 // Asset Kinds 860 633 100 4 180 0 classdiagram_ref 128133 // Session structure 688 506 100 4 120 0 - classdiagram_ref 130437 // Media-Asset Relations + active classdiagram_ref 130437 // Media-Asset Relations 860 633 100 4 0 0 + classdiagram_ref 128389 // Render Entities + 688 506 100 4 120 0 end show_stereotypes -selected objectdiagram_ref 128773 // EDL Example1 +selected + package_ref 129 // cinelerra3 open package_ref 128005 // design - class_ref 136453 // Asset - operation_ref 133125 // getID - operation_ref 132357 // reg - class_ref 136709 // Media - class_ref 138501 // CompoundMedia - class_ref 137349 // Clip - class_ref 138757 // ProcPatt - class_ref 139141 // DoAttach - class_ref 139269 // DoRecurse - class_ref 128901 // Clip - class_ref 138629 // CompoundClip - - package_ref 128389 // RenderEngine - usecaseview_ref 128005 // Renderengine Use - class_ref 135685 // Logic - class_ref 135813 // Config - class_ref 135941 // State - class_ref 136069 // Invalid - class_ref 136197 // External - class_ref 136325 // std::exception - class_ref 135429 // Appconfig - classview_ref 128266 // SmartPointers + classview_ref 128901 // Assets + classview_ref 128133 // Engine Workings + classview_ref 129029 // Interface + componentview_ref 128266 // FileMapping end end diff --git a/uml/cinelerra3/cinelerra3.prj b/uml/cinelerra3/cinelerra3.prj index 7d03110f4..cd49f3161 100644 --- a/uml/cinelerra3/cinelerra3.prj +++ b/uml/cinelerra3/cinelerra3.prj @@ -1,6 +1,6 @@ format 40 "cinelerra3" - revision 28 + revision 29 modified_by 5 "hiv" cpp_root_dir "../../src/" diff --git a/wiki/renderengine.html b/wiki/renderengine.html index 53f84aa82..f845eb46c 100644 --- a/wiki/renderengine.html +++ b/wiki/renderengine.html @@ -1367,9 +1367,10 @@ As a //first shot// Ichthyo considers the following approach: <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]]
          +[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.
          @@ -2063,6 +2064,16 @@ Simple relations can be hard wired. But, on the contrary, it would be as naive t
           
           One example of this problem is the [[handling of multichannel media|MultichannelMedia]]. Following the above reasoning, we end with having a [["structural processing pattern"|ProcPatt]], typically one video stream with MPEG decoder and a pair of audio streams which need either to be routed to some "left" and "right" output ports, or have to be passed through a panning filter accordingly. Now the problem is: //create a new instance of this structure for each new media, or detect which media to subsume under a existing pattern instance.//
          +
          +
          All Assets of kind asset::Proc represent //processing algorithms// in the bookkeeping view. They enable loading, browsing and maybe even parametrizing all the Effects, Plugins and Codecs available for use within the Cinelerra Session.
          +
          +Besides, they provide an important __inward interface__ for the [[ProcNode]]s, which will use these asset entries to dispatch the actual processing call when rendering. 
          +
          +{{red{todo: the naming scheme??}}}
          +
          +[img[Asset Classess|uml/fig131077.png]]
          +
          +
          The middle Layer of our current Architecture plan, i.e. the layer managing all processing and manipulation, while the actual data handling is done in the backend and the user interaction belongs to the GUI Layer.
           
          @@ -2430,6 +2441,17 @@ Instead, we should try to just connect the various subsystems via Interfaces and
           * to shield the rendering code of all complexities of thread communication and synchronization, we use the StateProxy
           
          +
          +
          Structural Assets are intended mainly for internal use, but the user should be able to see and query them. By changing the parametrisation of some structural Asset, we can customize the default behaviour of Cinelerra to some extent.
          +* [[Processing Patterns|ProcPatt]] encode the information, how to get at the actual media data when rendering a clip.
          +* Tracks are one of the dimensions used for organizing the EDL. Besides, they carry parametrisation of output port, overlay mode etc.
          +* Output Ports {{red{still need to be defined...}}}
          +
          +The Asset name field of structural Assets utilizes a special naming scheme, which allows to derive the name based on the capabilities of the structural asset. For example, by default all media clips with a given media stream type (e.g. H264) will use the same [[processing Pattern|ProcPatt]] for rendering. {{red{todo: work out the details of this naming scheme??}}}
          +
          +[img[Asset Classess|uml/fig131205.png]]
          +
          +
          /*{{{*/
           /* a contrasting background so I can see where one tiddler ends and the other begins */
          
          From 02b19268402dea3cd79dec6b17b0299f41656b0a Mon Sep 17 00:00:00 2001
          From: Ichthyostega 
          Date: Sat, 22 Sep 2007 16:44:50 +0200
          Subject: [PATCH 06/14] WIP: start implementing the new entities
          
          ---
           src/backend/mediaaccessfacade.cpp         |  33 ++++++
           src/backend/mediaaccessfacade.hpp         |  45 ++++++++
           src/proc/asset/buildinstruct.cpp          |  35 +++++++
           src/proc/asset/buildinstruct.hpp          |  71 +++++++++++++
           src/proc/asset/compoundmedia.cpp          |  33 ++++++
           src/proc/asset/compoundmedia.hpp          |  54 ++++++++++
           src/proc/asset/procpatt.cpp               |  34 ++++++
           src/proc/asset/procpatt.hpp               |  56 ++++++++++
           src/proc/mobject/session/compoundclip.cpp |  38 +++++++
           src/proc/mobject/session/compoundclip.hpp |  53 ++++++++++
           src/proc/mobject/session/simpleclip.cpp   |  38 +++++++
           src/proc/mobject/session/simpleclip.hpp   |  50 +++++++++
           uml/cinelerra3/128133                     |  26 +----
           uml/cinelerra3/128261                     |  25 ++++-
           uml/cinelerra3/129541                     |  42 +++++++-
           uml/cinelerra3/130053                     | 122 +++++++++++++++++++++-
           uml/cinelerra3/130437                     |  80 +++++++++++++-
           uml/cinelerra3/130437.diagram             |   6 +-
           uml/cinelerra3/5.session                  |   3 +-
           19 files changed, 812 insertions(+), 32 deletions(-)
           create mode 100644 src/backend/mediaaccessfacade.cpp
           create mode 100644 src/backend/mediaaccessfacade.hpp
           create mode 100644 src/proc/asset/buildinstruct.cpp
           create mode 100644 src/proc/asset/buildinstruct.hpp
           create mode 100644 src/proc/asset/compoundmedia.cpp
           create mode 100644 src/proc/asset/compoundmedia.hpp
           create mode 100644 src/proc/asset/procpatt.cpp
           create mode 100644 src/proc/asset/procpatt.hpp
           create mode 100644 src/proc/mobject/session/compoundclip.cpp
           create mode 100644 src/proc/mobject/session/compoundclip.hpp
           create mode 100644 src/proc/mobject/session/simpleclip.cpp
           create mode 100644 src/proc/mobject/session/simpleclip.hpp
          
          diff --git a/src/backend/mediaaccessfacade.cpp b/src/backend/mediaaccessfacade.cpp
          new file mode 100644
          index 000000000..b41277436
          --- /dev/null
          +++ b/src/backend/mediaaccessfacade.cpp
          @@ -0,0 +1,33 @@
          +/*
          +  MediaAccessFacade  -  functions for querying media file and channels.
          + 
          +  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 "backend/mediaaccessfacade.hpp"
          +
          +namespace backend_interface
          +  {
          +  
          +  /** */
          +
          +
          +
          +} // namespace backend_interface
          diff --git a/src/backend/mediaaccessfacade.hpp b/src/backend/mediaaccessfacade.hpp
          new file mode 100644
          index 000000000..be02109e6
          --- /dev/null
          +++ b/src/backend/mediaaccessfacade.hpp
          @@ -0,0 +1,45 @@
          +/*
          +  MEDIAACCESSFACADE.hpp  -  functions for querying media file and channels.
          + 
          +  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 BACKEND_INTERFACE_MEDIAACCESSFACADE_H
          +#define BACKEND_INTERFACE_MEDIAACCESSFACADE_H
          +
          +
          +
          +namespace backend_interface
          +  {
          +
          +
          +  /**
          +   * provides functions for querying (opening) a media file,
          +   * detecting the channels or streams found within this file etc. 
          +   * Delegating to the actual backend functions
          +   */
          +  class MediaAccessFacade
          +    {
          +    };
          +  
          +  
          +  
          +} // namespace backend_interface
          +#endif
          diff --git a/src/proc/asset/buildinstruct.cpp b/src/proc/asset/buildinstruct.cpp
          new file mode 100644
          index 000000000..b344d9ddf
          --- /dev/null
          +++ b/src/proc/asset/buildinstruct.cpp
          @@ -0,0 +1,35 @@
          +/*
          +  BuildInstruct  -  Instructions for building some configuration of render nodes.
          + 
          +  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/buildinstruct.hpp"
          +#include "proc/asset/procpatt.hpp"
          +#include "proc/asset/proc.hpp"
          +
          +namespace asset
          +  {
          +  
          +  /** */
          +
          +
          +
          +} // namespace asset
          diff --git a/src/proc/asset/buildinstruct.hpp b/src/proc/asset/buildinstruct.hpp
          new file mode 100644
          index 000000000..5aef64eb4
          --- /dev/null
          +++ b/src/proc/asset/buildinstruct.hpp
          @@ -0,0 +1,71 @@
          +/*
          +  BUILDINSTRUCT.hpp  -  Instructions for building some configuration of render nodes.
          + 
          +  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_BUILDINSTRUCT_H
          +#define ASSET_BUILDINSTRUCT_H
          +
          +#include 
          +
          +using std::string;
          +
          +
          +
          +namespace asset
          +  {
          +  
          +  class Proc;
          +  class ProcPatt;
          +
          +
          +  /**
          +   * (Interface) building instructions to be executed by the Builder
          +   *  on the render node network under construction.
          +   */
          +  class BuildInstruct
          +    {
          +    };
          +    
          +    
          +    
          +  class DoRecurse : public BuildInstruct
          +    {
          +    protected:
          +      const ProcPatt* subPattern;
          +
          +    };
          +    
          +    
          +  class DoAttach : public BuildInstruct
          +    {
          +    public:
          +      const Proc* nodes;
          +
          +      /** identifying the point where the nodes should be attached */
          +      const string point;
          +
          +    };
          +    
          +    
          +    
          +} // namespace asset
          +#endif
          diff --git a/src/proc/asset/compoundmedia.cpp b/src/proc/asset/compoundmedia.cpp
          new file mode 100644
          index 000000000..5cabaee22
          --- /dev/null
          +++ b/src/proc/asset/compoundmedia.cpp
          @@ -0,0 +1,33 @@
          +/*
          +  CompoundMedia  -  multichannel media
          + 
          +  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/compoundmedia.hpp"
          +
          +namespace asset
          +  {
          +  
          +  /** */
          +
          +
          +
          +} // namespace asset
          diff --git a/src/proc/asset/compoundmedia.hpp b/src/proc/asset/compoundmedia.hpp
          new file mode 100644
          index 000000000..62e4f4de0
          --- /dev/null
          +++ b/src/proc/asset/compoundmedia.hpp
          @@ -0,0 +1,54 @@
          +/*
          +  COMPOUNDMEDIA.hpp  -  multichannel media
          + 
          +  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_COMPOUNDMEDIA_H
          +#define ASSET_COMPOUNDMEDIA_H
          +
          +#include "proc/asset/media.hpp"
          +
          +#include 
          +
          +using std::vector;
          +
          +
          +
          +namespace asset
          +  {
          +
          +
          +  /**
          +   * compound of several elementary media tracks,
          +   * e.g. the individual media streams found in one media file
          +   */
          +  class CompoundMedia : public Media
          +    {
          +    protected:
          +      /** elementary media assets comprising this compound */
          +      vector tracks;
          +
          +    };
          +    
          +    
          +    
          +} // namespace asset
          +#endif
          diff --git a/src/proc/asset/procpatt.cpp b/src/proc/asset/procpatt.cpp
          new file mode 100644
          index 000000000..e1404e028
          --- /dev/null
          +++ b/src/proc/asset/procpatt.cpp
          @@ -0,0 +1,34 @@
          +/*
          +  ProcPatt  -  template for building some render processing network
          + 
          +  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/procpatt.hpp"
          +#include "proc/asset/buildinstruct.hpp"
          +
          +namespace asset
          +  {
          +  
          +  /** */
          +
          +
          +
          +} // namespace asset
          diff --git a/src/proc/asset/procpatt.hpp b/src/proc/asset/procpatt.hpp
          new file mode 100644
          index 000000000..9cf9db9d7
          --- /dev/null
          +++ b/src/proc/asset/procpatt.hpp
          @@ -0,0 +1,56 @@
          +/*
          +  PROCPATT.hpp  -  template for building some render processing network
          + 
          +  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_PROCPATT_H
          +#define ASSET_PROCPATT_H
          +
          +#include "proc/asset/struct.hpp"
          +
          +#include 
          +
          +using std::vector;
          +
          +
          +
          +namespace asset
          +  {
          +  
          +  class BuildInstruct;
          +
          +
          +  /**
          +   * special type of structural Asset 
          +   * representing information how to build some part 
          +   * of the render engine's processing nodes network.
          +   */
          +  class ProcPatt : public Struct
          +    {
          +    protected:
          +      const vector instructions;
          +
          +    };
          +    
          +    
          +    
          +} // namespace asset
          +#endif
          diff --git a/src/proc/mobject/session/compoundclip.cpp b/src/proc/mobject/session/compoundclip.cpp
          new file mode 100644
          index 000000000..e5bea5744
          --- /dev/null
          +++ b/src/proc/mobject/session/compoundclip.cpp
          @@ -0,0 +1,38 @@
          +/*
          +  CompoundClip  -  compound of several clips (multichannel)
          + 
          +  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/mobject/session/compoundclip.hpp"
          +
          +namespace mobject
          +  {
          +
          +  namespace session
          +    {
          +    
          +    /** */
          +
          +
          +
          +  } // namespace mobject::session
          +
          +} // namespace mobject
          diff --git a/src/proc/mobject/session/compoundclip.hpp b/src/proc/mobject/session/compoundclip.hpp
          new file mode 100644
          index 000000000..ee2fc5785
          --- /dev/null
          +++ b/src/proc/mobject/session/compoundclip.hpp
          @@ -0,0 +1,53 @@
          +/*
          +  COMPOUNDCLIP.hpp  -  compound of several clips (multichannel)
          + 
          +  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_COMPOUNDCLIP_H
          +#define MOBJECT_SESSION_COMPOUNDCLIP_H
          +
          +#include "proc/mobject/session/clip.hpp"
          +
          +
          +
          +namespace mobject
          +  {
          +
          +  namespace session
          +    {
          +
          +
          +    /**
          +     * Clip MObject which is actually a compound of several elementary clips,
          +     * e.g. the several streams found within multichannels media.
          +     */
          +    class CompoundClip : public Clip
          +      {
          +      protected:
          +        Clip* components;
          +
          +      };
          +      
          +      
          +  } // namespace mobject::session
          +
          +} // namespace mobject
          +#endif
          diff --git a/src/proc/mobject/session/simpleclip.cpp b/src/proc/mobject/session/simpleclip.cpp
          new file mode 100644
          index 000000000..0797ed1de
          --- /dev/null
          +++ b/src/proc/mobject/session/simpleclip.cpp
          @@ -0,0 +1,38 @@
          +/*
          +  SimpleClip  -  Elementary clip (single media stream only)
          + 
          +  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/mobject/session/simpleclip.hpp"
          +
          +namespace mobject
          +  {
          +
          +  namespace session
          +    {
          +    
          +    /** */
          +
          +
          +
          +  } // namespace mobject::session
          +
          +} // namespace mobject
          diff --git a/src/proc/mobject/session/simpleclip.hpp b/src/proc/mobject/session/simpleclip.hpp
          new file mode 100644
          index 000000000..f462eff94
          --- /dev/null
          +++ b/src/proc/mobject/session/simpleclip.hpp
          @@ -0,0 +1,50 @@
          +/*
          +  SIMPLECLIP.hpp  -  Elementary clip (single media stream only)
          + 
          +  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_SIMPLECLIP_H
          +#define MOBJECT_SESSION_SIMPLECLIP_H
          +
          +#include "proc/mobject/session/clip.hpp"
          +
          +
          +
          +namespace mobject
          +  {
          +
          +  namespace session
          +    {
          +
          +
          +    /**
          +     * Elementary clip consisting of only one media stream
          +     */
          +    class SimpleClip : public Clip
          +      {
          +      };
          +      
          +      
          +      
          +  } // namespace mobject::session
          +
          +} // namespace mobject
          +#endif
          diff --git a/uml/cinelerra3/128133 b/uml/cinelerra3/128133
          index 9e7642989..83eaacc4c 100644
          --- a/uml/cinelerra3/128133
          +++ b/uml/cinelerra3/128133
          @@ -1,6 +1,6 @@
           format 40
           "Asset" // ProcessingLayer::Asset
          -  revision 12
          +  revision 13
             modified_by 5 "hiv"
             // class settings
             //class diagram settings
          @@ -433,7 +433,7 @@ ${inlines}
                 classrelation 144261 // 
           	relation 142341 -_->
           	  a default
          -	    cpp default "Generated"
          +	    cpp default "#include in header"
           	    classrelation_ref 144261 // 
           	  b multiplicity "" parent class_ref 139525 // MediaAccessFacade
                 end
          @@ -727,6 +727,7 @@ ${inlines}
                 idl_decl ""
                 explicit_switch_type ""
                 
          +      comment "special type of structural Asset representing information how to build some part of the render engine's processing nodes network."
                 classrelation 143109 // 
           	relation 141189 ---|>
           	  a public
          @@ -781,26 +782,6 @@ ${inlines}
                 comment "Implementation of the registry holding all Asset instances known to the Asset Manager subsystem. As of 8/2007 implemented by a hashtable."
               end
           
          -    class 138885 "SimpleClip"
          -      visibility package 
          -      cpp_decl "${comment}${template}class ${name}${inherit}
          -  {
          -${members}  };
          -${inlines}
          -"
          -      java_decl ""
          -      idl_decl ""
          -      explicit_switch_type ""
          -      
          -      classrelation 143365 // 
          -	relation 141445 ---|>
          -	  a public
          -	    cpp default "${type}"
          -	    classrelation_ref 143365 // 
          -	  b multiplicity "" parent class_ref 128901 // Clip
          -      end
          -    end
          -
               class 139013 "BuildInstruct"
                 visibility package 
                 cpp_decl "${comment}${template}class ${name}${inherit}
          @@ -812,6 +793,7 @@ ${inlines}
                 idl_decl ""
                 explicit_switch_type ""
                 
          +      comment "(Interface) building instructions to be executed by the Builder on the render node network under construction."
               end
           
               class 139141 "DoAttach"
          diff --git a/uml/cinelerra3/128261 b/uml/cinelerra3/128261
          index 0e2183209..5addfc8e9 100644
          --- a/uml/cinelerra3/128261
          +++ b/uml/cinelerra3/128261
          @@ -1,6 +1,6 @@
           format 40
           "MObject" // ProcessingLayer::MObject
          -  revision 19
          +  revision 20
             modified_by 5 "hiv"
             // class settings
             //class diagram settings
          @@ -426,6 +426,27 @@ ${inlines}
                 end
               end
           
          +    class 138885 "SimpleClip"
          +      visibility package 
          +      cpp_decl "${comment}${template}class ${name}${inherit}
          +  {
          +${members}  };
          +${inlines}
          +"
          +      java_decl ""
          +      idl_decl ""
          +      explicit_switch_type ""
          +      
          +      comment "Elementary clip consisting of only one media stream"
          +      classrelation 143365 // 
          +	relation 141445 ---|>
          +	  a public
          +	    cpp default "${type}"
          +	    classrelation_ref 143365 // 
          +	  b multiplicity "" parent class_ref 128901 // Clip
          +      end
          +    end
          +
               class 138629 "CompoundClip"
                 visibility package 
                 cpp_decl "${comment}${template}class ${name}${inherit}
          @@ -438,6 +459,8 @@ ${inlines}
                 explicit_switch_type ""
                 
                 associated_diagram classdiagram_ref 128133 // Session structure
          +      comment "Clip MObject which is actually a compound of several elementary clips,
          +e.g. the several streams found within multichannels media."
                 classrelation 142597 // 
           	relation 140805 ---|>
           	  a public
          diff --git a/uml/cinelerra3/129541 b/uml/cinelerra3/129541
          index 71af7ea97..17dbcb447 100644
          --- a/uml/cinelerra3/129541
          +++ b/uml/cinelerra3/129541
          @@ -1,6 +1,6 @@
           format 40
           "backend" // design::codegen::backend
          -  revision 5
          +  revision 6
             modified_by 5 "hiv"
             // class settings
             //class diagram settings
          @@ -29,7 +29,7 @@ format 40
             stereotype "src"
             cpp_h_dir "backend"
             cpp_src_dir "backend"
          -  cpp_namespace "data"
          +  cpp_namespace "backend_interface"
             comment "sourcecode package
           
           Data backend classes here..."
          @@ -37,5 +37,43 @@ Data backend classes here..."
               //deployment diagram settings
               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
          +    artifact 138629 "mediaaccessfacade"
          +      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 139525 // MediaAccessFacade
          +      end
          +      comment "functions for querying media file and channels."
          +    end
             end
           end
          diff --git a/uml/cinelerra3/130053 b/uml/cinelerra3/130053
          index c61e1e94f..73baabcbc 100644
          --- a/uml/cinelerra3/130053
          +++ b/uml/cinelerra3/130053
          @@ -1,6 +1,6 @@
           format 40
           "asset" // design::codegen::proc::asset
          -  revision 6
          +  revision 7
             modified_by 5 "hiv"
             // class settings
             //class diagram settings
          @@ -312,6 +312,46 @@ ${namespace_end}"
                 comment "bookkeeping (asset) view of a media clip."
               end
           
          +    artifact 138245 "compoundmedia"
          +      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 138501 // CompoundMedia
          +      end
          +      comment "a special clip as a compound of several elementary media tracks,
          +e.g. the individual media streams found in one media file"
          +    end
          +
               artifact 136965 "preview"
                 stereotype "source"
                 cpp_h "/*
          @@ -546,6 +586,86 @@ ${namespace_end}"
                 comment "structural asset holding the configuration of a track in the EDL"
               end
           
          +    artifact 137989 "procpatt"
          +      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 138757 // ProcPatt
          +      end
          +      comment "template for building some render processing network"
          +    end
          +
          +    artifact 138117 "buildinstruct"
          +      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 139013 // BuildInstruct
          +	class_ref 139269 // DoRecurse
          +	class_ref 139141 // DoAttach
          +      end
          +      comment "Instructions for building some configuration of render nodes."
          +    end
          +
               artifact 137861 "db"
                 stereotype "source"
                 cpp_h "/*
          diff --git a/uml/cinelerra3/130437 b/uml/cinelerra3/130437
          index d1f52243d..734633b1d 100644
          --- a/uml/cinelerra3/130437
          +++ b/uml/cinelerra3/130437
          @@ -1,6 +1,6 @@
           format 40
           "session" // design::codegen::proc::mobject::session
          -  revision 6
          +  revision 7
             modified_by 5 "hiv"
             // class settings
             //class diagram settings
          @@ -316,6 +316,84 @@ ${namespace_end}"
                 comment "a Media Clip"
               end
           
          +    artifact 138373 "simpleclip"
          +      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 138885 // SimpleClip
          +      end
          +      comment "Elementary clip (single media stream only)"
          +    end
          +
          +    artifact 138501 "compoundclip"
          +      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 138629 // CompoundClip
          +      end
          +      comment "compound of several clips (multichannel)"
          +    end
          +
               artifact 129541 "effect"
                 stereotype "source"
                 cpp_h "/*
          diff --git a/uml/cinelerra3/130437.diagram b/uml/cinelerra3/130437.diagram
          index afc8cb1fb..2388a38ee 100644
          --- a/uml/cinelerra3/130437.diagram
          +++ b/uml/cinelerra3/130437.diagram
          @@ -221,7 +221,7 @@ relationcanvas 140549 relation_ref 141573 // 
             multiplicity_a_pos 160 260 3000 multiplicity_b_pos 142 268 3000
           relationcanvas 140933 relation_ref 141701 // 
             from ref 139013 z 1999 stereotype "<>" xyz 713 174 3000 to ref 140805
          -  role_a_pos 745 206 3000 no_role_b
          +  role_a_pos 748 206 3000 no_role_b
             multiplicity_a_pos 712 206 3000 multiplicity_b_pos 733 164 3000
           relationcanvas 141445 relation_ref 141829 // 
             geometry VHV
          @@ -241,11 +241,11 @@ relationcanvas 142213 relation_ref 142085 // 
             from ref 141317 z 1999 to point 812 270
             line 142341 z 1999 to point 812 131
             line 142469 z 1999 to ref 139013
          -  role_a_pos 780 159 3000 no_role_b
          +  role_a_pos 794 109 3000 no_role_b
             multiplicity_a_pos 794 142 3000 multiplicity_b_pos 794 299 3000
           relationcanvas 142597 relation_ref 142213 // 
             from ref 141189 z 1999 stereotype "<>" xyz 656 360 3000 to ref 141061
          -  role_a_pos 643 374 3000 no_role_b
          +  role_a_pos 650 367 3000 no_role_b
             multiplicity_a_pos 614 367 3000 no_multiplicity_b
           relationcanvas 142853 relation_ref 139269 // 
             from ref 142725 z 1999 to ref 141061
          diff --git a/uml/cinelerra3/5.session b/uml/cinelerra3/5.session
          index 15afb5ad6..b6381c7cf 100644
          --- a/uml/cinelerra3/5.session
          +++ b/uml/cinelerra3/5.session
          @@ -16,8 +16,7 @@ open
             
             package_ref 128005 // design
             classview_ref 128901 // Assets
          -  classview_ref 128133 // Engine Workings
          +  classview_ref 128005 // Session
             classview_ref 129029 // Interface
          -  componentview_ref 128266 // FileMapping
           end
           end
          
          From 7585c5c358e447a36649b3d8099f65cd8af34f74 Mon Sep 17 00:00:00 2001
          From: Ichthyostega 
          Date: Sun, 23 Sep 2007 13:31:33 +0200
          Subject: [PATCH 07/14] WIP reorganize singleton factory
          
          ---
           src/backend/mediaaccessfacade.hpp             | 10 ++++++-
           .../{singleton.hpp => singletonfactory.hpp}   | 26 +++++++++----------
           src/common/singletonpolicies.hpp              | 20 +++++++++++++-
           3 files changed, 41 insertions(+), 15 deletions(-)
           rename src/common/{singleton.hpp => singletonfactory.hpp} (87%)
          
          diff --git a/src/backend/mediaaccessfacade.hpp b/src/backend/mediaaccessfacade.hpp
          index be02109e6..24baeb89f 100644
          --- a/src/backend/mediaaccessfacade.hpp
          +++ b/src/backend/mediaaccessfacade.hpp
          @@ -25,18 +25,26 @@
           #define BACKEND_INTERFACE_MEDIAACCESSFACADE_H
           
           
          +#include "common/singleton.hpp"
          +
          +
           
           namespace backend_interface
             {
           
           
             /**
          +   * Interface to the backend layer:
              * provides functions for querying (opening) a media file,
              * detecting the channels or streams found within this file etc. 
          -   * Delegating to the actual backend functions
          +   * Implemention delegating to the actual backend functions.
              */
             class MediaAccessFacade
               {
          +    public:
          +      static Singleton instance;
          +      
          +      
               };
             
             
          diff --git a/src/common/singleton.hpp b/src/common/singletonfactory.hpp
          similarity index 87%
          rename from src/common/singleton.hpp
          rename to src/common/singletonfactory.hpp
          index 5c9018f78..2647a6f2c 100644
          --- a/src/common/singleton.hpp
          +++ b/src/common/singletonfactory.hpp
          @@ -1,5 +1,5 @@
           /*
          -  SINGLETON.hpp  -  template for implementing the singleton pattern
          +  SINGLETONFACTORY.hpp  -  template for implementing the singleton pattern
            
             Copyright (C)         CinelerraCV
               2007,               Christian Thaeter 
          @@ -31,16 +31,16 @@ This code is heavily inspired by
           
           
           
          -#ifndef CINELERRA_SINGLETON_H
          -#define CINELERRA_SINGLETON_H
          +#ifndef CINELERRA_SINGLETONFACTORY_H
          +#define CINELERRA_SINGLETONFACTORY_H
           
           
          -#include "common/singletonpolicies.hpp"  ///< several Policies usable together with singleton
          +#include "common/singletonpolicies.hpp"  ///< several Policies usable together with SingletonFactory
           
           #include "common/util.hpp"
           #include "nobugcfg.h"
           
          -#include 
          +//#include 
           
           
           namespace cinelerra
          @@ -58,7 +58,7 @@ namespace cinelerra
                 template  class Life      = singleton::Automatic,  // how to manage Singleton Lifecycle
                 template  class Threading = singleton::IgnoreThreadsafety  //TODO use Multithreaded!!!
               >
          -  class Singleton
          +  class SingletonFactory
               {
                 typedef typename Threading::VolatileType SType;
                 typedef typename Threading::Lock ThreadLock;
          @@ -66,7 +66,7 @@ namespace cinelerra
                 static bool isDead_;
                 
               public:
          -      /** Interface to be used by Singleton's clients.
          +      /** Interface to be used by SingletonFactory's clients.
                  *  Manages internally the instance creation, lifecycle 
                  *  and access handling in a multithreaded context.
                  *  @return "the" single instance of class S 
          @@ -107,15 +107,15 @@ namespace cinelerra
               };
               
             
          -  // Storage for Singleton's static fields...  
          +  // Storage for SingletonFactory's static fields...  
             template
               < class SI,
                 template  class C,
                 template  class L,
                 template  class T
               >
          -    typename Singleton::SType* 
          -    Singleton::pInstance_;
          +    typename SingletonFactory::SType* 
          +    SingletonFactory::pInstance_;
             
             template
               < class SI,
          @@ -123,7 +123,7 @@ namespace cinelerra
                 template  class L,
                 template  class T
               >
          -    bool Singleton::isDead_;
          +    bool SingletonFactory::isDead_;
           
           
             
          @@ -134,9 +134,9 @@ namespace cinelerra
             
                 /** @internal used to link together the Create policy and Life policy.
                  *  @return a functor object for invoking this->destroy() */
          -/*      singleton::DelFunc getDeleter() 
          +/*      SingletonFactory::DelFunc getDeleter() 
                   {
          -          return boost::bind (&Singleton::destroy,
          +          return boost::bind (&SingletonFactory::destroy,
                                         this);
                   }
           */
          diff --git a/src/common/singletonpolicies.hpp b/src/common/singletonpolicies.hpp
          index a5d499c12..b1d91412c 100644
          --- a/src/common/singletonpolicies.hpp
          +++ b/src/common/singletonpolicies.hpp
          @@ -55,7 +55,7 @@ namespace cinelerra
                     static S* create ()
                       {
           #ifdef DEBUG
          -              static uint callCount (0);
          +              static uint callCount = 0;
                         ASSERT ( 0 == callCount++ );
           #endif              
                         static char buff[sizeof(S)];
          @@ -77,6 +77,24 @@ namespace cinelerra
                     static S* create ()         { return new S; }
                     static void destroy (S* pS) { delete pS;    }
                   };
          +        
          +        
          +      /** 
          +       *  Policy for creating dynamic Singleton instance, with 
          +       *  additional facility to support Mock testing. When injecting
          +       *  a Mock instance (typically a subclass of the product), the
          +       *  main Singleton instance is temporarily shaddowed.
          +       */
          +      template
          +      struct DynamicMockTestable
          +        {
          +          static S* create ()         { return new S; }
          +          static void destroy (S* pS) { delete pS;    }
          +        };
          +      void injectSubclass (SI* mock)
          +        {
          +          
          +        }
                 
           
                   
          
          From eef591f87340f5dcc1cc9823f7a4731b1aaf0038 Mon Sep 17 00:00:00 2001
          From: Ichthyostega 
          Date: Sun, 23 Sep 2007 16:50:05 +0200
          Subject: [PATCH 08/14] WIP injecting a test-mock instead of a singleton
          
          ---
           src/backend/mediaaccessfacade.cpp             |   4 +-
           src/common/multithread.hpp                    |   1 +
           src/common/singleton.hpp                      |  52 +++++
           src/common/singletonfactory.hpp               |  10 +-
           src/common/singletonpolicies.hpp              |  22 +-
           src/common/singletonpreconfigure.hpp          | 112 +++++++++
           src/common/test/mockinjector.hpp              |  94 ++++++++
           src/nobugcfg.h                                |   4 +-
           src/proc/asset/db.hpp                         |   2 +-
           src/proc/assetmanager.hpp                     |   2 +-
           tests/components/common/singletontest.cpp     |  12 +-
           .../common/singletontestmocktest.cpp          | 213 ++++++++++++++++++
           12 files changed, 496 insertions(+), 32 deletions(-)
           create mode 100644 src/common/singleton.hpp
           create mode 100644 src/common/singletonpreconfigure.hpp
           create mode 100644 src/common/test/mockinjector.hpp
           create mode 100644 tests/components/common/singletontestmocktest.cpp
          
          diff --git a/src/backend/mediaaccessfacade.cpp b/src/backend/mediaaccessfacade.cpp
          index b41277436..720c31864 100644
          --- a/src/backend/mediaaccessfacade.cpp
          +++ b/src/backend/mediaaccessfacade.cpp
          @@ -26,7 +26,9 @@
           namespace backend_interface
             {
             
          -  /** */
          +  /** storage for the SingletonFactory 
          +   *  (actually a cinelerra::test::MockInjector) */
          +  Singleton MediaAccessFacade::instance;
           
           
           
          diff --git a/src/common/multithread.hpp b/src/common/multithread.hpp
          index 9451ada05..c4a070104 100644
          --- a/src/common/multithread.hpp
          +++ b/src/common/multithread.hpp
          @@ -25,6 +25,7 @@
           #ifndef CINELERRA_MULTITHREAD_H
           #define CINELERRA_MULTITHREAD_H
           
          +#include "nobugcfg.h"
           
           
           namespace cinelerra
          diff --git a/src/common/singleton.hpp b/src/common/singleton.hpp
          new file mode 100644
          index 000000000..28100784d
          --- /dev/null
          +++ b/src/common/singleton.hpp
          @@ -0,0 +1,52 @@
          +/*
          +  SINGLETON.hpp  -  configuration header for singleton 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.
          + 
          +*/
          +
          +/** @file singleton.hpp
          + ** Factory for creating Singleton instances.
          + ** This configuration header just pulls in some other implementation headers in 
          + ** the right order. The basic class template for creating singletons resides in
          + ** singletonfactory.hpp, besides we need policy classes defining how to create
          + ** the singleton objects, how to manage lifecycle and multithreading. Finally,
          + ** we want to preconfigure singleton factories for some important facilities;
          + ** e.g. sometimes we want to include a hook for injecting Test Mock instances.
          + **
          + ** You'll find the default Policies in singletonfactory.hpp and the default
          + ** definition of type cinelerra::singleton in singletonpreconfigure.hpp
          + ** 
          + ** @see SingletonFactory
          + ** @see singleton::StaticCreate
          + ** @see singleton::AutoDestroy 
          + ** @see singletontest.hpp
          + ** @see singletontestmocktest.hpp
          + */
          +
          +
          +#ifndef CINELERRA_SINGLETON_H
          +#define CINELERRA_SINGLETON_H
          +
          +
          +#include "common/singletonpolicies.hpp"
          +#include "common/singletonfactory.hpp"
          +#include "common/singletonpreconfigure.hpp"
          +
          +
          +#endif
          diff --git a/src/common/singletonfactory.hpp b/src/common/singletonfactory.hpp
          index 2647a6f2c..b2143ef7a 100644
          --- a/src/common/singletonfactory.hpp
          +++ b/src/common/singletonfactory.hpp
          @@ -54,8 +54,8 @@ namespace cinelerra
              */
             template
               < class SI,  // the class to make Singleton
          -      template  class Create    = singleton::Static,     // how to create/destroy the instance
          -      template  class Life      = singleton::Automatic,  // how to manage Singleton Lifecycle
          +      template  class Create    = singleton::StaticCreate,  // how to create/destroy the instance
          +      template  class Life      = singleton::AutoDestroy,  // how to manage Singleton Lifecycle
                 template  class Threading = singleton::IgnoreThreadsafety  //TODO use Multithreaded!!!
               >
             class SingletonFactory
          @@ -99,6 +99,8 @@ namespace cinelerra
                  */
                 static void destroy()
                   {
          +          TRACE (singleton, "Singleton: triggering destruction");
          +          
                     REQUIRE (!isDead_);
                     Create::destroy (pInstance_);
                     pInstance_ = 0;
          @@ -131,7 +133,9 @@ namespace cinelerra
           /////       is tricky because of invoking the destructors. If we rely on instance vars,
           /////       the object may already have been released when the runtime system calls the
           /////       destructors of static objects at shutdown.
          -  
          +/////       It seems this would either cost us much of the flexibility or get complicated
          +/////       to a point where we could as well implement our own Depenency Injection Manager.
          +
                 /** @internal used to link together the Create policy and Life policy.
                  *  @return a functor object for invoking this->destroy() */
           /*      SingletonFactory::DelFunc getDeleter() 
          diff --git a/src/common/singletonpolicies.hpp b/src/common/singletonpolicies.hpp
          index b1d91412c..5f5624990 100644
          --- a/src/common/singletonpolicies.hpp
          +++ b/src/common/singletonpolicies.hpp
          @@ -50,7 +50,7 @@ namespace cinelerra
                  * Policy for creating the Singleton instance statically
                  */
                 template
          -      struct Static
          +      struct StaticCreate
                   {
                     static S* create ()
                       {
          @@ -72,29 +72,13 @@ namespace cinelerra
                  * Policy for creating the Singleton instance heap allocated
                  */
                 template
          -      struct Heap
          +      struct HeapCreate
                   {
                     static S* create ()         { return new S; }
                     static void destroy (S* pS) { delete pS;    }
                   };
                   
                   
          -      /** 
          -       *  Policy for creating dynamic Singleton instance, with 
          -       *  additional facility to support Mock testing. When injecting
          -       *  a Mock instance (typically a subclass of the product), the
          -       *  main Singleton instance is temporarily shaddowed.
          -       */
          -      template
          -      struct DynamicMockTestable
          -        {
          -          static S* create ()         { return new S; }
          -          static void destroy (S* pS) { delete pS;    }
          -        };
          -      void injectSubclass (SI* mock)
          -        {
          -          
          -        }
                 
           
                   
          @@ -105,7 +89,7 @@ namespace cinelerra
                  * Policy relying on the compiler/runtime system for Singleton Lifecycle
                  */
                 template
          -      struct Automatic
          +      struct AutoDestroy
                   {
                     /** implements the Singleton removal by calling
                      *  the provided deleter function(s) at application shutdown,
          diff --git a/src/common/singletonpreconfigure.hpp b/src/common/singletonpreconfigure.hpp
          new file mode 100644
          index 000000000..f2171fd82
          --- /dev/null
          +++ b/src/common/singletonpreconfigure.hpp
          @@ -0,0 +1,112 @@
          +/*
          +  SINGLETONPRECONFIGURE  -  declare the configuration of some Singleton types in advance
          + 
          +  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.
          + 
          +*/
          +
          +/** @file singletonpreconfigure.hpp
          + ** Preconfiguration of some Singleton types, done by template specialisation.
          + ** Typically the client code just includes singleton.h and uses the Singleton
          + ** type. But in some cases, we want to configure specific (dependency injection)
          + ** behaviour at a central location. At some point, we may well have a full blown
          + ** Dependency Manager, but for the moment using just some specialized Singleton
          + ** type for some instances seems sufficient.
          + **
          + ** One Reason why one wants special Singleton behaviour is Testing: Without
          + ** altering the executable, for running some Tests we need to inject a Test Mock
          + ** in place of some Service Object, so we can verify the behaviour of the code
          + ** using this Service. For this, we mix cinelerra::test::MockInjector
          + ** into the actual Singleton type.
          + **
          + ** @note we declare the specialisations into the target namespace
          + **
          + ** @see SingletonFactory
          + ** @see singletontestmocktest.hpp
          + */
          +
          +
          +#ifndef CINELERRA_SINGLETONPRECONFIGURE_H
          +#define CINELERRA_SINGLETONPRECONFIGURE_H
          +
          +#include "common/test/mockinjector.hpp"
          +
          +
          +namespace cinelerra
          +  {
          +  /**
          +   * Default Singleton configuration
          +   * @note all Policy template parameters taking default values
          +   */
          +  template 
          +  class Singleton 
          +    : public SingletonFactory
          +    { }
          +    ;
          +    
          +    
          +  /* ********************************************************************** */
          +  /* Forward declarations of all Classes we want to specialize the template */
          +  /* ********************************************************************** */
          +    
          +  namespace test
          +    {
          +    class TargetObj;
          +    using cinelerra::Singleton;
          +    
          +  } // namespace test
          +}  // namespace cinelerra
          +
          +namespace backend_interface
          +  {
          +  class MediaAccessFacade;
          +  using cinelerra::Singleton;
          +    
          +} // namespace backend_interface
          +
          +
          +
          +
          +
          +  /* ************************** */
          +  /* Specialisation Definitions */
          +  /* ************************** */
          +
          +namespace cinelerra
          +  {
          +  
          +  using test::MockInjector;
          +  
          +    
          +  template<>
          +  class Singleton
          +    : public MockInjector
          +    { };
          +
          +    
          +  template<>
          +  class Singleton
          +    : public MockInjector
          +    { };
          +
          +} // namespace cinelerra
          +
          +
          +
          +
          +#endif
          diff --git a/src/common/test/mockinjector.hpp b/src/common/test/mockinjector.hpp
          new file mode 100644
          index 000000000..2bd20f25a
          --- /dev/null
          +++ b/src/common/test/mockinjector.hpp
          @@ -0,0 +1,94 @@
          +/*
          +  MOCKINJECTOR.hpp  -  replacement singleton factory for injecting Test-Mock objects
          + 
          +  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_MOCKINJECTOR_H
          +#define CINELERRA_TEST_MOCKINJECTOR_H
          +
          +
          +#include "common/singletonfactory.hpp"
          +
          +#include 
          +
          +
          +namespace cinelerra
          +  {
          +  namespace test
          +    {
          +    using boost::scoped_ptr;
          +    
          +    /**
          +     * Special SingletonFactory allowing to inject some instance of the Singleton
          +     * class, thus shaddowing "the" (default) Singleton instance temporarily.
          +     * This allows installing a Mock Subclass of the Singleton for running tests,
          +     * while the Singleton can be used as usual in production code.
          +     * @note we use the default policies or SingletonFactory 
          +     */
          +    template
          +    class MockInjector : public SingletonFactory
          +      {
          +        scoped_ptr mock_;
          +        
          +      public:
          +        /** Overwriting the normal Singleton creation Interface
          +         *  to return some mock if defined, falling back to the
          +         *  default Singleton creation behaviour else.
          +         */
          +        SI& operator() ()
          +          {
          +            if (mock_)
          +              return *mock_;
          +            else
          +              return SingletonFactory::operator() ();
          +          }
          +        
          +        void injectSubclass (SI* mockobj)
          +          {
          +            TRACE_IF (mockobj,  singleton, "Singleton: installing Mock object");
          +            TRACE_IF (!mockobj, singleton, "Singleton: removing Mock object");
          +            mock_.reset (mockobj);
          +          }
          +        
          +        
          +        MockInjector () {};
          +        
          +        /** @note MockInjector singleton factory objects can be copied,
          +         *        but the copy will start out with clean internal state,
          +         *        i.e. exhibiting normal SingletonFactory behaviour
          +         *        without mock object.
          +         */
          +        MockInjector (const MockInjector& other) 
          +          : SingletonFactory(other), mock_(0) { }
          +        
          +        MockInjector& operator= (const MockInjector& other)
          +          {
          +            return SingletonFactory::operator= (other);
          +          }
          +      };
          +      
          +      
          +      
          +  } // namespace test
          +
          +} // namespace cinelerra
          +#endif
          diff --git a/src/nobugcfg.h b/src/nobugcfg.h
          index bca0108b4..c16a569c0 100644
          --- a/src/nobugcfg.h
          +++ b/src/nobugcfg.h
          @@ -50,6 +50,7 @@
             /* declare flags used throughout the code base... */
             NOBUG_DECLARE_FLAG(config);
             NOBUG_DECLARE_FLAG(test);
          +  NOBUG_DECLARE_FLAG(singleton);
             NOBUG_DECLARE_FLAG(assetmem);
             NOBUG_DECLARE_FLAG(mobjectmem);
           
          @@ -76,7 +77,8 @@
             /* flags used throughout the code base... */
             NOBUG_CPP_DEFINE_FLAG(config);
             NOBUG_CPP_DEFINE_FLAG(test);
          -  NOBUG_CPP_DEFINE_FLAG_LIMIT(assetmem, LOG_WARNING);
          +  NOBUG_CPP_DEFINE_FLAG_LIMIT(singleton, LOG_WARNING);
          +  NOBUG_CPP_DEFINE_FLAG_LIMIT(assetmem,  LOG_WARNING);
             NOBUG_CPP_DEFINE_FLAG_LIMIT(mobjectmem, LOG_WARNING);
           
           #include "common/error.hpp"
          diff --git a/src/proc/asset/db.hpp b/src/proc/asset/db.hpp
          index b9faa0a42..d2fd0d02f 100644
          --- a/src/proc/asset/db.hpp
          +++ b/src/proc/asset/db.hpp
          @@ -86,7 +86,7 @@ namespace asset
                 DB () : table() {}
                 ~DB ()          {}
                 
          -      friend class cinelerra::singleton::Static;
          +      friend class cinelerra::singleton::StaticCreate;
                 
                 
               public:
          diff --git a/src/proc/assetmanager.hpp b/src/proc/assetmanager.hpp
          index c677f6ef4..8afd1a53a 100644
          --- a/src/proc/assetmanager.hpp
          +++ b/src/proc/assetmanager.hpp
          @@ -108,7 +108,7 @@ namespace asset
                 
                 AssetManager ();
                 
          -      friend class cinelerra::singleton::Static;
          +      friend class cinelerra::singleton::StaticCreate;
                 
                 
               private:
          diff --git a/tests/components/common/singletontest.cpp b/tests/components/common/singletontest.cpp
          index 1bc280585..e29f6e223 100644
          --- a/tests/components/common/singletontest.cpp
          +++ b/tests/components/common/singletontest.cpp
          @@ -58,8 +58,8 @@ namespace cinelerra
                 protected:
                   TargetObj () : TestTargetObj(cnt) {}
                   
          -        friend class singleton::Static;
          -        friend class singleton::Heap;
          +        friend class singleton::StaticCreate;
          +        friend class singleton::HeapCreate;
                 };
               
               int TargetObj::cnt = 0;
          @@ -74,8 +74,8 @@ namespace cinelerra
                * @test implement a Singleton class using our Singleton Template.
                * Expected results: no memory leaks.
                * @see  cinelerra::Singleton
          -     * @see  cinelerra::singleton::Static
          -     * @see  cinelerra::singleton::Heap
          +     * @see  cinelerra::singleton::StaticCreate
          +     * @see  cinelerra::singleton::HeapCreate
                */
               class Singleton_test : public Test
                 {
          @@ -96,7 +96,7 @@ namespace cinelerra
                    */
                   void testStaticallyAllocatedSingleton (uint num)
                     {
          -            Singleton single;
          +            SingletonFactory single;
                       instance = single;
                       useInstance (num, "statically allocated");
                     }
          @@ -107,7 +107,7 @@ namespace cinelerra
                    */
                   void testHeapAllocatedSingleton (uint num)
                     {
          -            Singleton single;
          +            SingletonFactory single;
                       instance = single;
                       useInstance (num, "heap allocated");
                     }
          diff --git a/tests/components/common/singletontestmocktest.cpp b/tests/components/common/singletontestmocktest.cpp
          new file mode 100644
          index 000000000..a5f900a2a
          --- /dev/null
          +++ b/tests/components/common/singletontestmocktest.cpp
          @@ -0,0 +1,213 @@
          +/*
          +  SingletonTestMock(Test)  -  using Singleton for injecting Test-Mocks
          + 
          +  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/singleton.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
          +    {
          +    
          +
          +    /**
          +     * Client Class normally to be instantiated as Singleton.
          +     * But for tests, this class should be replaced by a Mock....
          +     */
          +    class TargetObj
          +      {
          +        int callCnt;
          +        char* typid;
          +        format msg;
          +        
          +      public:
          +        TargetObj(char* ty="TargetObj") 
          +          : callCnt (0), typid(ty), msg ("%s::doIt() call=%d\n")
          +          {
          +            TRACE (singleton, "ctor %s", typid);
          +          }
          +        virtual ~TargetObj()
          +          {
          +            TRACE (singleton, "dtor %s", typid);
          +          }
          +        
          +        void doIt ()
          +          {
          +            ++callCnt;
          +            cout << msg % typid % callCnt;
          +          }
          +        int getCnt () {return callCnt; }
          +        
          +      };
          +      
          +      
          +    /**
          +     * Mock-1 to replace the Client Class...
          +     */
          +    struct Mock_1 : TargetObj
          +      {
          +        Mock_1() : TargetObj("Mock_1") {};
          +      };
          +      
          +    /**
          +     * Mock-2 to replace the Client Class...
          +     */
          +    struct Mock_2 : TargetObj
          +      {
          +        Mock_2() : TargetObj("Mock_2") {};
          +      };
          +      
          +      
          +    
          +    
          +    
          +    
          +    
          +    
          +    
          +    
          +    /*******************************************************************
          +     * @test inject a Mock object into the Singleton Factory, 
          +     *       to be returned and used in place of the original object.
          +     * Expected results: Mock(s) called, no memory leaks.
          +     * @see  cinelerra::Singleton
          +     * @see  cinelerra::singleton::Static
          +     */
          +    class SingletonTestMock_test : public Test
          +      {
          +        Singleton instance;
          +        
          +        virtual void run(Arg arg) 
          +          {
          +            string scenario = isnil(arg)? "default" : arg[1];
          +            
          +            if (scenario == "default")
          +              injectBoth();
          +            else 
          +            if (scenario == "noMock")
          +              noMock();
          +            else 
          +            if (scenario == "onlyMock")
          +              onlyMock();
          +            else 
          +            if (scenario == "firstMock")
          +              firstMock();
          +          }
          +
          +        
          +        /** @test complete use sequence: first access the Client Object, 
          +         *        then replace it by two different mocks, and finally
          +         *        restore the original Client Object 
          +         */
          +        void injectBoth ()
          +          {
          +            TargetObj* tartar = &instance();
          +            tartar->doIt();
          +            tartar->doIt();
          +            ASSERT (tartar->getCnt() == 2);
          +            
          +            instance.injectSubclass (new Mock_1);
          +            tartar = &instance();
          +            tartar->doIt();
          +            tartar->doIt();
          +            tartar->doIt();
          +            tartar->doIt();
          +            tartar->doIt();
          +            ASSERT (tartar->getCnt() == 5);
          +            
          +            instance.injectSubclass (new Mock_2);
          +            tartar = &instance();
          +            tartar->doIt();
          +            ASSERT (tartar->getCnt() == 1);
          +            
          +            instance.injectSubclass (0); // unshaddowing original instance
          +            tartar = &instance();
          +            ASSERT (tartar->getCnt() == 2);
          +            tartar->doIt();
          +            ASSERT (tartar->getCnt() == 3);
          +          }
          +
          +        
          +        /** @test just use Singleton Factory normally without any Mock.
          +         */
          +        void noMock ()
          +          {
          +            TargetObj& tartar = instance();
          +            tartar.doIt();
          +          }
          +
          +        
          +        /** @test inject the Mock prior to using the Singleton Factory,
          +         *        thus the original Client Object shouldn't be created. 
          +         */
          +        void onlyMock ()
          +          {
          +            instance.injectSubclass (new Mock_1);
          +            TargetObj& tartar = instance();
          +            tartar.doIt();
          +          }
          +
          +        
          +        /** @test inject the Mock prior to using the Singleton Factory,
          +         *        but then reset the Mock, so following calls should
          +         *        create the original Client Object. 
          +         */
          +        void firstMock ()
          +          {
          +            instance.injectSubclass (new Mock_1);
          +            TargetObj* tartar = &instance();
          +            tartar->doIt();
          +            tartar->doIt();
          +            ASSERT (tartar->getCnt() == 2);
          +            
          +            instance.injectSubclass (0);
          +            tartar = &instance();
          +            tartar->doIt();
          +            ASSERT (tartar->getCnt() == 1);
          +          }
          +      };
          +    
          +      
          +    
          +    /** Register this test class... */
          +    LAUNCHER (SingletonTestMock_test, "unit common");
          +    
          +    
          +    
          +  } // namespace test
          +
          +} // namespace cinelerra
          
          From 1d462845dd2fdf73d22a98f3293c1cdb27902b78 Mon Sep 17 00:00:00 2001
          From: Ichthyostega 
          Date: Mon, 24 Sep 2007 02:35:12 +0200
          Subject: [PATCH 09/14] oops... class TargetObject defined twice
          
          ---
           src/common/singletonpreconfigure.hpp          |  6 +-
           tests/50components.tests                      | 70 +++++++++++-------
           .../common/singletontestmocktest.cpp          | 74 +++++++++----------
           3 files changed, 83 insertions(+), 67 deletions(-)
          
          diff --git a/src/common/singletonpreconfigure.hpp b/src/common/singletonpreconfigure.hpp
          index f2171fd82..3ffa46c64 100644
          --- a/src/common/singletonpreconfigure.hpp
          +++ b/src/common/singletonpreconfigure.hpp
          @@ -66,7 +66,7 @@ namespace cinelerra
               
             namespace test
               {
          -    class TargetObj;
          +    class TestSingletonO;
               using cinelerra::Singleton;
               
             } // namespace test
          @@ -94,8 +94,8 @@ namespace cinelerra
             
               
             template<>
          -  class Singleton
          -    : public MockInjector
          +  class Singleton
          +    : public MockInjector
               { };
           
               
          diff --git a/tests/50components.tests b/tests/50components.tests
          index 9b134ed6c..7435f21b0 100644
          --- a/tests/50components.tests
          +++ b/tests/50components.tests
          @@ -103,6 +103,49 @@ out: dtor ~TargetObj(12) successfull
           END
           
           
          +TEST "SanitizedIdentifier_test" SanitizedIdentifier_test < 'Word'
          +out: 'a Sentence' --> 'a_Sentence'
          +out: 'trailing Withespace
          +out:        	' --> 'trailing_Withespace'
          +out: 'with    a  	 lot
          +out:   of Whitespace' --> 'with_a_lot_of_Whitespace'
          +out: 'with"much (punctuation)[]!' --> 'withmuch_(punctuation)'
          +out: 'ยง&ฮฉ%โ‚ฌ  leading garbarge' --> 'leading_garbarge'
          +out: 'mixed    ฮฉ   garbarge' --> 'mixed_garbarge'
          +out: 'Bรครครครคh!!' --> 'Bh'
          +out: 'ยง&ฮฉ%โ‚ฌ' --> ''
          +END
          +
          +
          +TEST "SingletonTestMock_test" SingletonTestMock_test < Testgroup=ALL
          @@ -139,30 +182,3 @@ out: --> remaining=SingleTestID spam --eggs
           END
           
           
          -TEST "SanitizedIdentifier_test" SanitizedIdentifier_test < 'Word'
          -out: 'a Sentence' --> 'a_Sentence'
          -out: 'trailing Withespace
          -out:        	' --> 'trailing_Withespace'
          -out: 'with    a  	 lot
          -out:   of Whitespace' --> 'with_a_lot_of_Whitespace'
          -out: 'with"much (punctuation)[]!' --> 'withmuch_(punctuation)'
          -out: 'ยง&ฮฉ%โ‚ฌ  leading garbarge' --> 'leading_garbarge'
          -out: 'mixed    ฮฉ   garbarge' --> 'mixed_garbarge'
          -out: 'Bรครครครคh!!' --> 'Bh'
          -out: 'ยง&ฮฉ%โ‚ฌ' --> ''
          -END
          -
          -
          -TEST "Singleton_test" Singleton_test 23 < instance;
          +        Singleton instance;
                   
                   virtual void run(Arg arg) 
                     {
          @@ -135,30 +135,30 @@ namespace cinelerra
                    */
                   void injectBoth ()
                     {
          -            TargetObj* tartar = &instance();
          -            tartar->doIt();
          -            tartar->doIt();
          -            ASSERT (tartar->getCnt() == 2);
          +            TestSingletonO* sing = &instance();
          +            sing->doIt();
          +            sing->doIt();
          +            ASSERT (sing->getCnt() == 2);
                       
                       instance.injectSubclass (new Mock_1);
          -            tartar = &instance();
          -            tartar->doIt();
          -            tartar->doIt();
          -            tartar->doIt();
          -            tartar->doIt();
          -            tartar->doIt();
          -            ASSERT (tartar->getCnt() == 5);
          +            sing = &instance();
          +            sing->doIt();
          +            sing->doIt();
          +            sing->doIt();
          +            sing->doIt();
          +            sing->doIt();
          +            ASSERT (sing->getCnt() == 5);
                       
                       instance.injectSubclass (new Mock_2);
          -            tartar = &instance();
          -            tartar->doIt();
          -            ASSERT (tartar->getCnt() == 1);
          +            sing = &instance();
          +            sing->doIt();
          +            ASSERT (sing->getCnt() == 1);
                       
                       instance.injectSubclass (0); // unshaddowing original instance
          -            tartar = &instance();
          -            ASSERT (tartar->getCnt() == 2);
          -            tartar->doIt();
          -            ASSERT (tartar->getCnt() == 3);
          +            sing = &instance();
          +            ASSERT (sing->getCnt() == 2);
          +            sing->doIt();
          +            ASSERT (sing->getCnt() == 3);
                     }
           
                   
          @@ -166,8 +166,8 @@ namespace cinelerra
                    */
                   void noMock ()
                     {
          -            TargetObj& tartar = instance();
          -            tartar.doIt();
          +            TestSingletonO& sing = instance();
          +            sing.doIt();
                     }
           
                   
          @@ -177,8 +177,8 @@ namespace cinelerra
                   void onlyMock ()
                     {
                       instance.injectSubclass (new Mock_1);
          -            TargetObj& tartar = instance();
          -            tartar.doIt();
          +            TestSingletonO& sing = instance();
          +            sing.doIt();
                     }
           
                   
          @@ -189,15 +189,15 @@ namespace cinelerra
                   void firstMock ()
                     {
                       instance.injectSubclass (new Mock_1);
          -            TargetObj* tartar = &instance();
          -            tartar->doIt();
          -            tartar->doIt();
          -            ASSERT (tartar->getCnt() == 2);
          +            TestSingletonO* sing = &instance();
          +            sing->doIt();
          +            sing->doIt();
          +            ASSERT (sing->getCnt() == 2);
                       
                       instance.injectSubclass (0);
          -            tartar = &instance();
          -            tartar->doIt();
          -            ASSERT (tartar->getCnt() == 1);
          +            sing = &instance();
          +            sing->doIt();
          +            ASSERT (sing->getCnt() == 1);
                     }
                 };
               
          
          From 38b47b7f93f91e9e8088e35912762b5230156807 Mon Sep 17 00:00:00 2001
          From: Ichthyostega 
          Date: Mon, 24 Sep 2007 16:20:41 +0200
          Subject: [PATCH 10/14] proposal for the MediaAccessFacade (interface to
           bakend), incl. Mock test
          
          ---
           src/backend/mediaaccessfacade.cpp             |  28 +++
           src/backend/mediaaccessfacade.hpp             |  66 +++++-
           tests/58proc-operate.tests                    |   6 +
           .../common/singletontestmocktest.cpp          | 215 +++++++++---------
           wiki/renderengine.html                        |   6 +-
           5 files changed, 209 insertions(+), 112 deletions(-)
          
          diff --git a/src/backend/mediaaccessfacade.cpp b/src/backend/mediaaccessfacade.cpp
          index 720c31864..9c86f82dc 100644
          --- a/src/backend/mediaaccessfacade.cpp
          +++ b/src/backend/mediaaccessfacade.cpp
          @@ -23,6 +23,11 @@
           
           #include "backend/mediaaccessfacade.hpp"
           
          +#include "common/util.hpp"
          +
          +using util::isnil;
          +using cinelerra::error::Invalid;
          +
           namespace backend_interface
             {
             
          @@ -30,6 +35,29 @@ namespace backend_interface
              *  (actually a cinelerra::test::MockInjector) */
             Singleton MediaAccessFacade::instance;
           
          +  
          +  typedef MediaAccessFacade::FileHandle FileHandle;
          +  typedef MediaAccessFacade::ChanHandle ChanHandle;
          +  
          +  FileHandle 
          +  MediaAccessFacade::queryFile (const char* name)  throw(Invalid)
          +  {
          +    if (isnil (name))
          +      throw Invalid ("empty filename passed to MediaAccessFacade.");
          +    
          +    UNIMPLEMENTED ("delegate to backend: query accessability of file");
          +    return 0;
          +  }
          +  
          +  
          +  ChanDesc 
          +  MediaAccessFacade::queryChannel (FileHandle fhandle, uint chanNo)  throw()
          +  {
          +    UNIMPLEMENTED ("delegate to backend: query channel information");
          +    ChanDesc nix;
          +    return nix;
          +  }
          +
           
           
           } // namespace backend_interface
          diff --git a/src/backend/mediaaccessfacade.hpp b/src/backend/mediaaccessfacade.hpp
          index 24baeb89f..ce994baa8 100644
          --- a/src/backend/mediaaccessfacade.hpp
          +++ b/src/backend/mediaaccessfacade.hpp
          @@ -26,27 +26,85 @@
           
           
           #include "common/singleton.hpp"
          +#include "common/error.hpp"
           
           
           
           namespace backend_interface
             {
          +  
          +  struct ChanDesc;
           
          -
          -  /**
          +  /******************************************************************
              * Interface to the backend layer:
              * provides functions for querying (opening) a media file,
              * detecting the channels or streams found within this file etc. 
              * Implemention delegating to the actual backend functions.
          +   * 
          +   * convention: data passed by pointer is owned by the originator;
          +   * it should be copied if needed byond the control flow 
          +   * of the invoked function. 
              */
          -  class MediaAccessFacade
          +  struct MediaAccessFacade
               {
          -    public:
          +      typedef void* FileHandle;
          +      typedef void* ChanHandle;
          +      
                 static Singleton instance;
                 
          +      /** request for testing the denoted files accessability 
          +       *  @param name path and filename of the media file.
          +       *  @throw invalid when passing empty filename
          +       *  @return opaque handle usable for querying channel
          +       *          information from this file, NULL if the
          +       *          file is not acessible.
          +       */
          +      virtual FileHandle queryFile (const char* name)  throw(cinelerra::error::Invalid);
                 
          +      /** request for information about the n-th channel 
          +       *  of the file refered by FileHandle.
          +       *  @return ChanDesc which may contain \c NULL values if
          +       *          the file doesn't contain this much channels.
          +       */  
          +      virtual ChanDesc queryChannel (FileHandle, uint chanNo)  throw(); 
          +      
          +      virtual ~MediaAccessFacade () {}
               };
             
          +
          +  /** 
          +   * Description of one channel found in a
          +   * media file; result of querying the channel.
          +   */
          +  struct ChanDesc
          +    {
          +      /** identifier which can be used to create a name
          +       *  for the media asset corresponding to this channel.
          +       *  May be NULL or empty and need not be unique.
          +       */
          +      const char* chanID;
          +      
          +      /** identifier characterizing the access method (or codec)
          +       *  needed to get at the media data. This should be rather
          +       *  a high level description of the media stream type, 
          +       *  e.g. "H264" -- anyhow, it will be used to find a 
          +       *  codec asset for this channel. 
          +       */
          +      const char* codecID;
          +      
          +      /** opaque handle, which will be used later to open this
          +       *  channel and retrieve some frames from it
          +       */
          +      MediaAccessFacade::ChanHandle handle;
          +      
          +      ChanDesc (const char* chanName=0, const char* codec=0, 
          +                MediaAccessFacade::ChanHandle h=0)
          +        : chanID(chanName),
          +          codecID(codec),
          +          handle(h)
          +        { }
          +    };
          +    
             
             
           } // namespace backend_interface
          diff --git a/tests/58proc-operate.tests b/tests/58proc-operate.tests
          index 3d845e119..07bb240e6 100644
          --- a/tests/58proc-operate.tests
          +++ b/tests/58proc-operate.tests
          @@ -2,5 +2,11 @@ TESTING "Proc Layer combined operations Test Suite" ./test-components --group=op
           
           
           
          +TEST "MediaAccessMock_test" MediaAccessMock_test < instance;
          -        
          -        virtual void run(Arg arg) 
          -          {
          -            string scenario = isnil(arg)? "default" : arg[1];
          -            
          -            if (scenario == "default")
          -              injectBoth();
          -            else 
          +
          +        virtual void run(Arg arg)
          +        {
          +          string scenario = isnil(arg)? "default" : arg[1];
          +
          +          if (scenario == "default")
          +            injectBoth();
          +          else
                       if (scenario == "noMock")
                         noMock();
          -            else 
          -            if (scenario == "onlyMock")
          -              onlyMock();
          -            else 
          -            if (scenario == "firstMock")
          -              firstMock();
          -          }
          +            else
          +              if (scenario == "onlyMock")
          +                onlyMock();
          +              else
          +                if (scenario == "firstMock")
          +                  firstMock();
          +        }
           
          -        
          -        /** @test complete use sequence: first access the Client Object, 
          +
          +        /** @test complete use sequence: first access the Client Object,
                    *        then replace it by two different mocks, and finally
                    *        restore the original Client Object 
                    */
                   void injectBoth ()
          -          {
          -            TestSingletonO* sing = &instance();
          -            sing->doIt();
          -            sing->doIt();
          -            ASSERT (sing->getCnt() == 2);
          -            
          -            instance.injectSubclass (new Mock_1);
          -            sing = &instance();
          -            sing->doIt();
          -            sing->doIt();
          -            sing->doIt();
          -            sing->doIt();
          -            sing->doIt();
          -            ASSERT (sing->getCnt() == 5);
          -            
          -            instance.injectSubclass (new Mock_2);
          -            sing = &instance();
          -            sing->doIt();
          -            ASSERT (sing->getCnt() == 1);
          -            
          -            instance.injectSubclass (0); // unshaddowing original instance
          -            sing = &instance();
          -            ASSERT (sing->getCnt() == 2);
          -            sing->doIt();
          -            ASSERT (sing->getCnt() == 3);
          -          }
          +        {
          +          TestSingletonO* sing = &instance();
          +          sing->doIt();
          +          sing->doIt();
          +          ASSERT (sing->getCnt() == 2);
          +
          +          instance.injectSubclass (new Mock_1);
          +          sing = &instance();
          +          sing->doIt();
          +          sing->doIt();
          +          sing->doIt();
          +          sing->doIt();
          +          sing->doIt();
          +          ASSERT (sing->getCnt() == 5);
          +
          +          instance.injectSubclass (new Mock_2);
          +          sing = &instance();
          +          sing->doIt();
          +          ASSERT (sing->getCnt() == 1);
          +
          +          instance.injectSubclass (0); // unshaddowing original instance
          +          sing = &instance();
          +          ASSERT (sing->getCnt() == 2);
          +          sing->doIt();
          +          ASSERT (sing->getCnt() == 3);
          +        }
          +
           
          -        
                   /** @test just use Singleton Factory normally without any Mock.
                    */
                   void noMock ()
          -          {
          -            TestSingletonO& sing = instance();
          -            sing.doIt();
          -          }
          +        {
          +          TestSingletonO& sing = instance();
          +          sing.doIt();
          +        }
          +
           
          -        
                   /** @test inject the Mock prior to using the Singleton Factory,
                    *        thus the original Client Object shouldn't be created. 
                    */
                   void onlyMock ()
          -          {
          -            instance.injectSubclass (new Mock_1);
          -            TestSingletonO& sing = instance();
          -            sing.doIt();
          -          }
          +        {
          +          instance.injectSubclass (new Mock_1);
          +          TestSingletonO& sing = instance();
          +          sing.doIt();
          +        }
          +
           
          -        
                   /** @test inject the Mock prior to using the Singleton Factory,
                    *        but then reset the Mock, so following calls should
                    *        create the original Client Object. 
                    */
                   void firstMock ()
          -          {
          -            instance.injectSubclass (new Mock_1);
          -            TestSingletonO* sing = &instance();
          -            sing->doIt();
          -            sing->doIt();
          -            ASSERT (sing->getCnt() == 2);
          -            
          -            instance.injectSubclass (0);
          -            sing = &instance();
          -            sing->doIt();
          -            ASSERT (sing->getCnt() == 1);
          -          }
          +        {
          +          instance.injectSubclass (new Mock_1);
          +          TestSingletonO* sing = &instance();
          +          sing->doIt();
          +          sing->doIt();
          +          ASSERT (sing->getCnt() == 2);
          +
          +          instance.injectSubclass (0);
          +          sing = &instance();
          +          sing->doIt();
          +          ASSERT (sing->getCnt() == 1);
          +        }
                 };
          -    
          -      
          -    
          +
          +
          +
               /** Register this test class... */
               LAUNCHER (SingletonTestMock_test, "unit common");
          -    
          -    
          -    
          +
          +
          +
             } // namespace test
           
           } // namespace cinelerra
          diff --git a/wiki/renderengine.html b/wiki/renderengine.html
          index f845eb46c..ea3fc49ce 100644
          --- a/wiki/renderengine.html
          +++ b/wiki/renderengine.html
          @@ -1305,10 +1305,10 @@ From experiences with other middle scale projects, I prefer having the test code
           [img[Example: Interfaces/Namespaces of the ~Session-Subsystems|uml/fig130053.png]]
           
          -
          +
          Opening and accessing media files on disk poses several problems, most of which belong to the domain of cinelerra's data backend. Here, we focus on the questions related to making media data available to the EDL and the render engine. Each media will be represented by an MediaAsset object, which indeed could be a compound object (in case of MultichannelMedia). Building this asset object thus includes getting informations from the real file on disk. For delegating this to the backend, we use the following query interface:
          -* {{{openFile(char* name)}}} requests accessing the file and yields some (opaque) handle when successful.
          -* {{{getChannel(int)}}} will then be issued in sequence with ascending index numbers, until it returns {{{NULL}}}.
          +* {{{queryFile(char* name)}}} requests accessing the file and yields some (opaque) handle when successful.
          +* {{{queryChannel(FHandle, int)}}} will then be issued in sequence with ascending index numbers, until it returns {{{NULL}}}.
           * the returned struct (pointer) will provide the following information:
           ** some identifier which can be used to create a name for the corresponding media (channel) asset
           ** some identifier characterizing the access method (codec) needed to get at the media data. This should be rather a high level description of the media stream type, e.g. "H264"
          
          From 3fdd16ff489efad767b5ab8e7a47be510287997c Mon Sep 17 00:00:00 2001
          From: Ichthyostega 
          Date: Tue, 25 Sep 2007 23:39:46 +0200
          Subject: [PATCH 11/14] draft adding clips and simple editing operations WIP:
           lots of tests, no implementation, doesn't compile...
          
          ---
           src/backend/mediaaccessfacade.hpp             |   1 +
           src/common/test/suite.cpp                     |   9 +-
           src/common/util.hpp                           |  21 ++-
           src/proc/asset/media.cpp                      |  30 +++-
           src/proc/asset/media.hpp                      |   6 +
           tests/58proc-operate.tests                    |   4 +
           tests/components/backend/mediaaccessmock.cpp  | 125 ++++++++++++++++
           tests/components/backend/mediaaccessmock.hpp  |  52 +++++++
           .../backend/mediaaccessmocktest.cpp           | 103 ++++++++++++++
           .../components/proc/asset/createassettest.cpp |   1 +
           tests/components/proc/asset/makecliptest.cpp  |  96 +++++++++++++
           .../proc/mobject/session/addcliptest.cpp      |  13 +-
           .../proc/mobject/session/deletecliptest.cpp   |  18 ++-
           .../mobject/session/rebuildfixturetest.cpp    |  28 +++-
           .../mobject/session/sessionmanagertest.cpp    | 134 ++++++++++++++++++
           .../mobject/session/sessionstructuretest.cpp  |  79 +++++++++++
           .../proc/mobject/session/testclip.cpp         |  63 ++++++++
           .../proc/mobject/session/testclip.hpp         |  39 +++--
           .../proc/mobject/session/testsession1.hpp     |  23 ++-
           uml/cinelerra3/5.session                      |  12 +-
           wiki/renderengine.html                        |  42 +++++-
           21 files changed, 867 insertions(+), 32 deletions(-)
           create mode 100644 tests/components/backend/mediaaccessmock.cpp
           create mode 100644 tests/components/backend/mediaaccessmock.hpp
           create mode 100644 tests/components/backend/mediaaccessmocktest.cpp
           create mode 100644 tests/components/proc/asset/makecliptest.cpp
           create mode 100644 tests/components/proc/mobject/session/sessionmanagertest.cpp
           create mode 100644 tests/components/proc/mobject/session/sessionstructuretest.cpp
           create mode 100644 tests/components/proc/mobject/session/testclip.cpp
          
          diff --git a/src/backend/mediaaccessfacade.hpp b/src/backend/mediaaccessfacade.hpp
          index ce994baa8..faac58b63 100644
          --- a/src/backend/mediaaccessfacade.hpp
          +++ b/src/backend/mediaaccessfacade.hpp
          @@ -65,6 +65,7 @@ namespace backend_interface
                  *  of the file refered by FileHandle.
                  *  @return ChanDesc which may contain \c NULL values if
                  *          the file doesn't contain this much channels.
          +       *  @todo   throw or return NULL-ChanDesc if Filehandle is invalid?
                  */  
                 virtual ChanDesc queryChannel (FileHandle, uint chanNo)  throw(); 
                 
          diff --git a/src/common/test/suite.cpp b/src/common/test/suite.cpp
          index b2cfcfea8..8239141f6 100644
          --- a/src/common/test/suite.cpp
          +++ b/src/common/test/suite.cpp
          @@ -203,7 +203,14 @@ namespace test
                   std::cout << "TEST \""<second);
                   VALID (test, i->first);
          -        (*test)()->run(noCmdline); // run it to insert test generated output
          +        try
          +          {
          +            (*test)()->run(noCmdline); // run it to insert test generated output
          +          }
          +        catch (...) 
          +          {
          +            std::cout << "PLANNED ============= " << cinelerra_error() << "\n";
          +          }
                   std::cout << "END\n";
                 }
             }
          diff --git a/src/common/util.hpp b/src/common/util.hpp
          index 82b29439e..0b8d03e56 100644
          --- a/src/common/util.hpp
          +++ b/src/common/util.hpp
          @@ -24,8 +24,10 @@
           #ifndef UTIL_HPP_
           #define UTIL_HPP_
           
          +#include 
           #include 
           #include 
          +#include 
           
           #include "nobugcfg.h"      ///////////////////TODO: just temporarily!!!!
           
          @@ -59,7 +61,6 @@ namespace util
               return !pContainer || pContainer->empty();
             }
             
          -  template <>
             inline bool
             isnil (const char* pCStr)
             {
          @@ -83,6 +84,24 @@ namespace util
               return map.find(key) != map.end();
             }
             
          +  /** shortcut for set value containment test */
          +  template 
          +  inline bool 
          +  contains (std::set& set, const T& val)
          +  {
          +    return set.end() != set.find (val);
          +  }
          +  
          +  /** shortcut for brute-force containment test
          +   *  in any sequencial container */
          +  template 
          +  inline bool 
          +  contains (SEQ& cont, typename SEQ::value_type& val)
          +  {
          +    SEQ::iterator end = cont.end();
          +    return end != std::find(cont.begin(),end, val);
          +  }
          +  
             
             /** shortcut for operating on all elements of a container.
              *  Isn't this already defined somewhere? It's so obvious..
          diff --git a/src/proc/asset/media.cpp b/src/proc/asset/media.cpp
          index 437b30998..6be2d4f3b 100644
          --- a/src/proc/asset/media.cpp
          +++ b/src/proc/asset/media.cpp
          @@ -25,6 +25,7 @@
           #include "proc/asset/media.hpp"
           #include "proc/asset/clip.hpp"
           #include "proc/asset/unknown.hpp"
          +#include "proc/mobject/session/clip.hpp"
           #include "common/util.hpp"
           #include "nobugcfg.h"
           
          @@ -58,7 +59,34 @@ namespace asset
               }
             } 
           
          -
          +  
          +  
          +  
          +  typedef shared_ptr PClip;
          +  typedef shared_ptr PProcPatt;
          +  
          +  
          +  PClip 
          +  Media::createClip ()
          +  {
          +    UNIMPLEMENTED ("create clip from media asset");
          +    PClip clip; //TODO:null
          +    
          +    ENSURE (clip);
          +    return clip;
          +  }
          +  
          +  PProcPatt
          +  Media::howtoProc ()
          +  {
          +    UNIMPLEMENTED ("calculate and return processing pattern for media asset");
          +    PProcPatt ppatt; //TODO:null
          +    
          +    ENSURE (ppatt);
          +    return ppatt;
          +  }
          +  
          +  
             
             MediaFactory Media::create;  ///< storage for the static MediaFactory instance
             
          diff --git a/src/proc/asset/media.hpp b/src/proc/asset/media.hpp
          index 66c21da04..d5593c514 100644
          --- a/src/proc/asset/media.hpp
          +++ b/src/proc/asset/media.hpp
          @@ -40,9 +40,12 @@
           
           
           
          +class mobject::session::Clip;
          +
           namespace asset
             {
             
          +  class Clip;
             class Media;
             class MediaFactory;
             
          @@ -73,6 +76,9 @@ namespace asset
                     return static_cast& > (Asset::getID()); 
                   }
                 
          +      shared_ptr createClip ();
          +      shared_ptr howtoProc ();
          +      
               protected:
                 Media (const Asset::Ident& idi, const string& file) : Asset(idi), filename_(file) {}
                 friend class MediaFactory;
          diff --git a/tests/58proc-operate.tests b/tests/58proc-operate.tests
          index 07bb240e6..e36aa3066 100644
          --- a/tests/58proc-operate.tests
          +++ b/tests/58proc-operate.tests
          @@ -5,6 +5,10 @@ TESTING "Proc Layer combined operations Test Suite" ./test-components --group=op
           TEST "MediaAccessMock_test" MediaAccessMock_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.
          + 
          +* *****************************************************/
          +
          +
          +/** @file mediaacessmock.cpp
          + ** Mock implementation of the Interface normally used to query media file
          + ** informations from the data backend. The Mock implementation instead holds
          + ** a map of fixed response which will be deliverd when querying some magic
          + ** filenames.
          + **
          + ** @see mediaaccessmocktest.cpp validating the Mock
          + ** @see MediaAccessFactory the real thing
          + **
          + */
          +
          +
          +#include "backend/mediaaccessmock.hpp"
          +
          +#include "common/util.hpp"
          +#include "nobugcfg.h"
          +
          +#include 
          +#include 
          +#include 
          +
          +using cinelerra::error::Invalid;
          +using util::for_each;
          +using util::isnil;
          +using std::cout;
          +using std::string;
          +using std::vector;
          +using std::map;
          +
          +
          +namespace backend_interface
          +  {
          +  namespace test
          +    {
          +  typedef MediaAccessFacade::FileHandle FileHandle;
          +  typedef MediaAccessFacade::ChanHandle ChanHandle;
          +
          +
          +    namespace // implementation deatils
          +      {
          +      typedef vector Response;
          +      const ChanDesc NULLResponse;
          +      
          +      struct TestCases : map
          +        {
          +          TestCases ()
          +            {
          +              // ------------------------------------------------------------------TESTCASES
          +              (*this)["test-1"].push_back (ChanDesc ("video","ID", genH()));
          +
          +              (*this)["test-2"].push_back (ChanDesc ("video","H264", genH()));
          +              (*this)["test-2"].push_back (ChanDesc ("audio-L","PCM", genH()));
          +              (*this)["test-2"].push_back (ChanDesc ("audio-R","PCM", genH()));
          +              // ------------------------------------------------------------------TESTCASES
          +            }
          +          
          +          bool known (string key)
          +            {
          +              const_iterator i = find (key);
          +              return (i != end());
          +            }
          +        private:
          +          int _i_;
          +          ChanHandle genH()
          +            {
          +              return reinterpret_cast (++_i_);
          +            }
          +        };
          +        
          +        // instantiate TestCasses table
          +        TestCases testCases;
          +        
          +    } // (end) implementation namespace
          +
          +
          +    FileHandle
          +    MediaAccessMock::queryFile (const char* name)  throw(Invalid)
          +    {
          +    if (isnil (name))
          +      throw Invalid ("empty filename passed to MediaAccessFacade.");
          +    
          +      if (!testCases.known(name))
          +        return 0;
          +      else
          +        return reinterpret_cast (&testCases[name]);
          +    }
          +
          +    ChanDesc
          +    MediaAccessMock::queryChannel (FileHandle h, uint chanNo)  throw()
          +    {
          +      const Response* res (reinterpret_cast (h));
          +      
          +      if (!res || res->size() <= chanNo) 
          +        return NULLResponse;
          +      else
          +        return (*res)[chanNo];
          +    }
          +
          +
          +  } // namespace test
          +
          +} // namespace backend_interface
          diff --git a/tests/components/backend/mediaaccessmock.hpp b/tests/components/backend/mediaaccessmock.hpp
          new file mode 100644
          index 000000000..9810773a5
          --- /dev/null
          +++ b/tests/components/backend/mediaaccessmock.hpp
          @@ -0,0 +1,52 @@
          +/*
          +  MEDIAACCESSMOCK.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 BACKEND_TEST_MEDIAACCESSMOCK_H
          +#define BACKEND_TEST_MEDIAACCESSMOCK_H
          +
          +
          +#include "backend/mediaaccessfacade.hpp"
          +
          +
          +
          +
          +namespace backend_interface
          +  {
          +  namespace test
          +    {
          +    /**
          +     * Mock implementation of the MediaAccessFacade. 
          +     * Provides preconfigured responses for some Test-Filenames.
          +     */
          +    class MediaAccessMock : public MediaAccessFacade
          +      {
          +      public:
          +        FileHandle queryFile (const char* name)  throw(cinelerra::error::Invalid);
          +        ChanDesc queryChannel (FileHandle, uint chanNo)  throw();
          +      };
          +
          +
          +  } // namespace test
          +
          +} // namespace backend_interface
          +#endif
          diff --git a/tests/components/backend/mediaaccessmocktest.cpp b/tests/components/backend/mediaaccessmocktest.cpp
          new file mode 100644
          index 000000000..5e7ef4cc4
          --- /dev/null
          +++ b/tests/components/backend/mediaaccessmocktest.cpp
          @@ -0,0 +1,103 @@
          +/*
          +  MediaAccessMock(Test)  -  checking our Test Mock replacing the MediaAccessFacade
          + 
          +  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 "backend/mediaaccessfacade.hpp"
          +#include "backend/mediaaccessmock.hpp"
          +
          +#include "common/test/run.hpp"
          +//#include "common/util.hpp"
          +#include "nobugcfg.h"
          +
          +//#include 
          +#include 
          +
          +//using boost::format;
          +//using util::isnil;
          +using std::string;
          +using std::cout;
          +
          +
          +namespace backend_interface
          +  {
          +  namespace test
          +    {
          +    
          +    
          +
          +    
          +    
          +    /********************************************************************************
          +     * @test inject a Mock object replacing the backend_interface::MediaAccessFacade.
          +     *       Verify if the Mock object behaves as expected when calling the Facade.
          +     */
          +    class MediaAccessMock_test : public Test
          +      {
          +        typedef MediaAccessFacade MAF;
          +        
          +        virtual void run(Arg arg) 
          +          {
          +            MAF::instance.injectSubclass (new MediaAccessMock);
          +            
          +            queryScenario ("test-1");
          +            queryScenario ("test-2");
          +            
          +            MAF::instance.injectSubclass (0);
          +          }
          +
          +        
          +        /** perform the test: query for an (alledged) file
          +         *  and retrieve the mock answer. 
          +         */
          +        void queryScenario (string filename)
          +          {
          +            MAF& maf (MAF::instance());
          +            MAF::FileHandle fhandle = maf.queryFile (filename.c_str());
          +            if (!fhandle)
          +              cout << "File \""<
          + 
          +  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/util.hpp"
          +
          +#include "proc/assetmanager.hpp"
          +#include "proc/asset/media.hpp"
          +#include "proc/mobject/session/clip.hpp"
          +
          +//#include "proc/asset/assetdiagnostics.hpp"
          +
          +using util::contains;
          +using util::isnil;
          +using std::string;
          +
          +
          +namespace asset
          +  {
          +  namespace test
          +    {
          +    
          +    
          +    
          +    
          +    /***********************************************************************
          +     * @test creating a Clip MObject and an associated Clip Asset from 
          +     *       a given asset::Media.
          +     * @see  asset::Media#createClip
          +     */
          +    class MakeClip_test : public Test
          +      {
          +        typedef shared_ptr PM;
          +        typedef shared_ptr PC;
          +            
          +        virtual void run (Arg arg) 
          +          {
          +            
          +            PM mm = asset::Media::create("test-1", VIDEO);
          +            PC cc = mm->createClip();
          +            PM cm = cc->getMedia();
          +            
          +            ASSERT (cm);
          +            ASSERT (0 < cc->length);
          +            ASSERT (cm->ident.category.hasKind (VIDEO));
          +            ASSERT (cm->getFilename() == mm->getFilename());
          +            ASSERT (cm->howtoProc() == mm->howtoProc());
          +            ASSERT (cm->ident.org == mm->ident.org);
          +            ASSERT (dependencyCheck (mm,cm));
          +
          +            TRACE (assetmem,   "leaving MakeClip_test::run()");
          +            TRACE (mobjectmem, "leaving MakeClip_test::run()");
          +          }
          +        
          +        bool dependencyCheck (PM media, PM clip)
          +        {
          +          TODO ("check asset dependencies, when this feature is implemented");
          +          return true; //TODO
          +          
          +          return (0 < clip->getParents().size())
          +              && (media == clip->getParents()[0])
          +              && (contains (media->getDependant(), clip));
          +              ;
          +        }
          +        
          +      };
          +    
          +    
          +    /** Register this test class... */
          +    LAUNCHER (MakeClip_test, "function asset");
          +    
          +    
          +    
          +  } // namespace test
          +
          +} // namespace asset
          diff --git a/tests/components/proc/mobject/session/addcliptest.cpp b/tests/components/proc/mobject/session/addcliptest.cpp
          index f6cc5def1..610e37445 100644
          --- a/tests/components/proc/mobject/session/addcliptest.cpp
          +++ b/tests/components/proc/mobject/session/addcliptest.cpp
          @@ -22,13 +22,15 @@
           
           
           #include "common/test/run.hpp"
          -//#include "common/factory.hpp"
          -//#include "common/util.hpp"
          +#include "proc/mobject/session/session.hpp"
          +#include "proc/mobject/session/testclip.hpp"
          +#include "common/util.hpp"
           
           //#include 
           #include 
           
           //using boost::format;
          +using util::contains;
           using std::string;
           using std::cout;
           
          @@ -52,6 +54,13 @@ namespace mobject
                   {
                     virtual void run(Arg arg) 
                       {
          +              Session& sess = Session::getCurrent();
          +              PMO clip = TestClip::create();
          +              PPla pla = Placement::create(FIXED, Time(1), clip);
          +              sess.add (pla);
          +              
          +              ASSERT (contains (sess.getEDL(), pla));
          +              // TODO: Clip-Asset and Placement magic??
                       } 
                   };
                 
          diff --git a/tests/components/proc/mobject/session/deletecliptest.cpp b/tests/components/proc/mobject/session/deletecliptest.cpp
          index 4a5c01567..167ef2577 100644
          --- a/tests/components/proc/mobject/session/deletecliptest.cpp
          +++ b/tests/components/proc/mobject/session/deletecliptest.cpp
          @@ -22,7 +22,9 @@
           
           
           #include "common/test/run.hpp"
          -//#include "common/factory.hpp"
          +#include "proc/assetmanager.hpp"
          +#include "proc/mobject/session/session.hpp"
          +#include "proc/mobject/session/testsession1.hpp"
           //#include "common/util.hpp"
           
           //#include 
          @@ -52,6 +54,20 @@ namespace mobject
                   {
                     virtual void run(Arg arg) 
                       {
          +              buildTestseesion1();
          +              Session& sess = Session::getCurrent();
          +              AssetManager& aMang = AssetManager::instance();
          +              
          +              PPla clipPlacement = sess.getEDL().find(SESSION1_CLIP); // global Var asigned in buildTestsession1()
          +              PAsset clipAsset = aMang.getAsset(clipPlacement->subject->getMedia());
          +              IDA clipAID = clipAsset->getID();
          +              ASSERT (clipPlacement);
          +              
          +              sess.remove (clipPlacement);
          +              
          +              ASSERT (!sess.getEDL().find(SESSION1_CLIP));                      // EDL forgot the Clip/Placement
          +              ASSERT (!aMang.known (clipAID));                                  // corresponding Clip Asset has disappeared 
          +              ASSERT (!aMang.getAsset(clipPlacement->subject->getMedia()));     // internal cross-links removed
                       } 
                   };
                 
          diff --git a/tests/components/proc/mobject/session/rebuildfixturetest.cpp b/tests/components/proc/mobject/session/rebuildfixturetest.cpp
          index 01ad76b34..7af4be5e7 100644
          --- a/tests/components/proc/mobject/session/rebuildfixturetest.cpp
          +++ b/tests/components/proc/mobject/session/rebuildfixturetest.cpp
          @@ -22,13 +22,18 @@
           
           
           #include "common/test/run.hpp"
          -//#include "common/factory.hpp"
          -//#include "common/util.hpp"
          +#include "proc/mobject/session/session.hpp"
          +#include "proc/mobject/session/testsession1.hpp"
          +#include "common/util.hpp"
           
           //#include 
          +#include 
           #include 
           
           //using boost::format;
          +using boost::bind;
          +using util::contains; 
          +using util::for_each; 
           using std::string;
           using std::cout;
           
          @@ -53,7 +58,26 @@ namespace mobject
                   {
                     virtual void run(Arg arg) 
                       {
          +              clearSession();
          +              buildTestseesion1();
          +              Session& sess = Session::getCurrent();
          +              ASSERT (sess.isValid());
          +              sess.rebuildFixture();
          +              TODO ("check the fixture has been touched. e.g. by hash.");
          +              TODO ("query all Placements of all Clips (via AssetManager). Verify explicit plac contained in Fixture.");
          +              
          +              for_each (sess.getFixture(), 
          +                        bind (&check_is_from_EDL, _1, sess.getEDL()));
          +              
          +              TODO ("can we check the other direction, from EDL to Fixture??");
                       } 
          +          
          +          static void 
          +          check_is_from_EDL (PPla explicitPlacement, EDL& edl)
          +            {
          +              PPla originalPlacement = explicitPlacement->subject->placement;
          +              ASSERT (contains(edl, originalPlacement));
          +            }
                   };
                 
                 
          diff --git a/tests/components/proc/mobject/session/sessionmanagertest.cpp b/tests/components/proc/mobject/session/sessionmanagertest.cpp
          new file mode 100644
          index 000000000..f6f8169e4
          --- /dev/null
          +++ b/tests/components/proc/mobject/session/sessionmanagertest.cpp
          @@ -0,0 +1,134 @@
          +/*
          +  SessionManager(Test)  -  accessing, loading and saving the Session/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 "proc/mobject/session/session.hpp"
          +#include "proc/mobject/session/testsession1.hpp"
          +//#include "common/util.hpp"
          +//#include 
          +#include 
          +
          +//using boost::format;
          +using std::string;
          +using std::cout;
          +
          +
          +namespace mobject
          +  {
          +  namespace session
          +    {
          +    namespace test
          +      {
          +      
          +      
          +      /*******************************************************************************
          +       * Check the session management operations provided by mobject::session::Seesion
          +       * This includes accessing the current Session (somewhat a singleton).
          +       * @todo load a Mock session
          +       * @todo create a session and save (serialize) it
          +       * @todo load a real test session
          +       */
          +      class SessionManager_test : public Test
          +        {
          +          virtual void run(Arg arg) 
          +            {
          +              getCurrentSession ();
          +              clearSession();
          +              loadMockSession();
          +              
          +              clearSession();
          +              buildTestseesion1();
          +              string serialized;
          +              saveSession (serialized);
          +              loadSession (serialized);
          +              ASSERT (checkTestsession1());
          +            } 
          +          
          +          /** @test accessing the current (global) session 
          +           */
          +          void getCurrentSession ()
          +            {
          +              Session& sess = Session::getCurrent();
          +              ASSERT (sess.isValid());
          +            }
          +          
          +          /** @test clear current session contents 
          +           *        without resetting global session config.
          +           * @todo  implement all session content, implement 
          +           *        mobject and asset deletion operations.
          +           */
          +          void clearSession ()
          +            {
          +              UNIMPLEMENTED ("clear objects in current session");
          +            }
          +          
          +          /** @test reset global session config and start with
          +           *        a pristine default session. 
          +           * @todo  define the "global session config", implement session default ctor
          +           */
          +          void resetSession ()
          +            {
          +              UNIMPLEMENTED ("construct a pristine session");
          +            }
          +          
          +          /** @test use a mock session serializer to load 
          +           *        a preconfigured test session. Verify
          +           *        objects are wired correctly.
          +           *  @todo implement rebuilding session, implement mock session serializer 
          +           */
          +          void loadMockSession ()
          +            {
          +              UNIMPLEMENTED ("rebuild session using a mock serializer");
          +            }
          +          
          +          /** @test load serialized session using the
          +           *        real session serializer implementation.
          +           * @param src string with serialized session data
          +           * @todo  implement real session serializer 
          +           */
          +          void loadSession (const string& src)
          +            {
          +              UNIMPLEMENTED ("loding real sesion");
          +            }
          +          
          +          /** @test serialize (save) the current session
          +           * @param dest string recieving the generated serialized stream
          +           * @todo  implement real session serializer
          +           */
          +          void saveSession (string& dest)
          +            {
          +              UNIMPLEMENTED ("serialize current session");
          +            }
          +        };
          +      
          +      
          +      /** Register this test class... */
          +      LAUNCHER (SessionManager_test, "function session");
          +      
          +      
          +      
          +    } // namespace test
          +  
          +  } // namespace session
          +
          +} // namespace mobject
          diff --git a/tests/components/proc/mobject/session/sessionstructuretest.cpp b/tests/components/proc/mobject/session/sessionstructuretest.cpp
          new file mode 100644
          index 000000000..18ee496e0
          --- /dev/null
          +++ b/tests/components/proc/mobject/session/sessionstructuretest.cpp
          @@ -0,0 +1,79 @@
          +/*
          +  SessionStructure(Test)  -  verifying basic Session/EDL structure
          + 
          +  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 "proc/mobject/session/session.hpp"
          +#include "proc/assetmanager.hpp"
          +//#include "common/util.hpp"
          +//#include 
          +#include 
          +
          +//using boost::format;
          +using std::string;
          +using std::cout;
          +
          +
          +namespace mobject
          +  {
          +  namespace session
          +    {
          +    namespace test
          +      {
          +      using proc_interface::AssetManager;
          +      using proc_interface::PAsset;
          +      
          +      
          +      /*******************************************************************************
          +       * @test access the current session and verify the correct
          +       *       structure of the most important components: The session
          +       *       contains an EDL, we can get at the Fixture, we have at least
          +       *       one Track and the corresponding Track asset is available.
          +       * @todo define further criteria to be checked 
          +       * @todo implement EDL, Fixture, Session#rebuildFixture, asset::Track
          +       */
          +      class SessionStructure_test : public Test
          +        {
          +          virtual void run(Arg arg) 
          +            {
          +              Session& sess = Session::getCurrent();
          +              ASSERT (0 <= sess.getEDL().size());       // TODO implement
          +              ASSERT (0 <= sess.getFixture().size());   // TODO implement
          +              ASSERT (0 <  sess.getTracks().size());    // TODO implement
          +              
          +              PAsset track = sess.getTracks()[0];
          +              AssetManager& aMang = AssetManager::instance();
          +              ASSERT (track == aMang.getAsset (track->getID()));
          +            } 
          +        };
          +      
          +      
          +      /** Register this test class... */
          +      LAUNCHER (SessionStructure_test, "unit session");
          +      
          +      
          +      
          +    } // namespace test
          +  
          +  } // namespace session
          +
          +} // namespace mobject
          diff --git a/tests/components/proc/mobject/session/testclip.cpp b/tests/components/proc/mobject/session/testclip.cpp
          new file mode 100644
          index 000000000..fb33be2ec
          --- /dev/null
          +++ b/tests/components/proc/mobject/session/testclip.cpp
          @@ -0,0 +1,63 @@
          +/*
          +  TestClip  -  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/mobject/session/testclip.hpp"
          +#include "proc/asset/media.hpp"
          +#include "proc/asset/clip.hpp"
          +
          +namespace mobject
          +  {
          +  namespace session
          +    {
          +    namespace test
          +      {
          +      typedef shared_ptr PC;
          +      typedef shared_ptr PM;
          +      typedef MediaAccessFacade MAF;
          +        
          +
          +      /** @todo find a way to link to an existing clip object.
          +       *        Idea: use the clip's copy operation, i.e. feed it
          +       *        to mobject::session::clip copy ctor
          +       */
          +      TestClip::TestClip ()
          +      {
          +        // install Mock-Interface to cinelerra backend
          +        MAF::instance.injectSubclass (new MediaAccessMock);
          +        
          +        PM media = asset::Media::create("test-2", VIDEO); // query magic filename
          +        PC clip = media->createClip();
          +        //TODO how to link to *this ???
          +        
          +        MAF::instance.injectSubclass (0); // remove Mock-Interface
          +      }
          +      
          +      /** storage for the TestClip-Factory */
          +      TestClip::Factory TestClip::create;
          +
          +
          +    } // namespace test
          +  
          +  } // namespace session
          +
          +} // namespace mobject
          diff --git a/tests/components/proc/mobject/session/testclip.hpp b/tests/components/proc/mobject/session/testclip.hpp
          index ec9ec8715..f9edae2a5 100644
          --- a/tests/components/proc/mobject/session/testclip.hpp
          +++ b/tests/components/proc/mobject/session/testclip.hpp
          @@ -41,19 +41,40 @@ namespace mobject
             {
             namespace session
               {
          -    /**
          -     * Sample or Test Clip for checking
          -     * various EDL, session and builder operations.
          -     * 
          -     */
          -    class TestClip
          +    namespace test
                 {
          -      public:
          -      };
          -    
          +        
          +      /**
          +       * Sample or Test Clip for checking
          +       * various EDL, session and builder operations.
          +       * Can be used as Mock object to record invoked operations.
          +       * 
          +       */
          +      class TestClip   ////TODO inherit from mobject::session::Clip
          +        {
          +          
          +          /** smart ptr factory allowed to invoke TestClip's ctor */
          +          struct Factory : cinelerra::Factory
          +            {
          +              typedef shared_ptr PType;
          +              PType operator() () { return PType (new TestClip, &destroy); }
          +            protected:
          +              static void destroy (TestClip* tc) { delete tc; }
          +            };
          +          
          +          
          +          TestClip ();  
          +          friend class Factory;  
          +          
          +        public:
          +          static Factory create;
          +        };
          +        
               
               
               
          +    } // namespace test
          +  
             } // namespace session
           
           } // namespace mobject
          diff --git a/tests/components/proc/mobject/session/testsession1.hpp b/tests/components/proc/mobject/session/testsession1.hpp
          index 5426047be..97a93719f 100644
          --- a/tests/components/proc/mobject/session/testsession1.hpp
          +++ b/tests/components/proc/mobject/session/testsession1.hpp
          @@ -1,5 +1,5 @@
           /*
          -  TESTSESSION1.hpp  -  complete session configuration use for various tests
          +  TESTSESSION1.hpp  -  complete session configuration used for various tests
            
             Copyright (C)         CinelerraCV
               2007,               Christian Thaeter 
          @@ -21,8 +21,8 @@
           */
           
           
          -#ifndef MOBJECT_SESSION_TESTCLIP_H
          -#define MOBJECT_SESSION_TESTCLIP_H
          +#ifndef MOBJECT_SESSION_TESTSESSION_H
          +#define MOBJECT_SESSION_TESTSESSION_H
           
           
           #include "proc/mobject/session/session.hpp"
          @@ -42,18 +42,29 @@ 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.
          +     * in the UML design. All changes are done to the (global)
          +     * current session.
                */
          -    PSession Testsession1 ()
          +    void buildTestseesion1 ()
                 {
                   UNIMPLEMENTED ("Test-Session 1");
                 };
               
          +      
          +    /**
          +     * Analyze the current (gloal) Session to verify the
          +     * configuration of "Test-Session 1"
          +     */
          +    bool checkTestseesion1 ()
          +      {
          +        UNIMPLEMENTED ("Test-Session 1");
          +        return false;
          +      };
          +    
               
               
               
          diff --git a/uml/cinelerra3/5.session b/uml/cinelerra3/5.session
          index b6381c7cf..e2727d655 100644
          --- a/uml/cinelerra3/5.session
          +++ b/uml/cinelerra3/5.session
          @@ -1,20 +1,20 @@
           window_sizes 1140 783 270 860 633 71
           diagrams
             classdiagram_ref 130309 // Asset Kinds
          -    860 633 100 4 180 0
          -  classdiagram_ref 128133 // Session structure
          -    688 506 100 4 120 0
          -  active  classdiagram_ref 130437 // Media-Asset Relations
          +    860 633 100 4 0 0
          +  active  classdiagram_ref 128133 // Session structure
          +    860 633 100 4 341 0
          +  classdiagram_ref 130437 // Media-Asset Relations
               860 633 100 4 0 0
             classdiagram_ref 128389 // Render Entities
               688 506 100 4 120 0
           end
           show_stereotypes
           selected 
          -  package_ref 129 // cinelerra3
          +package_ref 129 // cinelerra3
           open
             
          -  package_ref 128005 // design
          +package_ref 128005 // design
             classview_ref 128901 // Assets
             classview_ref 128005 // Session
             classview_ref 129029 // Interface
          diff --git a/wiki/renderengine.html b/wiki/renderengine.html
          index ea3fc49ce..9ddac1a24 100644
          --- a/wiki/renderengine.html
          +++ b/wiki/renderengine.html
          @@ -763,6 +763,34 @@ Cinelerra uses this term in a related manner but with a somewhat shifted focus (
           In this usage, the EDL is almost synonymous to the ''Session'', just the latter emphasizes more the state aspect, as it can be thought as a current state of the EDL contained in a file or data structure together with additional Option values and settings for the GUI. The Session is what you save and load, while the EDL rather denotes a structure of Objects placed in time.
           
          +
          +
          These are the tools provided to any client of the Proc layer for handling and manipulating the entities in the EDL. When defining such operations, //the goal should be to arrive at some uniformity in the way things are done.// Ideally, when writing client code, one should be able to guess how to achieve some desired result.
          +
          +!guiding principle
          +The approach taken to define any operation is based primarily on the ''~OO-way of doing things'': entities operate themselfs. You don't advise some manager, session or other &raquo;god class&laquo; to manipulate them. And, secondly, the scope of each operation will be as large as possible, but not larger. This often means performing quite some elementary operations &mdash; sometimes a convenience shortcut provided by the higher levels of the application may come in handy &mdash; and basically this gives rise to several different paths of doing the same thing, all of which need to be equivalent.
          +
          +!main tasks
          +* you ''create a clip'' either from a source media or from another clip (copy, maybe clone?). The new clip always reflects the full size (and other properties) of the source used for creating.
          +* you can request a clip to ''resize'', which always relates to its current dimensions.
          +* you can ''place or attach'' the clip to some point or other entity by creating a [[Placement]] from the clip.
          +* you can ''adjust'' a placement relative to some other placement, meta object (i.e. selection), label or media, and this may cause the placement to resize or even delete the clip as necessary
          +* you can perform ''adjustments'' on the whole EDL.
          +All these operations propagate to directly dependant objects and may schedule global reconfigurations.
          +
          +!state, locking, policies
          +While performing any manipulative task, the state of the object is considered inconsistent, but it is guaranteed to be consistent after any such operation, irrespective of the result. There is no automatic atomicity and, consequently each propagation is considered a separate operation.
          +
          +!!parallelism
          +At the level of fine grained operations on individual entities, there is ''no support for parallelism''. Individual entities don't lock themselves. Tasks perform locking and are to be scheduled. Thus, we need an isolation layer towards all inherently multithreaded parts of the system, like the GUI or the renderengine.
          +
          +This has some obvious and some subtle consequences. Of course, manipulating //tasks// will be queued and scheduled somewhere. But as we rely on object identity and reference semantics for the entities in the EDL, some value changes are visible to  operations going on in parallel threads (e.g. rendering) and each operation on the EDL entities //has to be aware of this.//
          +Consequently, sometimes there needs to be done a ''self-replacement by copy'' followed by manipulation of the new copy, while ongoing processes use the unaltered original object until they receive some sort of reset.
          +
          +!!undo
          +Basically, each elementary operation has to record the informations necessary to be undone. It does so by registering a Memento with some central UndoManager facility. This Memento object contains a functor pre-bound with the needed parameter values. (Besides, the UndoManager is free to implement a second level of security by taking independent state snapshots). 
          +{{red{to be defined in more detail later...}}}
          +
          +
          The &raquo;Timeline&laquo; is a sequence of ~MObjects -- here clips -- together with an ExplicitPlacement, locating each clip at a given time and track. (Note: I simplified the time format and wrote frame numbers to make it more clear)
           [img[Example1: Objects in the EDL/Fixture|uml/fig128773.png]]
          @@ -951,7 +979,7 @@ For this Cinelerra3 design, we could consider making GOP just another raw media
           &rarr;see in [[Wikipedia|http://en.wikipedia.org/wiki/Group_of_pictures]]
           
          -
          +
          This wiki page is the entry point to detail notes covering some technical decisions, details and problems encountered in the course of the implementation of the Cinelerra Renderengine, the Builder and the related parts.
           
           * [[Packages, Interfaces and Namespaces|InterfaceNamespaces]]
          @@ -959,6 +987,7 @@ For this Cinelerra3 design, we could consider making GOP just another raw media
           * [[Creating and registering Assets|AssetCreation]]
           * [[Creating new Objects|ObjectCreation]]
           * [[Multichannel Media|MultichannelMedia]]
          +* [[Editing Operations|EditingOperations]]
           
           
          @@ -2035,7 +2064,7 @@ DAMAGE. //Note, we have yet to specify how exactly the building and rendering will work together with the backend. There are several possibilities how to structure the Playlist//
          -
          +
          Open issues, Things to be worked out, Problems still to be solved... 
           
           !!Parameter Handling
          @@ -2062,7 +2091,14 @@ Users accustomed with modern GUI applications typically expect that //everything
           !!Compound and Multiplicity
           Simple relations can be hard wired. But, on the contrary, it would be as naive to define a Clip as having a Video track and two audio tracks, as it would be naive to overlook the problem of holding video and corresponding audio together. And, moreover, the default case has to be processed in a //straight forward// fashion, with as few tests and decisions as possible. So, basically each component participating in getting the core processing done has to mirror the structure pattern of the other parts, so that  processing can be done without testing and forking. But this leaves us with the problem where to put the initial knowledge about the structural pattern used for building up the compound structures and &mdash; especially &mdash; the problem how to treat different kinds of structural patterns, how to detect the pattern to be applied and how to treat multiple instances of the same structural pattern.
           
          -One example of this problem is the [[handling of multichannel media|MultichannelMedia]]. Following the above reasoning, we end with having a [["structural processing pattern"|ProcPatt]], typically one video stream with MPEG decoder and a pair of audio streams which need either to be routed to some "left" and "right" output ports, or have to be passed through a panning filter accordingly. Now the problem is: //create a new instance of this structure for each new media, or detect which media to subsume under a existing pattern instance.//
          +One example of this problem is the [[handling of multichannel media|MultichannelMedia]]. Following the above reasoning, we end with having a [["structural processing pattern"|ProcPatt]], typically one video stream with MPEG decoder and a pair of audio streams which need either to be routed to some "left" and "right" output ports, or have to be passed through a panning filter accordingly. Now the problem is: //create a new instance of this structure for each new media, or detect which media to subsume under a existing pattern instance.// + +!!Parallelism +We need to work out guidelines for dealing with operations going on simultaneously. Certainly, this will divide the application in several different regions. As always, the primary goal is to avoid multithread problems altogether. Typically, this can be achieved by making matters explicit: externalizing state, make the processing subsystems stateless, queue and schedule tasks, use isolation layers. +* the StateProxy is a key for the individual render processes state, which is managed in separate [[StateFrame]]s in the backend. The [[processing network|ProcNode]] is stateless. +* the [[Fixture]] provides an isolation layer between the renderengine and the Session/EDL +* all EditingOperations are not threadsafe intentionally, because they are [[scheduled|ProcLayerScheduler]] +
          All Assets of kind asset::Proc represent //processing algorithms// in the bookkeeping view. They enable loading, browsing and maybe even parametrizing all the Effects, Plugins and Codecs available for use within the Cinelerra Session.
          
          From 82e9519e731304a670a1854de430d7a3b24e1dc1 Mon Sep 17 00:00:00 2001
          From: Ichthyostega 
          Date: Thu, 27 Sep 2007 04:45:06 +0200
          Subject: [PATCH 12/14] WIP specify some details of the session interface and
           the relation of session and EDL
          
          ---
           doc/devel/uml/class128005.html                |   9 ++-
           doc/devel/uml/class138501.html                |   2 +-
           doc/devel/uml/class138629.html                |   2 +-
           doc/devel/uml/class138757.html                |   2 +-
           doc/devel/uml/class138885.html                |   2 +-
           doc/devel/uml/class139013.html                |   2 +-
           doc/devel/uml/class139141.html                |   2 +-
           doc/devel/uml/class139269.html                |   2 +-
           doc/devel/uml/class139525.html                |   2 +-
           doc/devel/uml/class139653.html                |  26 +++++++
           doc/devel/uml/classes.html                    |  11 +--
           doc/devel/uml/classes_list.html               |   3 +-
           doc/devel/uml/fig128133.png                   | Bin 56590 -> 58926 bytes
           doc/devel/uml/index.html                      |  49 +++++++++---
           doc/devel/uml/index_60.html                   |   2 +-
           doc/devel/uml/index_65.html                   |   4 +-
           doc/devel/uml/index_66.html                   |   3 +-
           doc/devel/uml/index_67.html                   |  25 +++---
           doc/devel/uml/index_69.html                   |   4 +-
           doc/devel/uml/index_70.html                   |   4 +-
           doc/devel/uml/index_71.html                   |   1 +
           doc/devel/uml/index_73.html                   |   2 +-
           doc/devel/uml/index_77.html                   |   3 +-
           doc/devel/uml/index_79.html                   |   2 +-
           doc/devel/uml/index_80.html                   |   3 +-
           doc/devel/uml/index_82.html                   |   2 +-
           doc/devel/uml/index_83.html                   |  11 ++-
           doc/devel/uml/index_84.html                   |   8 +-
           doc/devel/uml/index_86.html                   |  12 +--
           doc/devel/uml/public_operations.html          |   2 +
           src/common/time.hpp                           |  12 ++-
           src/common/util.hpp                           |   2 +-
           src/proc/asset/media.hpp                      |   3 +-
           src/proc/mobject/mobject.hpp                  |   5 ++
           src/proc/mobject/placement.hpp                |  38 ++++++++++
           src/proc/mobject/session/session.cpp          |  19 ++++-
           src/proc/mobject/session/session.hpp          |  29 ++++++-
           src/proc/mobject/session/sessionimpl.cpp      |  40 ++++++++++
           src/proc/mobject/session/sessionimpl.hpp      |  65 ++++++++++++++++
           .../proc/mobject/session/addcliptest.cpp      |   4 +-
           .../proc/mobject/session/testclip.hpp         |   3 +-
           uml/cinelerra3/128133.diagram                 |  20 +++--
           uml/cinelerra3/128261                         |  71 ++++++++++++++++--
           uml/cinelerra3/130181                         |  41 +++++++++-
           uml/cinelerra3/130437                         |   8 +-
           uml/cinelerra3/5.session                      |   6 +-
           uml/cinelerra3/cinelerra3.prj                 |   2 +-
           wiki/renderengine.html                        |  17 +++--
           48 files changed, 485 insertions(+), 102 deletions(-)
           create mode 100644 doc/devel/uml/class139653.html
           create mode 100644 src/proc/mobject/session/sessionimpl.cpp
           create mode 100644 src/proc/mobject/session/sessionimpl.hpp
          
          diff --git a/doc/devel/uml/class128005.html b/doc/devel/uml/class128005.html
          index 9ee1b55a0..fabe77cf9 100644
          --- a/doc/devel/uml/class128005.html
          +++ b/doc/devel/uml/class128005.html
          @@ -4,21 +4,22 @@
           
           
           
          -Class Session
          +Class SessionImpl
           
           
           
           
           
          -
          Class Session
          +
          Class SessionImpl

          -

          Declaration :

          • C++ : class Session

          Artifact : session, Component(s) : Session

          +

          Declaration :

          • C++ : class SessionImpl : public Session

          Implementation class for the Session interface

          Artifact : sessionimpl, Component(s) : Session

          -
          Relation edls (<directional aggregation>)

          Declaration :

          • Uml : # edls : EDL, multiplicity : 1..*
          • C++ : protected: EDL * edls
          +
          Relation edls (<directional aggregation by value>)

          Declaration :

          • Uml : # edls : EDL, multiplicity : 1..*
          • C++ : protected: <EDL> edls
          Relation fixture (<unidirectional association>)

          Declaration :

          • Uml : # fixture : Fixture, multiplicity : 1
          • C++ : protected: Fixture * fixture
          +

          All public operations : currEDL , getFixture

          diff --git a/doc/devel/uml/class138501.html b/doc/devel/uml/class138501.html index 03c3ffaa4..fd0b56e89 100644 --- a/doc/devel/uml/class138501.html +++ b/doc/devel/uml/class138501.html @@ -16,7 +16,7 @@ -

          Declaration :

          • C++ : class CompoundMedia : public Media

          compound of several elementary media tracks,
          e.g. the individual media streams found in one media file

          +

          Declaration :

          • C++ : class CompoundMedia : public Media

          compound of several elementary media tracks,
          e.g. the individual media streams found in one media file

          Artifact : compoundmedia

          Relation tracks (<directional aggregation>)

          Declaration :

          • Uml : # tracks : Media, multiplicity : 1..*
          • C++ : protected: vector<Media *> tracks

          elementary media assets comprising this compound

          All public operations : createClip , enable , getDependant , getParents , howtoProc , isActive

          diff --git a/doc/devel/uml/class138629.html b/doc/devel/uml/class138629.html index e8d6b1276..9bc8209f7 100644 --- a/doc/devel/uml/class138629.html +++ b/doc/devel/uml/class138629.html @@ -16,7 +16,7 @@ -

          Declaration :

          • C++ : class CompoundClip : public Clip

          Diagram : Session structure

          +

          Declaration :

          • C++ : class CompoundClip : public Clip

          Clip MObject which is actually a compound of several elementary clips,
          e.g. the several streams found within multichannels media.

          Artifact : compoundclip, Diagram : Session structure

          Relation components (<directional aggregation>)

          Declaration :

          • Uml : # components : Clip, multiplicity : 1..*
          • C++ : protected: Clip* components

          All public operations : apply

          diff --git a/doc/devel/uml/class138757.html b/doc/devel/uml/class138757.html index 532214425..d4594382d 100644 --- a/doc/devel/uml/class138757.html +++ b/doc/devel/uml/class138757.html @@ -16,7 +16,7 @@ -

          Declaration :

          • C++ : class ProcPatt : public Struct
          +

          Declaration :

          • C++ : class ProcPatt : public Struct

          special type of structural Asset representing information how to build some part of the render engine's processing nodes network.

          Artifact : procpatt

          Relation instructions (<directional aggregation by value>)

          Declaration :

          All public operations : enable , getDependant , getParents , isActive

          diff --git a/doc/devel/uml/class138885.html b/doc/devel/uml/class138885.html index 598ee1c5b..987c50371 100644 --- a/doc/devel/uml/class138885.html +++ b/doc/devel/uml/class138885.html @@ -16,7 +16,7 @@ -

          Declaration :

          • C++ : class SimpleClip : public Clip
          +

          Declaration :

          • C++ : class SimpleClip : public Clip

          Elementary clip consisting of only one media stream

          Artifact : simpleclip

          All public operations : apply

          diff --git a/doc/devel/uml/class139013.html b/doc/devel/uml/class139013.html index 911e23339..9c8b83182 100644 --- a/doc/devel/uml/class139013.html +++ b/doc/devel/uml/class139013.html @@ -17,5 +17,5 @@

          Declaration :

          • C++ : class BuildInstruct

          Directly inherited by : DoAttach DoRecurse

          - +

          (Interface) building instructions to be executed by the Builder on the render node network under construction.

          Artifact : buildinstruct

          diff --git a/doc/devel/uml/class139141.html b/doc/devel/uml/class139141.html index 1a1d63db8..e1b79bcb6 100644 --- a/doc/devel/uml/class139141.html +++ b/doc/devel/uml/class139141.html @@ -16,7 +16,7 @@ -

          Declaration :

          +

          Declaration :

          Artifact : buildinstruct

          Relation nodes (<directional aggregation>)

          Declaration :

          • Uml : + nodes : Proc, multiplicity : 1..*
          • C++ : public: const Proc* nodes
          Attribut point
          diff --git a/doc/devel/uml/class139269.html b/doc/devel/uml/class139269.html index 3e1dd987b..4ec293ab8 100644 --- a/doc/devel/uml/class139269.html +++ b/doc/devel/uml/class139269.html @@ -16,7 +16,7 @@ -

          Declaration :

          +

          Declaration :

          Artifact : buildinstruct

          Relation subPattern (<unidirectional association>)

          Declaration :

          • Uml : # subPattern : ProcPatt, multiplicity : 1
          • C++ : protected: const ProcPatt* subPattern
          diff --git a/doc/devel/uml/class139525.html b/doc/devel/uml/class139525.html index e5acd9bec..603d8d16b 100644 --- a/doc/devel/uml/class139525.html +++ b/doc/devel/uml/class139525.html @@ -16,5 +16,5 @@ -

          Declaration :

          • C++ : class MediaAccessFacade

          provides functions for querying (opening) a media file, detecting the channels or streams found within this file, etc. Delegating to the actual backend functions

          Component(s) : Media Access

          +

          Declaration :

          • C++ : class MediaAccessFacade

          provides functions for querying (opening) a media file, detecting the channels or streams found within this file, etc. Delegating to the actual backend functions

          Artifact : mediaaccessfacade, Component(s) : Media Access

          diff --git a/doc/devel/uml/class139653.html b/doc/devel/uml/class139653.html new file mode 100644 index 000000000..d23ad4ec8 --- /dev/null +++ b/doc/devel/uml/class139653.html @@ -0,0 +1,26 @@ + + + + + + +Class Session + + + + + +
          Class Session
          +

          + + + + +

          Declaration :

          • C++ : class Session

          Directly inherited by : SessionImpl

          +

          Primary Interface for all editing tasks.
          The session contains defaults, all the assets being edited, and a set of EDL with the individual MObjects to be manipulated and rendered.

          Artifact : session

          + +
          Operation currEDL

          Declaration :

          • Uml : + currEDL() : EDL
          • C++ : public: EDL currEDL ()

          The EDL currently in focus. In most cases, Session and EDL are almost the same, just EDL emphasizes the collection aspect. But generally (for larger editing projects) one Session can contain several EDLs, which may even be nested. At any given time, only one of these EDLs has focus and recieves the editing commands.

          +
          Operation getFixture

          Declaration :

          • Uml : + getFixture() : Fixture&
          • C++ : public: Fixture& getFixture ()

          While the session can be comprised of several EDLs,
          there is only one Fixture, which represents the actual
          configuration of all Objects to be rendered

          +

          All public operations : currEDL , getFixture

          + + diff --git a/doc/devel/uml/classes.html b/doc/devel/uml/classes.html index a34ff3876..f3008a1a0 100644 --- a/doc/devel/uml/classes.html +++ b/doc/devel/uml/classes.html @@ -27,13 +27,13 @@ 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 -BuildInstruct +BuildInstruct(Interface) building instructions to be executed by the Builder on the render node network under construction. Categorytree like classification of Assets Clipbookkeeping (asset) view of a media clip. Clip Codecdescription of some media data decoder or encoder facility CodecAdapter -CompoundClip +CompoundClipClip MObject which is actually a compound of several elementary clips,
          e.g. the several streams found within multichannels media. CompoundMediacompound of several elementary media tracks,
          e.g. the individual media streams found in one media file ConditionI provided a reworked Condition class in my cinelerra2 repository Config @@ -96,7 +96,7 @@ Prockey abstraction: data processing asset Processor ProcNodeinterfaceKey abstraction of the Render Engine: A Data processing Node -ProcPatt +ProcPattspecial type of structural Asset representing information how to build some part of the render engine's processing nodes network. ProjectorSpecial video processing node used to scale and translate image data. RelativePlacement RelTypeenumthe possible kinds of RelativePlacements @@ -105,8 +105,9 @@ Scheduler Segment SegmentationToolTool implementation for deriving a partitioning of the current timeline such, that each segement has a constant configuration. "Constant" means here, that any remaining changes over time can be represented by automation solely, without the need to change the node connections. -Session -SimpleClip +SessionPrimary Interface for all editing tasks.
          The session contains defaults, all the assets being edited, and a set of EDL with the individual MObjects to be manipulated and rendered. +SessionImplImplementation class for the Session interface +SimpleClipElementary clip consisting of only one media stream SmartPointerauxiliary SourceSource Node: represents a media source to pull data from. State diff --git a/doc/devel/uml/classes_list.html b/doc/devel/uml/classes_list.html index b394be64d..a97c2af5b 100644 --- a/doc/devel/uml/classes_list.html +++ b/doc/devel/uml/classes_list.html @@ -106,7 +106,8 @@ Scheduler
          Segment
          SegmentationTool
          -Session
          +Session
          +SessionImpl
          SimpleClip
          SmartPointer
          Source
          diff --git a/doc/devel/uml/fig128133.png b/doc/devel/uml/fig128133.png index 1b1f3347e6dbee4efc05749f87e7946ffb41a85b..68a34623f63b00be7bc271533b1b0141171a545e 100644 GIT binary patch literal 58926 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 z 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 G{Qm&({Nb_y literal 56590 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 diff --git a/doc/devel/uml/index.html b/doc/devel/uml/index.html index 6e665f205..fdd9b2654 100644 --- a/doc/devel/uml/index.html +++ b/doc/devel/uml/index.html @@ -33,10 +33,10 @@ Documentation
          Component Builder

          provided classes : StateProxy

          -

          required classes : Fixture, Session

          +

          required classes : Fixture, SessionImpl

          Component Session
          -

          provided classes : EDL, Fixture, MObject, ParamProvider, Session

          +

          provided classes : EDL, Fixture, MObject, ParamProvider, SessionImpl

          Component EDL
          @@ -112,7 +112,7 @@ Documentation
          Artifact Cinelerra3

          Depends on common

          Depends on gui

          Depends on proc

          Depends on backend

          the main executable to be built

          -

          executable associated with : 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, link, parameter, renderengine, allocation, vframe

          +

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

          Artifact main

          Artifact source

          @@ -150,11 +150,17 @@ Documentation

          1.3.3 Package backend

            -
          • C++ namespace : data
          • +
          • C++ namespace : backend_interface

          sourcecode package

          Data backend classes here...

          1.3.3.1 Deployment View gen

          +
          + +
          Artifact mediaaccessfacade
          +

          functions for querying media file and channels.

          +

          Artifact source associated with : MediaAccessFacade

          +

          1.3.4 Package proc

          @@ -225,6 +231,10 @@ Documentation
          Artifact clip

          bookkeeping (asset) view of a media clip.

          Artifact source associated with : Clip

          + +
          Artifact compoundmedia
          +

          a special clip as a compound of several elementary media tracks,
          e.g. the individual media streams found in one media file

          +

          Artifact source associated with : CompoundMedia

          Artifact preview

          alternative version of the media data, probably with lower resolution

          @@ -249,6 +259,14 @@ Documentation
          Artifact track

          structural asset holding the configuration of a track in the EDL

          Artifact source associated with : Track

          + +
          Artifact procpatt
          +

          template for building some render processing network

          +

          Artifact source associated with : ProcPatt

          + +
          Artifact buildinstruct
          +

          Instructions for building some configuration of render nodes.

          +

          Artifact source associated with : BuildInstruct, DoRecurse, DoAttach

          Artifact db

          registry holding known Asset instances.

          @@ -265,6 +283,10 @@ Documentation

          1.3.4.3.1 Deployment View gen

          defines source files to be generated by BOUML

          + +
          Artifact session
          +

          Interface: the session edited by the user

          +

          Artifact source associated with : Session

          Artifact mobject

          Key Abstraction: A Media Object in the Session

          @@ -309,9 +331,9 @@ Documentation

          defines source files to be generated by BOUML

          -
          Artifact session
          -

          holds the complete session to be edited by the user

          -

          Artifact source associated with : Session

          +
          Artifact sessionimpl
          +

          holds the complete session data to be edited by the user

          +

          Artifact source associated with : SessionImpl

          Artifact edl

          the (high level) Edit Decision List within the current Session

          @@ -336,6 +358,14 @@ Documentation
          Artifact clip

          a Media Clip

          Artifact source associated with : Clip

          + +
          Artifact simpleclip
          +

          Elementary clip (single media stream only)

          +

          Artifact source associated with : SimpleClip

          + +
          Artifact compoundclip
          +

          compound of several clips (multichannel)

          +

          Artifact source associated with : CompoundClip

          Artifact effect

          EDL representation of a pluggable and automatable effect.

          @@ -568,7 +598,6 @@ Documentation
          Class ProcPatt
          Class Dataset
          Class DB
          -
          Class DoAttach
          Class DoRecurse
          @@ -583,7 +612,8 @@ Documentation

          Session structure



          -
          Class Session
          +
          Class Session
          +
          Class EDL
          Class Fixture
          Class Segment
          @@ -593,6 +623,7 @@ Documentation
          Class Clip
          +
          Class Effect
          Class Meta
          diff --git a/doc/devel/uml/index_60.html b/doc/devel/uml/index_60.html index 4909e634c..0a78be5d0 100644 --- a/doc/devel/uml/index_60.html +++ b/doc/devel/uml/index_60.html @@ -28,8 +28,8 @@ <flow>transition <flow>transition <flow>transition -<flow>transition <flow>transition +<flow>transition <flow>transition <flow>transition <flow>transition diff --git a/doc/devel/uml/index_65.html b/doc/devel/uml/index_65.html index 7fc8a769c..28aa29de6 100644 --- a/doc/devel/uml/index_65.html +++ b/doc/devel/uml/index_65.html @@ -49,11 +49,11 @@ 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 autoartifactMedia Object holding automation data AutoclassAutomation data for some parameter (i.e. a time varying function) diff --git a/doc/devel/uml/index_66.html b/doc/devel/uml/index_66.html index 2f6812bb3..5ed3d76c4 100644 --- a/doc/devel/uml/index_66.html +++ b/doc/devel/uml/index_66.html @@ -41,7 +41,8 @@ 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 builderfacadeartifactFacade and service access point for the Builder Subsystem building the Engineactivity -BuildInstructclass +BuildInstructclass(Interface) building instructions to be executed by the Builder on the render node network under construction. +buildinstructartifactInstructions for building some configuration of render nodes. buildProcessoroperation diff --git a/doc/devel/uml/index_67.html b/doc/devel/uml/index_67.html index d9c7fd522..b81c28c53 100644 --- a/doc/devel/uml/index_67.html +++ b/doc/devel/uml/index_67.html @@ -27,12 +27,11 @@ 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 @@ -40,14 +39,15 @@ 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. -clipartifactbookkeeping (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 @@ -60,8 +60,10 @@ CommonLibpackage complete Render Engineactivity object componentsrelation -CompoundClipclass +compoundclipartifactcompound of several clips (multichannel) +CompoundClipclassClip MObject which is actually a compound of several elementary clips,
          e.g. the several streams found within multichannels media. CompoundMediaclasscompound of several elementary media tracks,
          e.g. the individual media streams found in one media file +compoundmediaartifacta special clip as a compound of several elementary media tracks,
          e.g. the individual media streams found in one media file ConditionclassI provided a reworked Condition class in my cinelerra2 repository Configclass configureoperation @@ -73,8 +75,8 @@ connectopaque activity action Constraintclass Controllercomponent -controllerpackagesourcecode package

          The Processing and Render Controller,
          located within the MObject Subsystem Controllerpackage +controllerpackagesourcecode package

          The Processing and Render Controller,
          located within the MObject Subsystem Controller Entitiesclass diagram Controller Workingsclass view ControllerFacadeclassProvides unified access to the Proc-Subsystem Controller. Especially, this Facade class provides the functions to get a render engine to carry out actual renderings. @@ -82,6 +84,7 @@ ControllerFacadecomponent create ProcNodeopaque activity action createClipoperationcreate a (possibly compound) Clip refering to this media, ready to be added to the EDL. +currEDLoperationThe EDL currently in focus. In most cases, Session and EDL are almost the same, just EDL emphasizes the collection aspect. But generally (for larger editing projects) one Session can contain several EDLs, which may even be nested. At any given time, only one of these EDLs has focus and recieves the editing commands. currFramerelation diff --git a/doc/devel/uml/index_69.html b/doc/devel/uml/index_69.html index 0c7bddcba..20380e20a 100644 --- a/doc/devel/uml/index_69.html +++ b/doc/devel/uml/index_69.html @@ -18,14 +18,14 @@ - + - + diff --git a/doc/devel/uml/index_70.html b/doc/devel/uml/index_70.html index 14b9fb500..242d89493 100644 --- a/doc/devel/uml/index_70.html +++ b/doc/devel/uml/index_70.html @@ -32,9 +32,9 @@ - - + + diff --git a/doc/devel/uml/index_71.html b/doc/devel/uml/index_71.html index 84b5e66ce..23b81058d 100644 --- a/doc/devel/uml/index_71.html +++ b/doc/devel/uml/index_71.html @@ -35,6 +35,7 @@ + diff --git a/doc/devel/uml/index_73.html b/doc/devel/uml/index_73.html index 6bb5ea25f..496421c53 100644 --- a/doc/devel/uml/index_73.html +++ b/doc/devel/uml/index_73.html @@ -20,9 +20,9 @@ - + diff --git a/doc/devel/uml/index_77.html b/doc/devel/uml/index_77.html index dac7b6a5a..997d703b9 100644 --- a/doc/devel/uml/index_77.html +++ b/doc/devel/uml/index_77.html @@ -26,13 +26,14 @@ + - + diff --git a/doc/devel/uml/index_79.html b/doc/devel/uml/index_79.html index 4902abfdc..b34c12000 100644 --- a/doc/devel/uml/index_79.html +++ b/doc/devel/uml/index_79.html @@ -19,8 +19,8 @@ - + diff --git a/doc/devel/uml/index_80.html b/doc/devel/uml/index_80.html index 2380ad9ce..d7038cb97 100644 --- a/doc/devel/uml/index_80.html +++ b/doc/devel/uml/index_80.html @@ -52,7 +52,8 @@ - + + diff --git a/doc/devel/uml/index_82.html b/doc/devel/uml/index_82.html index 5eb845aba..db5b9dc39 100644 --- a/doc/devel/uml/index_82.html +++ b/doc/devel/uml/index_82.html @@ -22,8 +22,8 @@ - + diff --git a/doc/devel/uml/index_83.html b/doc/devel/uml/index_83.html index 15423df50..c3a049c32 100644 --- a/doc/devel/uml/index_83.html +++ b/doc/devel/uml/index_83.html @@ -29,19 +29,22 @@ - + - + + + - + + - + diff --git a/doc/devel/uml/index_84.html b/doc/devel/uml/index_84.html index b86c2c7b0..686d34aef 100644 --- a/doc/devel/uml/index_84.html +++ b/doc/devel/uml/index_84.html @@ -32,18 +32,18 @@ - + - - - + + + diff --git a/doc/devel/uml/index_86.html b/doc/devel/uml/index_86.html index 1a10d10b0..ce992fef4 100644 --- a/doc/devel/uml/index_86.html +++ b/doc/devel/uml/index_86.html @@ -20,23 +20,23 @@ - + + - - + - + + - - +
          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.
          effectartifactEffect or media processing component
          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
          fixedplacementartifact
          Fixtureactivity object
          fixtureartifactthe (low level) representation of the EDL with concrete placement data
          fixturerelation
          Fixtureclass
          Fixturecomponent
          Fixtureclass
          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
          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.
          getFixtureoperationWhile the session can be comprised of several EDLs,
          there is only one Fixture, which represents the actual
          configuration of all Objects to be rendered
          getFrameoperationmode = READ, WRITE, ...
          getIDoperation
          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
          idattributeAsset primary key.
          In Memory Databaseclass diagram
          inFixtureactivity action pin
          inputclass instance
          inputclass instance
          inputclass instance
          inputclass instance
          instanceoperation
          instructionsrelation
          Interfaceclass view
          mediaartifactkey abstraction: media-like assets
          Media Accesscomponent
          Media-Asset Relationsclass diagram
          mediaaccessfacadeartifactfunctions for querying media file and channels.
          MediaAccessFacadeclassprovides functions for querying (opening) a media file, detecting the channels or streams found within this file, etc. Delegating to the actual backend functions
          MediaFactorycomponent
          MediaFactoryclassspecialized Asset Factory for configuring (new) media asset instances based on existing media files on disk; can create placeholder assets as well
          merge activity nodemerge activity node
          Metaclasskey abstraction: metadata and organisational asset
          metaartifactkey 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
          NameKindDescription
          offsetattributeOffset the actual position by this (time) value relative to the anchor point. TODO: Representation?
          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
          ouputclass instance
          OutPortclassstructural asset corresponding to some port generating media output
          outportartifactstructural asset corresponding to some port generating media output
          ProcNodecomponent
          ProcNodeclassKey abstraction of the Render Engine: A Data processing Node
          procnodeartifactKey abstraction of the Render Engine: a Processing Node
          ProcPattclass
          ProcPattclassspecial type of structural Asset representing information how to build some part of the render engine's processing nodes network.
          procpattartifacttemplate for building some render processing network
          ProjectorclassSpecial video processing node used to scale and translate image data.
          projectorartifactvideo ProcNode for scaling and translating image data
          providerrelation
          registryrelation@internal Table or DB holding all registered asset instances.
          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
          segmentsrelationthe partitioning of the Timeline to be created by this tool.
          Service Componentsclass view
          Sessioncomponent
          sessionartifactholds the complete session to be edited by the user
          sessionartifactInterface: the session edited by the user
          sessionpackagesourcecode package

          Everything concerning the EDL and Session, within the MObject Subsystem
          Sessionclass view
          Sessionclass
          SessionclassPrimary Interface for all editing tasks.
          The session contains defaults, all the assets being edited, and a set of EDL with the individual MObjects to be manipulated and rendered.
          Session structureclass diagram
          sessionimplartifactholds the complete session data to be edited by the user
          SessionImplclassImplementation class for the Session interface
          setup Build Paramsopaque activity action
          setup StateProxyopaque activity action
          shortDescattributeuser visible Name-ID. To be localized.
          SimpleClipclass
          simpleclipartifactElementary clip (single media stream only)
          SimpleClipclassElementary clip consisting of only one media stream
          SmartPointerclass
          SmartPointersclass view
          sourcerelationthe media source this clip referes to
          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
          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
          trackartifactstructural asset holding the configuration of a track in the EDL
          Trackclass
          tracksrelationelementary media assets comprising this compound
          tracksrelation
          tracksrelation
          Trafoclass
          trafoartifacttransforming processing Node
          treatoperation
          treatoperation
          treatoperation
          treatoperation
          treatoperation
          treatoperation
          treatoperation
          treatoperation
          treatoperation
          treatoperation
          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
          vid1class instance
          vid_Aclass instance
          vid_Aclass instance
          vid_aclass instance
          vid_Aclass instance
          vid_aclass instance
          vid_Aclass instance
          videoclass instance
          videoclass instance
          videoclass instance
          videoclass instance
          videoclass instance
          video1class instance
          video1class 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/public_operations.html b/doc/devel/uml/public_operations.html index 728368c81..ed11e213b 100644 --- a/doc/devel/uml/public_operations.html +++ b/doc/devel/uml/public_operations.html @@ -23,6 +23,7 @@ buildProcessorPathManager configureToolFactory createClipMediacreate a (possibly compound) Clip refering to this media, ready to be added to the EDL. +currEDLSessionThe EDL currently in focus. In most cases, Session and EDL are almost the same, just EDL emphasizes the collection aspect. But generally (for larger editing projects) one Session can contain several EDLs, which may even be nested. At any given time, only one of these EDLs has focus and recieves the editing commands. 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 @@ -30,6 +31,7 @@ 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. +getFixtureSessionWhile the session can be comprised of several EDLs,
          there is only one Fixture, which represents the actual
          configuration of all Objects to be rendered getFrameFilemode = READ, WRITE, ... getIDAssetManager 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 diff --git a/src/common/time.hpp b/src/common/time.hpp index 3b8db7cfb..e434d27ed 100644 --- a/src/common/time.hpp +++ b/src/common/time.hpp @@ -33,10 +33,18 @@ namespace cinelerra /** * denotes a temporal position (time point), based on timeline start. * - * investigate posix.4 realtime timers, wrap these here + * @todo currently (9/07) this is a dummy implementation to find out + * what interface the Proc layer needs. Cehteh has already written + * elaborate timehandling functions in the backend and the goal + * is for class Time to be just a thin wrapper! */ class Time - {}; + { + int dummy; + public: + Time(int dum=0) : dummy(dum) {} + operator int () { return dummy; } + }; } // namespace cinelerra #endif diff --git a/src/common/util.hpp b/src/common/util.hpp index 0b8d03e56..3d74d4ed8 100644 --- a/src/common/util.hpp +++ b/src/common/util.hpp @@ -98,7 +98,7 @@ namespace util inline bool contains (SEQ& cont, typename SEQ::value_type& val) { - SEQ::iterator end = cont.end(); + typename SEQ::iterator end = cont.end(); return end != std::find(cont.begin(),end, val); } diff --git a/src/proc/asset/media.hpp b/src/proc/asset/media.hpp index d5593c514..8349e1d69 100644 --- a/src/proc/asset/media.hpp +++ b/src/proc/asset/media.hpp @@ -40,7 +40,7 @@ -class mobject::session::Clip; +namespace mobject { namespace session { class Clip; }} namespace asset { @@ -48,6 +48,7 @@ namespace asset class Clip; class Media; class MediaFactory; + class ProcPatt; template<> diff --git a/src/proc/mobject/mobject.hpp b/src/proc/mobject/mobject.hpp index 02a3345bc..a91dbe179 100644 --- a/src/proc/mobject/mobject.hpp +++ b/src/proc/mobject/mobject.hpp @@ -25,12 +25,14 @@ #define MOBJECT_MOBJECT_H #include +#include #include "cinelerra.h" #include "proc/mobject/buildable.hpp" using std::list; +using std::tr1::shared_ptr; namespace mobject @@ -56,6 +58,9 @@ namespace mobject list placement; }; + + + typedef shared_ptr PMO; diff --git a/src/proc/mobject/placement.hpp b/src/proc/mobject/placement.hpp index c486c9573..726379ffb 100644 --- a/src/proc/mobject/placement.hpp +++ b/src/proc/mobject/placement.hpp @@ -24,6 +24,8 @@ #ifndef MOBJECT_PLACEMENT_H #define MOBJECT_PLACEMENT_H +#include "common/time.hpp" +#include "common/factory.hpp" #include "proc/mobject/mobject.hpp" #include "proc/mobject/session/track.hpp" @@ -32,7 +34,9 @@ namespace mobject { + class Placement; class ExplicitPlacement; + class PlacementFactory; class Placement @@ -45,10 +49,44 @@ namespace mobject public: + /** + * styles of placement. + */ + enum Style + { + FIXED, + RELATIVE + }; + + static PlacementFactory create; + /** resolve the network of placement and * provide the resulting (explicit) placement. */ ExplicitPlacement& resolve () ; + + protected: + Placement (); + friend class PlacementFactory; + }; + + + typedef shared_ptr PPla; + + + + + /** + * Factory specialized for creating Media Asset objects. + */ + class PlacementFactory : public cinelerra::Factory + { + public: + typedef shared_ptr PType; + typedef cinelerra::Time Time; + + PType operator() (Placement::Style, Time, PMO subject); + }; diff --git a/src/proc/mobject/session/session.cpp b/src/proc/mobject/session/session.cpp index 1bb585d3e..e926c72ad 100644 --- a/src/proc/mobject/session/session.cpp +++ b/src/proc/mobject/session/session.cpp @@ -25,12 +25,29 @@ #include "proc/mobject/session/edl.hpp" #include "proc/mobject/session/fixture.hpp" + +using cinelerra::Singleton; + namespace mobject { namespace session { - /** */ + /** @return the system-wide current session. + * Implemented as singleton. + */ + Singleton Session::getCurrent; + + + + /** create a new empty session with default values. + */ + Session::Session () + : edl(), + fixture() + { + + } diff --git a/src/proc/mobject/session/session.hpp b/src/proc/mobject/session/session.hpp index e63730eb0..f17ea1b00 100644 --- a/src/proc/mobject/session/session.hpp +++ b/src/proc/mobject/session/session.hpp @@ -24,6 +24,11 @@ #ifndef MOBJECT_SESSION_SESSION_H #define MOBJECT_SESSION_SESSION_H +#include "common/singleton.hpp" +#include "proc/mobject/placement.hpp" + +#include + namespace mobject @@ -41,12 +46,30 @@ namespace mobject * perspective, it is a collection of Media Objects * (--> MObject) placed (--> Placement) onto virtual * Tracks. + * + * Opening a Session has effectively global consequences, + * because the Session defines the available Assets, and some + * kinds of Assets define default behaviour. Thus, access to + * the Session is similar to a Singleton instance. + * */ - class Session + class Session : private boost::noncopyable { protected: - EDL& edl; - Fixture& fixture; + vector edls; + Fixture fixture; + + Session (); + friend class cinelerra::singleton::StaticCreate; //TODO use PImpl or just covariance?? + + public: + static cinelerra::Singleton getCurrent; + + void add (PPla placement); + + + EDL& currEDL () { return edl; } + Fixture& getFixture () { return fixture; } }; diff --git a/src/proc/mobject/session/sessionimpl.cpp b/src/proc/mobject/session/sessionimpl.cpp new file mode 100644 index 000000000..d8a946002 --- /dev/null +++ b/src/proc/mobject/session/sessionimpl.cpp @@ -0,0 +1,40 @@ +/* + SessionImpl - holds the complete session data to be edited by the user + + 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/mobject/session/sessionimpl.hpp" +#include "proc/mobject/session/edl.hpp" +#include "proc/mobject/session/fixture.hpp" + +namespace mobject + { + + namespace session + { + + /** */ + + + + } // namespace mobject::session + +} // namespace mobject diff --git a/src/proc/mobject/session/sessionimpl.hpp b/src/proc/mobject/session/sessionimpl.hpp new file mode 100644 index 000000000..5f4aedb1c --- /dev/null +++ b/src/proc/mobject/session/sessionimpl.hpp @@ -0,0 +1,65 @@ +/* + SESSIONIMPL.hpp - holds the complete session data to be edited by the user + + 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_SESSIONIMPL_H +#define MOBJECT_SESSION_SESSIONIMPL_H + +#include "proc/mobject/session/session.hpp" +#include "proc/mobject/session/edl.hpp" +#include "proc/mobject/session/fixture.hpp" + +#include + +using std::vector; + + + +namespace mobject + { + namespace session + { + + + /** + * Implementation class for the Session interface + */ + class SessionImpl : public mobject::Session + { + protected: + vector edls; + Fixture fixture; + + SessionImpl (); + friend class cinelerra::singleton::StaticCreate; + + void add (PPla placement); + + EDL& currEDL () { return edl; } + Fixture& getFixture () { return fixture; } + + }; + + } // namespace mobject::session + +} // namespace mobject +#endif diff --git a/tests/components/proc/mobject/session/addcliptest.cpp b/tests/components/proc/mobject/session/addcliptest.cpp index 610e37445..6d2d0c7f0 100644 --- a/tests/components/proc/mobject/session/addcliptest.cpp +++ b/tests/components/proc/mobject/session/addcliptest.cpp @@ -24,12 +24,14 @@ #include "common/test/run.hpp" #include "proc/mobject/session/session.hpp" #include "proc/mobject/session/testclip.hpp" +#include "proc/mobject/placement.hpp" #include "common/util.hpp" //#include #include //using boost::format; +using cinelerra::Time; using util::contains; using std::string; using std::cout; @@ -56,7 +58,7 @@ namespace mobject { Session& sess = Session::getCurrent(); PMO clip = TestClip::create(); - PPla pla = Placement::create(FIXED, Time(1), clip); + PPla pla = Placement::create(Placement::FIXED, Time(1), clip); sess.add (pla); ASSERT (contains (sess.getEDL(), pla)); diff --git a/tests/components/proc/mobject/session/testclip.hpp b/tests/components/proc/mobject/session/testclip.hpp index f9edae2a5..3128a623d 100644 --- a/tests/components/proc/mobject/session/testclip.hpp +++ b/tests/components/proc/mobject/session/testclip.hpp @@ -26,12 +26,13 @@ #include "common/test/run.hpp" -//#include "common/factory.hpp" +#include "common/factory.hpp" //#include "common/util.hpp" //#include #include +using std::tr1::shared_ptr; //using boost::format; using std::string; using std::cout; diff --git a/uml/cinelerra3/128133.diagram b/uml/cinelerra3/128133.diagram index 037598822..e37cd05e9 100644 --- a/uml/cinelerra3/128133.diagram +++ b/uml/cinelerra3/128133.diagram @@ -1,8 +1,8 @@ format 40 -classcanvas 128005 class_ref 128005 // Session +classcanvas 128005 class_ref 128005 // SessionImpl 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 30 608 2000 + xyz 19 606 2000 end classcanvas 128133 class_ref 128133 // EDL 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 @@ -38,7 +38,7 @@ classcanvas 131461 class_ref 128901 // Clip end classcanvas 131717 class_ref 129029 // 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 336 361 2000 + xyz 332 361 2000 end classcanvas 131973 class_ref 129157 // 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 @@ -92,10 +92,14 @@ classcanvas 138629 class_ref 135173 // Segment end classcanvas 139013 class_ref 138629 // CompoundClip 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 266 466 2000 + xyz 272 466 2000 end -relationcanvas 128389 relation_ref 128005 // - from ref 128005 z 1999 stereotype "<>" xyz 139 626 3000 to ref 128133 +classcanvas 139269 class_ref 139653 // Session + 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 23 458 2000 + end +relationcanvas 128389 relation_ref 128005 // + from ref 128005 z 1999 to ref 128133 role_a_pos 201 603 3000 no_role_b multiplicity_a_pos 205 636 3000 no_multiplicity_b relationcanvas 128517 relation_ref 128133 // @@ -210,4 +214,8 @@ relationcanvas 139141 relation_ref 140805 // from ref 139013 z 1999 to ref 131461 no_role_a no_role_b no_multiplicity_a no_multiplicity_b +relationcanvas 139525 relation_ref 142725 // + from ref 128005 z 1999 stereotype "<>" xyz 57 558 3000 to ref 139269 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b end diff --git a/uml/cinelerra3/128261 b/uml/cinelerra3/128261 index 5addfc8e9..528bee399 100644 --- a/uml/cinelerra3/128261 +++ b/uml/cinelerra3/128261 @@ -1,6 +1,6 @@ format 40 "MObject" // ProcessingLayer::MObject - revision 20 + revision 21 modified_by 5 "hiv" // class settings //class diagram settings @@ -48,7 +48,55 @@ format 40 size A4 end - class 128005 "Session" + class 139653 "Session" + abstract visibility public + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + comment "Primary Interface for all editing tasks. +The session contains defaults, all the assets being edited, and a set of EDL with the individual MObjects to be manipulated and rendered." + operation 133509 "currEDL" + public return_type class_ref 128133 // EDL + 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 "The EDL currently in focus. In most cases, Session and EDL are almost the same, just EDL emphasizes the collection aspect. But generally (for larger editing projects) one Session can contain several EDLs, which may even be nested. At any given time, only one of these EDLs has focus and recieves the editing commands." + end + + operation 133637 "getFixture" + public explicit_return_type "Fixture&" + 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 "While the session can be comprised of several EDLs, +there is only one Fixture, which represents the actual +configuration of all Objects to be rendered" + end + end + + class 128005 "SessionImpl" visibility package cpp_decl "${comment}${template}class ${name}${inherit} { @@ -59,13 +107,13 @@ ${inlines} idl_decl "" explicit_switch_type "" - classrelation 128005 // edls () - relation 128005 o--> - stereotype "list" + comment "Implementation class for the Session interface" + classrelation 128005 // edls () + relation 128005 *--> a role_name "edls" multiplicity "1..*" protected - cpp default " ${comment}${static}${mutable}${volatile}${const}${type} * ${name}${value}; + cpp default " ${comment}${static}${mutable}${volatile}${const}${stereotype}<${type}> ${name}${value}; " - classrelation_ref 128005 // edls () + classrelation_ref 128005 // edls () b multiplicity "" parent class_ref 128133 // EDL end @@ -77,6 +125,15 @@ ${inlines} classrelation_ref 128261 // fixture () b multiplicity "" parent class_ref 128261 // Fixture end + + classrelation 144645 // + relation 142725 -_-|> + stereotype "PImpl" + a public + cpp default "${type}" + classrelation_ref 144645 // + b multiplicity "" parent class_ref 139653 // Session + end end class 128133 "EDL" diff --git a/uml/cinelerra3/130181 b/uml/cinelerra3/130181 index 0bb6e6de6..2204811cd 100644 --- a/uml/cinelerra3/130181 +++ b/uml/cinelerra3/130181 @@ -1,6 +1,6 @@ format 40 "mobject" // design::codegen::proc::mobject - revision 7 + revision 8 modified_by 5 "hiv" // class settings //class diagram settings @@ -39,6 +39,45 @@ including the Session (EDL), Builder and Processing Controller" 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 138757 "session" + 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 139653 // Session + end + comment "Interface: the session edited by the user" + end + artifact 128261 "mobject" stereotype "source" cpp_h "/* diff --git a/uml/cinelerra3/130437 b/uml/cinelerra3/130437 index 734633b1d..e5790e68f 100644 --- a/uml/cinelerra3/130437 +++ b/uml/cinelerra3/130437 @@ -1,6 +1,6 @@ format 40 "session" // design::codegen::proc::mobject::session - revision 7 + revision 8 modified_by 5 "hiv" // class settings //class diagram settings @@ -38,7 +38,7 @@ Everything concerning the EDL and Session, within the MObject Subsystem" 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 128517 "session" + artifact 128517 "sessionimpl" stereotype "source" cpp_h "/* ${NAME}.hpp - ${description} @@ -72,9 +72,9 @@ ${namespace_start} ${members} ${namespace_end}" associated_classes - class_ref 128005 // Session + class_ref 128005 // SessionImpl end - comment "holds the complete session to be edited by the user" + comment "holds the complete session data to be edited by the user" end artifact 128645 "edl" diff --git a/uml/cinelerra3/5.session b/uml/cinelerra3/5.session index e2727d655..dd61f6409 100644 --- a/uml/cinelerra3/5.session +++ b/uml/cinelerra3/5.session @@ -3,7 +3,7 @@ diagrams classdiagram_ref 130309 // Asset Kinds 860 633 100 4 0 0 active classdiagram_ref 128133 // Session structure - 860 633 100 4 341 0 + 860 633 100 4 581 0 classdiagram_ref 130437 // Media-Asset Relations 860 633 100 4 0 0 classdiagram_ref 128389 // Render Entities @@ -11,10 +11,10 @@ diagrams end show_stereotypes selected -package_ref 129 // cinelerra3 + package_ref 129 // cinelerra3 open -package_ref 128005 // design + package_ref 128005 // design classview_ref 128901 // Assets classview_ref 128005 // Session classview_ref 129029 // Interface diff --git a/uml/cinelerra3/cinelerra3.prj b/uml/cinelerra3/cinelerra3.prj index cd49f3161..26a25ad00 100644 --- a/uml/cinelerra3/cinelerra3.prj +++ b/uml/cinelerra3/cinelerra3.prj @@ -1,6 +1,6 @@ format 40 "cinelerra3" - revision 29 + revision 30 modified_by 5 "hiv" cpp_root_dir "../../src/" diff --git a/wiki/renderengine.html b/wiki/renderengine.html index 9ddac1a24..90d649411 100644 --- a/wiki/renderengine.html +++ b/wiki/renderengine.html @@ -755,12 +755,18 @@ The main tool used to implement this separation is the [[Builder Pattern|http:// Another pertinent theme is to make the basic building blocks simpler, while on the other hand gaining much more flexibility for combining these building blocks. For example we try to unfold any "internal-multi" effects into separate instances (e.g. the possibility of having an arbitrary number of single masks at any point of the pipeline instead of having one special masking facility encompassing multiple sub-masks. Similarly, we treat the Objects in the EDL in a more uniform manner and gain the possibility to [[place|Placement]] them in various ways.
          -
          +
          ''EDL'' is a short-hand for __E__dit __D__ecision __L__ist. The use of this term can be confusing; for the usual meaning see the definition in [[Wikipedia|http://en.wikipedia.org/wiki/Edit_decision_list]]
           
           Cinelerra uses this term in a related manner but with a somewhat shifted focus (and we just stick to this usage here): In Cinelerra the EDL is comprised of the whole set of clips and other media objects parametrized and placed onto the tracks by the user. It is the result of the user's //editing efforts.//
           
          -In this usage, the EDL is almost synonymous to the ''Session'', just the latter emphasizes more the state aspect, as it can be thought as a current state of the EDL contained in a file or data structure together with additional Option values and settings for the GUI. The Session is what you save and load, while the EDL rather denotes a structure of Objects placed in time.
          +In this usage, the EDL in most cases will be almost synonymous to the ''Session'', just the latter emphasizes more the state aspect, as it can be thought as the current EDL contents contained in a file or data structure together with additional Option values and settings for the GUI. The Session is what you save and load, while the EDL rather denotes a structured collection of Objects placed in time.
          +
          +!!!larger projects
          +For larger editing projects the simple structure of a session containing "the" timeline is not sufficient. Rather, we have several timelines, e.g. one for each scene. Or we could have several layered or nested timelines (compositional work, multimedia productions). To support these cases without making the default case more complicated, Cinelerra-3 introduces a //focus// for selecting the //current EDL,// which will receive all editing operations.
          +
          +!!!the definitive state
          +With all the structural complexities possible within such a session, we need an isolation layer to provide __one__ definitive state where all configuration has been made explicit. Thus the session manages one special object list, the [[Fixture]], which can be seen as all currently active object placed onto a single timeline.
           
          @@ -881,13 +887,14 @@ Some further details * and, as the created smart-pointer is a template parameter, such a custom Functor can create all sorts of Proxies, wrappers and the like
          -
          +
          a specially configured EDL
            * all MObjects have their position, length and configuration set up ready for rendering.
          - * all MObjects are associated with a ExplicitPlacement
          + * compound objects (e.g. multichannel clips) have been resolved to single non-compound basic objects.
          + * every MObject is associated with an ExplicitPlacement, which declares a fixed position (Time, Track)
            * this ~ExplicitPlacements are contained in a ordered List called the Timeline
           
          -//My intention is to create this Fixture out of the editing operations done by the user//
          +As the builder and thus render engine //only consults the fixture,// while all editing operations finally propagate to the fixture as well, we get an isolation layer between the high level part of the Proc layer (editing, object manipulation) and the render engine
           
          From 83a972f846b589850c2d6226262557aafee5393b Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Thu, 27 Sep 2007 23:07:05 +0200 Subject: [PATCH 13/14] work out the details how to handle and access the 'current session' --- doc/devel/uml/class128645.html | 2 +- doc/devel/uml/class129285.html | 6 +- doc/devel/uml/class129797.html | 2 +- doc/devel/uml/class139653.html | 3 +- doc/devel/uml/class139781.html | 27 ++++++++ doc/devel/uml/classes.html | 3 +- doc/devel/uml/classes_list.html | 3 +- doc/devel/uml/fig128133.png | Bin 58926 -> 62896 bytes doc/devel/uml/index.html | 11 ++- doc/devel/uml/index_67.html | 26 +++---- doc/devel/uml/index_68.html | 1 - doc/devel/uml/index_70.html | 1 + doc/devel/uml/index_73.html | 2 +- doc/devel/uml/index_76.html | 1 + doc/devel/uml/index_77.html | 2 +- doc/devel/uml/index_79.html | 2 +- doc/devel/uml/index_82.html | 1 + doc/devel/uml/index_83.html | 5 +- doc/devel/uml/index_84.html | 6 +- doc/devel/uml/index_86.html | 10 +-- doc/devel/uml/public_operations.html | 8 ++- doc/devel/uml/public_properties.html | 1 + uml/cinelerra3/128133.diagram | 31 ++++++--- uml/cinelerra3/128261 | 98 ++++++++++++++++++++++++++- uml/cinelerra3/130437 | 43 +++++++++++- uml/cinelerra3/5.session | 4 +- uml/cinelerra3/cinelerra3.prj | 2 +- wiki/renderengine.html | 30 +++++--- 28 files changed, 267 insertions(+), 64 deletions(-) create mode 100644 doc/devel/uml/class139781.html diff --git a/doc/devel/uml/class128645.html b/doc/devel/uml/class128645.html index a00dfada6..b87a32e2c 100644 --- a/doc/devel/uml/class128645.html +++ b/doc/devel/uml/class128645.html @@ -16,7 +16,7 @@ -

          Declaration :

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

          Directly inherited by : Allocation DirectPlacement ExplicitPlacement RelativePlacement

          +

          Declaration :

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

          Directly inherited by : Allocation ExplicitPlacement FixedPlacement RelativePlacement

          Artifact : placement

          Relation subject (<association>)

          Declaration :

          • Uml : # subject : MObject, multiplicity : 1
          • C++ : protected: MObject* subject
          diff --git a/doc/devel/uml/class129285.html b/doc/devel/uml/class129285.html index 9278b48ae..0091fcd2d 100644 --- a/doc/devel/uml/class129285.html +++ b/doc/devel/uml/class129285.html @@ -4,19 +4,19 @@ -Class DirectPlacement +Class FixedPlacement -
          Class DirectPlacement
          +
          Class FixedPlacement

          -

          Declaration :

          Artifact : fixedplacement

          +

          Declaration :

          Artifact : fixedplacement

          All public operations : resolve

          diff --git a/doc/devel/uml/class129797.html b/doc/devel/uml/class129797.html index 7af02f3ea..a68f76325 100644 --- a/doc/devel/uml/class129797.html +++ b/doc/devel/uml/class129797.html @@ -16,7 +16,7 @@ -

          Declaration :

          • C++ : class ExplicitPlacement : public Placement
          • Java : public interface ExplicitPlacement

          Directly inherited by : DirectPlacement

          +

          Declaration :

          • C++ : class ExplicitPlacement : public Placement
          • Java : public interface ExplicitPlacement

          Directly inherited by : FixedPlacement

          Artifact : explicitplacement

          Attribut time
          diff --git a/doc/devel/uml/class139653.html b/doc/devel/uml/class139653.html index d23ad4ec8..cfdc8392a 100644 --- a/doc/devel/uml/class139653.html +++ b/doc/devel/uml/class139653.html @@ -20,7 +20,8 @@

          Primary Interface for all editing tasks.
          The session contains defaults, all the assets being edited, and a set of EDL with the individual MObjects to be manipulated and rendered.

          Artifact : session

          Operation currEDL

          Declaration :

          • Uml : + currEDL() : EDL
          • C++ : public: EDL currEDL ()

          The EDL currently in focus. In most cases, Session and EDL are almost the same, just EDL emphasizes the collection aspect. But generally (for larger editing projects) one Session can contain several EDLs, which may even be nested. At any given time, only one of these EDLs has focus and recieves the editing commands.

          -
          Operation getFixture

          Declaration :

          • Uml : + getFixture() : Fixture&
          • C++ : public: Fixture& getFixture ()

          While the session can be comprised of several EDLs,
          there is only one Fixture, which represents the actual
          configuration of all Objects to be rendered

          +
          Operation getFixture

          Declaration :

          • Uml : + getFixture() : Fixture&
          • C++ : public: Fixture& getFixture ()

          While the session can be comprised of several EDLs,
          there is only one Fixture, which represents the actual
          configuration of all Objects to be rendered

          +
          Relation current (<unidirectional association>)

          Declaration :

          Standard access path to get at the current session via the Session Manager, which acts as a "PImpl" smart pointer

          All public operations : currEDL , getFixture

          diff --git a/doc/devel/uml/class139781.html b/doc/devel/uml/class139781.html new file mode 100644 index 000000000..60bd83878 --- /dev/null +++ b/doc/devel/uml/class139781.html @@ -0,0 +1,27 @@ + + + + + + +Class SessManager + + + + + +
          Class SessManager
          +

          + + + + +

          Declaration :

          • C++ : class SessManager

          Artifact : sessmanager

          + +
          Operation clear

          Declaration :

          • Uml : + clear() : void
          • C++ : public: void clear ()

          clear current session contents
          without resetting overall session config.
          Afterwards, the session will contain only one
          empty EDL, while all Assets are retained.

          +
          Operation reset

          Declaration :

          • Uml : + reset() : void
          • C++ : public: void reset ()

          reset all session config and
          start with a pristine default session.

          +
          Operation load

          Declaration :

          • Uml : + load() : void
          • C++ : public: void load ()

          replace the current session by a new
          session loaded from serialized state.

          +
          Operation save

          Declaration :

          • Uml : + save() : void
          • C++ : public: void save ()

          create a complete, serialized representation
          of the current session config and contents.
          @todo how to serialize, prameters, return value?

          +

          All public operations : clear , load , reset , save

          + + diff --git a/doc/devel/uml/classes.html b/doc/devel/uml/classes.html index f3008a1a0..39a63ddb4 100644 --- a/doc/devel/uml/classes.html +++ b/doc/devel/uml/classes.html @@ -42,7 +42,6 @@ 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 DBImplementation of the registry holding all Asset instances known to the Asset Manager subsystem. As of 8/2007 implemented by a hashtable. -DirectPlacement DoAttach DoRecurse EDL @@ -60,6 +59,7 @@ FileMapCache FileProviderThis is the Factory for Files, whenever something wants to use some file (or temporary storage), This Factory will hand out some smart/shared pointer to a File object which will be used to retrieve Frames. FileReference +FixedPlacement Fixture FrameFrames 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. FrameinterfaceTODO: 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 @@ -107,6 +107,7 @@ SegmentationToolTool implementation for deriving a partitioning of the current timeline such, that each segement has a constant configuration. "Constant" means here, that any remaining changes over time can be represented by automation solely, without the need to change the node connections. SessionPrimary Interface for all editing tasks.
          The session contains defaults, all the assets being edited, and a set of EDL with the individual MObjects to be manipulated and rendered. SessionImplImplementation class for the Session interface +SessManager SimpleClipElementary clip consisting of only one media stream SmartPointerauxiliary SourceSource Node: represents a media source to pull data from. diff --git a/doc/devel/uml/classes_list.html b/doc/devel/uml/classes_list.html index a97c2af5b..44865f171 100644 --- a/doc/devel/uml/classes_list.html +++ b/doc/devel/uml/classes_list.html @@ -43,7 +43,6 @@ ControllerFacade
          Dataset
          DB
          -DirectPlacement
          DoAttach
          DoRecurse
          EDL
          @@ -61,6 +60,7 @@ FileMapCache
          FileProvider
          FileReference
          +FixedPlacement
          Fixture
          Frame
          Frame
          @@ -108,6 +108,7 @@ SegmentationTool
          Session
          SessionImpl
          +SessManager
          SimpleClip
          SmartPointer
          Source
          diff --git a/doc/devel/uml/fig128133.png b/doc/devel/uml/fig128133.png index 68a34623f63b00be7bc271533b1b0141171a545e..70b2dd611e876bb913d0eae72efa619db9a2176c 100644 GIT binary patch literal 62896 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 literal 58926 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 z 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 G{Qm&({Nb_y diff --git a/doc/devel/uml/index.html b/doc/devel/uml/index.html index fdd9b2654..95d9a7166 100644 --- a/doc/devel/uml/index.html +++ b/doc/devel/uml/index.html @@ -112,7 +112,7 @@ Documentation
          Artifact Cinelerra3

          Depends on common

          Depends on gui

          Depends on proc

          Depends on backend

          the main executable to be built

          -

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

          +

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

          Artifact main

          Artifact source

          @@ -334,6 +334,10 @@ Documentation
          Artifact sessionimpl

          holds the complete session data to be edited by the user

          Artifact source associated with : SessionImpl

          + +
          Artifact sessmanager
          +

          global session access and lifecycle

          +

          Artifact source associated with : SessManager

          Artifact edl

          the (high level) Edit Decision List within the current Session

          @@ -376,7 +380,7 @@ Documentation

          Artifact source associated with : Meta

          Artifact fixedplacement
          -

          Artifact source associated with : DirectPlacement

          +

          Artifact source associated with : FixedPlacement

          Artifact relativeplacement

          Placement implemnetaion providing various ways of attaching a MObject to another one

          @@ -614,6 +618,7 @@ Documentation

          Session structure



          Class Session
          +
          Class EDL
          Class Fixture
          Class Segment
          @@ -627,7 +632,7 @@ Documentation
          Class Effect
          Class Meta
          -
          +
          Class Label
          diff --git a/doc/devel/uml/index_67.html b/doc/devel/uml/index_67.html index b81c28c53..dc1b39579 100644 --- a/doc/devel/uml/index_67.html +++ b/doc/devel/uml/index_67.html @@ -27,24 +27,25 @@ 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 +clearoperationclear current session contents
          without resetting overall session config.
          Afterwards, the session will contain only one
          empty EDL, while all Assets are retained.
          Clipclassbookkeeping (asset) view of a media clip. clipartifacta Media Clip clipartifactbookkeeping (asset) view of a media clip. @@ -75,8 +76,8 @@ connectopaque activity action Constraintclass Controllercomponent -Controllerpackage controllerpackagesourcecode package

          The Processing and Render Controller,
          located within the MObject Subsystem +Controllerpackage Controller Entitiesclass diagram Controller Workingsclass view ControllerFacadeclassProvides unified access to the Proc-Subsystem Controller. Especially, this Facade class provides the functions to get a render engine to carry out actual renderings. @@ -85,6 +86,7 @@ create ProcNodeopaque activity action createClipoperationcreate a (possibly compound) Clip refering to this media, ready to be added to the EDL. currEDLoperationThe EDL currently in focus. In most cases, Session and EDL are almost the same, just EDL emphasizes the collection aspect. But generally (for larger editing projects) one Session can contain several EDLs, which may even be nested. At any given time, only one of these EDLs has focus and recieves the editing commands. +currentrelationStandard access path to get at the current session via the Session Manager, which acts as a "PImpl" smart pointer currFramerelation diff --git a/doc/devel/uml/index_68.html b/doc/devel/uml/index_68.html index 75c620c08..cdeda3e68 100644 --- a/doc/devel/uml/index_68.html +++ b/doc/devel/uml/index_68.html @@ -31,7 +31,6 @@ determine Render Paramsexpansion region determine Render Paramsopaque activity action devnullclass instance -DirectPlacementclass Dispatchercomponent DoAttachclass DoRecurseclass diff --git a/doc/devel/uml/index_70.html b/doc/devel/uml/index_70.html index 242d89493..94fe56f77 100644 --- a/doc/devel/uml/index_70.html +++ b/doc/devel/uml/index_70.html @@ -30,6 +30,7 @@ FileReferenceclass filesrelation fixedplacementartifact +FixedPlacementclass Fixtureactivity object fixtureartifactthe (low level) representation of the EDL with concrete placement data Fixturecomponent diff --git a/doc/devel/uml/index_73.html b/doc/devel/uml/index_73.html index 496421c53..0f82f3fd9 100644 --- a/doc/devel/uml/index_73.html +++ b/doc/devel/uml/index_73.html @@ -20,8 +20,8 @@ idattributeAsset primary key. In Memory Databaseclass diagram inFixtureactivity action pin -inputclass instance inputclass instance +inputclass instance inputclass instance instanceoperation instructionsrelation diff --git a/doc/devel/uml/index_76.html b/doc/devel/uml/index_76.html index 9403a79d7..8fa1f472c 100644 --- a/doc/devel/uml/index_76.html +++ b/doc/devel/uml/index_76.html @@ -23,6 +23,7 @@ lengthattributeduration (span) of this timeline segment. Linkclass linkartifactforwarding, adapting or connecting ProcNode +loadoperationreplace the current session by a new
          session loaded from serialized state. load Mediause case Lockclass Lockclass diff --git a/doc/devel/uml/index_77.html b/doc/devel/uml/index_77.html index 997d703b9..d83661f51 100644 --- a/doc/devel/uml/index_77.html +++ b/doc/devel/uml/index_77.html @@ -32,8 +32,8 @@ MediaFactoryclassspecialized Asset Factory for configuring (new) media asset instances based on existing media files on disk; can create placeholder assets as well 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 +metaartifactabstract base class of all MObjects representing meta data or processing instructions 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_79.html b/doc/devel/uml/index_79.html index b34c12000..863a630ae 100644 --- a/doc/devel/uml/index_79.html +++ b/doc/devel/uml/index_79.html @@ -19,9 +19,9 @@ NameKindDescription offsetattributeOffset the actual position by this (time) value relative to the anchor point. TODO: Representation? 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 +ouputclass instance OutPortclassstructural asset corresponding to some port generating media output outportartifactstructural asset corresponding to some port generating media output outputrelation diff --git a/doc/devel/uml/index_82.html b/doc/devel/uml/index_82.html index db5b9dc39..40cc37dd5 100644 --- a/doc/devel/uml/index_82.html +++ b/doc/devel/uml/index_82.html @@ -36,6 +36,7 @@ RenderStateclassEncapsulates the logic used to get a "current render process" in accordance to the currentyl applicable controller settings. The provided StateProxy serves to hold any mutalbe state used in the render process, so the rest of the render engine can be stateless. renderstateartifactrenderengine state manager reprattributehuman readable representation of the condition characterizing this allocaton, e.g. "t >= 10" +resetoperationreset all session config and
          start with a pristine default session. 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 c3a049c32..847982657 100644 --- a/doc/devel/uml/index_83.html +++ b/doc/devel/uml/index_83.html @@ -18,6 +18,7 @@ + @@ -36,6 +37,8 @@ + + @@ -43,8 +46,8 @@ - + diff --git a/doc/devel/uml/index_84.html b/doc/devel/uml/index_84.html index 686d34aef..98fe8201c 100644 --- a/doc/devel/uml/index_84.html +++ b/doc/devel/uml/index_84.html @@ -32,20 +32,20 @@ - + + - - +
          NameKindDescription
          SAMETIMEattributeplace subject at the sime time as the anchor
          saveoperationcreate a complete, serialized representation
          of the current session config and contents.
          @todo how to serialize, prameters, return value?
          Schedulerclass
          segmentartifactSegment of the Timeline.
          Used at the moment (7/07) for partitioning the timeline/fixture into segments
          to be rendered by a specialized render node network for each, without the need
          to change any connections within a given segment.
          Note this concept may be superfluos alltogether; is a draft and the real
          use still needs to be worked out...
          Segmentclass
          Session structureclass diagram
          sessionimplartifactholds the complete session data to be edited by the user
          SessionImplclassImplementation class for the Session interface
          sessmanagerartifactglobal session access and lifecycle
          SessManagerclass
          setup Build Paramsopaque activity action
          setup StateProxyopaque activity action
          shortDescattributeuser visible Name-ID. To be localized.
          SimpleClipclassElementary clip consisting of only one media stream
          SmartPointerclass
          SmartPointersclass view
          sourcerelationmedia source of this clip
          sourcerelationthe media source this clip referes to
          sourcerelationmedia source of this clip
          SourceclassSource Node: represents a media source to pull data from.
          sourceartifactRepresentation of a Media source
          Source Overviewdeployment diagram
          toolfactoryartifactsupply of Tool implementations for the Builder
          Trackclassstructural asset holding the configuration of a track in the EDL
          trackattribute
          trackartifactdescriptor for one track in the Session
          trackartifactstructural asset holding the configuration of a track in the EDL
          trackartifactdescriptor for one track in the Session
          Trackclass
          tracksrelationelementary media assets comprising this compound
          tracksrelation
          tracksrelation
          Trafoclass
          trafoartifacttransforming processing Node
          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_86.html b/doc/devel/uml/index_86.html index ce992fef4..4eb1f6d88 100644 --- a/doc/devel/uml/index_86.html +++ b/doc/devel/uml/index_86.html @@ -25,18 +25,18 @@ vid_Aclass instance vid_Aclass instance vid_aclass instance -vid_Aclass instance vid_aclass instance -videoclass instance +vid_Aclass instance videoclass instance +videoclass instance videoclass instance videoclass instance -video1class instance +video1class 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/public_operations.html b/doc/devel/uml/public_operations.html index ed11e213b..3143920e2 100644 --- a/doc/devel/uml/public_operations.html +++ b/doc/devel/uml/public_operations.html @@ -21,6 +21,7 @@ buildAssembler buildEngineBuilderFacadeMain Operation of the Builder: create a render engine for a given part of the timeline buildProcessorPathManager +clearSessManagerclear current session contents
          without resetting overall session config.
          Afterwards, the session will contain only one
          empty EDL, while all Assets are retained.
          configureToolFactory createClipMediacreate a (possibly compound) Clip refering to this media, ready to be added to the EDL. currEDLSessionThe EDL currently in focus. In most cases, Session and EDL are almost the same, just EDL emphasizes the collection aspect. But generally (for larger editing projects) one Session can contain several EDLs, which may even be nested. At any given time, only one of these EDLs has focus and recieves the editing commands. @@ -43,17 +44,20 @@ howtoProcMedia@return descriptor how to build a render pipeline corresponding to this media 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 +loadSessManagerreplace the current session by a new
          session loaded from serialized state. playRenderEngineTODO: will probably be handled differently (see Cehteh) removeAssetManagerremove the given asset <i>together with all its dependants</i> from the internal DB +resetSessManagerreset all session config and
          start with a pristine default session. resolvePlacementcreate an actual (explicit) placement while trying to satisfy the network of adjacent objects and placements. 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 +saveSessManagercreate a complete, serialized representation
          of the current session config and contents.
          @todo how to serialize, prameters, return value? treatNodeCreatorTool +treatNodeCreatorTool treatNodeCreatorTool treatNodeCreatorTool -treatNodeCreatorTool +treatSegmentationTool treatSegmentationTool treatSegmentationTool -treatSegmentationTool 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 diff --git a/doc/devel/uml/public_properties.html b/doc/devel/uml/public_properties.html index d1d591657..6790afee8 100644 --- a/doc/devel/uml/public_properties.html +++ b/doc/devel/uml/public_properties.html @@ -18,6 +18,7 @@ + diff --git a/uml/cinelerra3/128133.diagram b/uml/cinelerra3/128133.diagram index e37cd05e9..c0272f7ed 100644 --- a/uml/cinelerra3/128133.diagram +++ b/uml/cinelerra3/128133.diagram @@ -44,17 +44,17 @@ classcanvas 131973 class_ref 129157 // 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 389 368 2000 end -classcanvas 132229 class_ref 129285 // DirectPlacement +classcanvas 132229 class_ref 129285 // FixedPlacement 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 664 373 2000 + xyz 665 373 2000 end classcanvas 132869 class_ref 129413 // RelativePlacement 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 471 346 2000 + xyz 479 276 2000 end classcanvas 134149 class_ref 129541 // Allocation 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 590 359 2000 + xyz 590 373 2000 end classcanvas 134405 class_ref 129669 // Label 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 @@ -98,6 +98,10 @@ classcanvas 139269 class_ref 139653 // Session 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 23 458 2000 end +classcanvas 139653 class_ref 139781 // SessManager + 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 101 301 2000 + end relationcanvas 128389 relation_ref 128005 // from ref 128005 z 1999 to ref 128133 role_a_pos 201 603 3000 no_role_b @@ -120,8 +124,8 @@ relationcanvas 129157 relation_ref 128389 // multiplicity_a_pos 314 687 3000 no_multiplicity_b relationcanvas 129797 relation_ref 128645 // from ref 129413 z 1999 stereotype "<>" xyz 471 143 3000 to ref 129669 - role_a_pos 513 144 3000 role_b_pos 401 144 3000 - multiplicity_a_pos 547 177 3000 multiplicity_b_pos 401 177 3000 + role_a_pos 513 144 3000 role_b_pos 404 145 3000 + multiplicity_a_pos 547 177 3000 multiplicity_b_pos 393 145 3000 relationcanvas 130181 relation_ref 129029 // geometry HV from ref 128261 z 1999 stereotype "<>" xyz 334 914 3000 to point 339 931 @@ -157,16 +161,17 @@ relationcanvas 132485 relation_ref 129797 // no_role_a no_role_b no_multiplicity_a no_multiplicity_b relationcanvas 132997 relation_ref 129925 // - from ref 132869 z 1999 to point 486 247 + from ref 132869 z 1999 to point 529 240 line 133893 z 1999 to ref 129413 - role_a_pos 401 172 3000 no_role_b - multiplicity_a_pos 401 205 3000 multiplicity_b_pos 495 321 3000 + role_a_pos 439 215 3000 no_role_b + multiplicity_a_pos 401 197 3000 multiplicity_b_pos 515 251 3000 relationcanvas 134533 relation_ref 130309 // from ref 134405 z 1999 to ref 131973 no_role_a no_role_b no_multiplicity_a no_multiplicity_b relationcanvas 135173 relation_ref 130565 // - from ref 134149 z 1999 to ref 129669 + from ref 134149 z 1999 to point 610 312 + line 140037 z 1999 to ref 129669 no_role_a no_role_b no_multiplicity_a no_multiplicity_b relationcanvas 135301 relation_ref 130693 // @@ -218,4 +223,10 @@ relationcanvas 139525 relation_ref 142725 // from ref 128005 z 1999 stereotype "<>" xyz 57 558 3000 to ref 139269 no_role_a no_role_b no_multiplicity_a no_multiplicity_b +relationcanvas 139781 relation_ref 142853 // + geometry HV + from ref 139269 z 1999 to point 140 494 + line 139909 z 1999 to ref 139653 + role_a_pos 152 426 3000 no_role_b + multiplicity_a_pos 126 426 3000 no_multiplicity_b end diff --git a/uml/cinelerra3/128261 b/uml/cinelerra3/128261 index 528bee399..48dbcaf73 100644 --- a/uml/cinelerra3/128261 +++ b/uml/cinelerra3/128261 @@ -1,6 +1,6 @@ format 40 "MObject" // ProcessingLayer::MObject - revision 21 + revision 22 modified_by 5 "hiv" // class settings //class diagram settings @@ -94,6 +94,16 @@ ${class}::${name} ${(}${)}${const}${volatile} ${throw}${staticnl} there is only one Fixture, which represents the actual configuration of all Objects to be rendered" end + + classrelation 144773 // current () + relation 142853 ---> + a role_name "current" multiplicity "1" class_relation public + comment "Standard access path to get at the current session via the Session Manager, which acts as a \"PImpl\" smart pointer" + cpp default " ${comment}${static}${mutable}${volatile}${const}${type}& ${name}${value}; +" + classrelation_ref 144773 // current () + b multiplicity "" parent class_ref 139781 // SessManager + end end class 128005 "SessionImpl" @@ -136,6 +146,90 @@ ${inlines} end end + class 139781 "SessManager" + visibility package + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + operation 133765 "clear" + public explicit_return_type "void" + 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 "clear current session contents +without resetting overall session config. +Afterwards, the session will contain only one +empty EDL, while all Assets are retained. +" + end + + operation 133893 "reset" + public explicit_return_type "void" + 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 "reset all session config and +start with a pristine default session." + end + + operation 134021 "load" + public explicit_return_type "void" + 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 "replace the current session by a new +session loaded from serialized state." + end + + operation 134149 "save" + public explicit_return_type "void" + 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 "create a complete, serialized representation +of the current session config and contents. +@todo how to serialize, prameters, return value?" + end + end + class 128133 "EDL" visibility package cpp_decl "${comment}${template}class ${name}${inherit} @@ -585,7 +679,7 @@ ${inlines} end end - class 129285 "DirectPlacement" + class 129285 "FixedPlacement" visibility package cpp_decl "${comment}${template}class ${name}${inherit} { diff --git a/uml/cinelerra3/130437 b/uml/cinelerra3/130437 index e5790e68f..514cc634e 100644 --- a/uml/cinelerra3/130437 +++ b/uml/cinelerra3/130437 @@ -1,6 +1,6 @@ format 40 "session" // design::codegen::proc::mobject::session - revision 8 + revision 9 modified_by 5 "hiv" // class settings //class diagram settings @@ -77,6 +77,45 @@ ${namespace_end}" comment "holds the complete session data to be edited by the user" end + artifact 138885 "sessmanager" + 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 139781 // SessManager + end + comment "global session access and lifecycle" + end + artifact 128645 "edl" stereotype "source" cpp_h "/* @@ -506,7 +545,7 @@ ${namespace_start} ${members} ${namespace_end}" associated_classes - class_ref 129285 // DirectPlacement + class_ref 129285 // FixedPlacement end end diff --git a/uml/cinelerra3/5.session b/uml/cinelerra3/5.session index dd61f6409..6811c0673 100644 --- a/uml/cinelerra3/5.session +++ b/uml/cinelerra3/5.session @@ -3,7 +3,7 @@ diagrams classdiagram_ref 130309 // Asset Kinds 860 633 100 4 0 0 active classdiagram_ref 128133 // Session structure - 860 633 100 4 581 0 + 860 633 100 4 120 0 classdiagram_ref 130437 // Media-Asset Relations 860 633 100 4 0 0 classdiagram_ref 128389 // Render Entities @@ -16,7 +16,7 @@ open package_ref 128005 // design classview_ref 128901 // Assets - classview_ref 128005 // Session + class_ref 139781 // SessManager classview_ref 129029 // Interface end end diff --git a/uml/cinelerra3/cinelerra3.prj b/uml/cinelerra3/cinelerra3.prj index 26a25ad00..48d706651 100644 --- a/uml/cinelerra3/cinelerra3.prj +++ b/uml/cinelerra3/cinelerra3.prj @@ -1,6 +1,6 @@ format 40 "cinelerra3" - revision 30 + revision 31 modified_by 5 "hiv" cpp_root_dir "../../src/" diff --git a/wiki/renderengine.html b/wiki/renderengine.html index 90d649411..294dda752 100644 --- a/wiki/renderengine.html +++ b/wiki/renderengine.html @@ -741,6 +741,13 @@ This is an very important external Interface, because it links together all thre +
          +
          The question is where to put all the state-like information [[associated with the current session|SessionOverview]]. Because this is certainly "global", but may depend on the session or need to be configured differently when loading another session. At the moment (9/07) Ichthyo considers the following solution:
          +* represent all configuration as [[Asset]]s
          +* find a way {{red{TODO}}} how to reload the contents of the [[AssetManager]].
          +* completely hide the Session object behind a ''~PImpl'' smart pointer, so the session object can be switched when reloading.
          +* the [[Fixture]] acts as isolation layer, and all objects refered from the Fixture are refcounting smart pointers. So, even when the session gets switched, the old objects remain valid as long as needed.
          +
          RenderEngine
           
          @@ -755,18 +762,12 @@ The main tool used to implement this separation is the [[Builder Pattern|http:// Another pertinent theme is to make the basic building blocks simpler, while on the other hand gaining much more flexibility for combining these building blocks. For example we try to unfold any "internal-multi" effects into separate instances (e.g. the possibility of having an arbitrary number of single masks at any point of the pipeline instead of having one special masking facility encompassing multiple sub-masks. Similarly, we treat the Objects in the EDL in a more uniform manner and gain the possibility to [[place|Placement]] them in various ways.
          -
          +
          ''EDL'' is a short-hand for __E__dit __D__ecision __L__ist. The use of this term can be confusing; for the usual meaning see the definition in [[Wikipedia|http://en.wikipedia.org/wiki/Edit_decision_list]]
           
           Cinelerra uses this term in a related manner but with a somewhat shifted focus (and we just stick to this usage here): In Cinelerra the EDL is comprised of the whole set of clips and other media objects parametrized and placed onto the tracks by the user. It is the result of the user's //editing efforts.//
           
          -In this usage, the EDL in most cases will be almost synonymous to the ''Session'', just the latter emphasizes more the state aspect, as it can be thought as the current EDL contents contained in a file or data structure together with additional Option values and settings for the GUI. The Session is what you save and load, while the EDL rather denotes a structured collection of Objects placed in time.
          -
          -!!!larger projects
          -For larger editing projects the simple structure of a session containing "the" timeline is not sufficient. Rather, we have several timelines, e.g. one for each scene. Or we could have several layered or nested timelines (compositional work, multimedia productions). To support these cases without making the default case more complicated, Cinelerra-3 introduces a //focus// for selecting the //current EDL,// which will receive all editing operations.
          -
          -!!!the definitive state
          -With all the structural complexities possible within such a session, we need an isolation layer to provide __one__ definitive state where all configuration has been made explicit. Thus the session manages one special object list, the [[Fixture]], which can be seen as all currently active object placed onto a single timeline.
          +In this usage, the EDL in most cases will be almost synonymous to the [[Session|SessionOverview]], just the latter emphasizes more the state aspect, as it can be thought as the current EDL contents contained in a file or data structure together with additional Option values and settings for the GUI. The Session is what you save and load, while the EDL rather denotes a structured collection of Objects placed in time.
           
          @@ -986,7 +987,7 @@ For this Cinelerra3 design, we could consider making GOP just another raw media &rarr;see in [[Wikipedia|http://en.wikipedia.org/wiki/Group_of_pictures]]
          -
          +
          This wiki page is the entry point to detail notes covering some technical decisions, details and problems encountered in the course of the implementation of the Cinelerra Renderengine, the Builder and the related parts.
           
           * [[Packages, Interfaces and Namespaces|InterfaceNamespaces]]
          @@ -995,6 +996,7 @@ For this Cinelerra3 design, we could consider making GOP just another raw media
           * [[Creating new Objects|ObjectCreation]]
           * [[Multichannel Media|MultichannelMedia]]
           * [[Editing Operations|EditingOperations]]
          +* [[Handling of the current Session|CurrentSession]]
           
           
          @@ -2394,6 +2396,16 @@ The design of Cinelerra 2 basically follows this design, but __fails because of * see also the [[Entities involved in Rendering|RenderEntities]]
          +
          +
          The Session (sometimes also called //Project//) contains all informations and objects to be edited by the User. It can be saved and loaded. The individual Objects within the Session, i.e. Clips, Media, Effects, are contained in one (or several) collections within the Session, which we call [[EDL (Edit Decision List)|EDL]]. Moreover, the sesion contains references to all the Media files used, and it contains various default or user defined configuration. At any given time, there is //only one current session// opened within the application.
          +
          +!!!larger projects
          +For larger editing projects the simple structure of a session containing "the" timeline is not sufficient. Rather, we have several timelines, e.g. one for each scene. Or we could have several layered or nested timelines (compositional work, multimedia productions). To support these cases without making the default case more complicated, Cinelerra-3 introduces a //focus// for selecting the //current EDL,// which will receive all editing operations.
          +
          +!!!the definitive state
          +With all the structural complexities possible within such a session, we need an isolation layer to provide __one__ definitive state where all configuration has been made explicit. Thus the session manages one special object list, the [[Fixture]], which can be seen as all currently active object placed onto a single timeline.
          +
          +
          <<search>><<closeAll>><<permaview>><<newTiddler>><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "options ยป" "Change TiddlyWiki advanced options">>
          From fadd31282f5f75506e0a0687754d074f00d1bd89 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Thu, 27 Sep 2007 23:26:54 +0200 Subject: [PATCH 14/14] implement access to current session. add lots of UNIMPLEMENTED stubs and finally get the sourcebase through the compiler.... --- src/proc/mobject/mobject.hpp | 14 +- src/proc/mobject/placement.cpp | 15 ++ src/proc/mobject/placement.hpp | 4 +- src/proc/mobject/session.hpp | 145 ++++++++++++++++++ src/proc/mobject/session/abstractmo.hpp | 14 +- src/proc/mobject/session/edl.cpp | 18 ++- src/proc/mobject/session/edl.hpp | 25 ++- src/proc/mobject/session/fixture.cpp | 8 +- src/proc/mobject/session/fixture.hpp | 10 +- src/proc/mobject/session/session.cpp | 48 +++--- src/proc/mobject/session/session.hpp | 81 ---------- src/proc/mobject/session/sessionimpl.cpp | 84 +++++++++- src/proc/mobject/session/sessionimpl.hpp | 52 ++++++- src/proc/mobject/session/sessmanagerimpl.cpp | 114 ++++++++++++++ tests/51asset.tests | 12 +- tests/53session.tests | 8 + .../proc/asset/compoundmediatest.cpp | 5 +- .../components/proc/asset/deleteassettest.cpp | 1 + .../proc/asset/dependantassetstest.cpp | 1 + tests/components/proc/asset/makecliptest.cpp | 7 +- .../components/proc/engine/sourcenodetest.cpp | 1 + .../mobject/controller/rendersegmenttest.cpp | 1 + .../proc/mobject/session/addcliptest.cpp | 9 +- .../proc/mobject/session/deletecliptest.cpp | 20 ++- .../mobject/session/rebuildfixturetest.cpp | 23 +-- .../mobject/session/sessionmanagertest.cpp | 8 +- .../mobject/session/sessionstructuretest.cpp | 14 +- .../proc/mobject/session/testclip.cpp | 6 +- .../proc/mobject/session/testclip.hpp | 5 +- .../proc/mobject/session/testsession1.hpp | 11 +- 30 files changed, 591 insertions(+), 173 deletions(-) create mode 100644 src/proc/mobject/session.hpp delete mode 100644 src/proc/mobject/session/session.hpp create mode 100644 src/proc/mobject/session/sessmanagerimpl.cpp diff --git a/src/proc/mobject/mobject.hpp b/src/proc/mobject/mobject.hpp index a91dbe179..b670d1e47 100644 --- a/src/proc/mobject/mobject.hpp +++ b/src/proc/mobject/mobject.hpp @@ -29,11 +29,16 @@ #include "cinelerra.h" #include "proc/mobject/buildable.hpp" +#include "proc/asset.hpp" // TODO finally not needed? using std::list; using std::tr1::shared_ptr; +#include "proc/assetmanager.hpp" +using proc_interface::IDA; // TODO finally not needed? +using proc_interface::PAsset; //TODO: only temporarily +using proc_interface::AssetManager; namespace mobject { @@ -54,8 +59,13 @@ namespace mobject // TODO: how to represent time intervals best? Time length; - - list placement; + + virtual ~MObject() {}; + + public: + virtual shared_ptr& getPlacement () =0; + virtual PAsset getMedia () =0; ///< @todo solve the reference/Interface problem concerning Placements, then push down + virtual Time& getLength() =0; ///< @todo how to deal with the time/length field?? }; diff --git a/src/proc/mobject/placement.cpp b/src/proc/mobject/placement.cpp index eccd34e80..a887eb771 100644 --- a/src/proc/mobject/placement.cpp +++ b/src/proc/mobject/placement.cpp @@ -28,6 +28,9 @@ namespace mobject { + /** factory for creating the corretct Placement subclass */ + PlacementFactory Placement::create; + /** create an actual (explicit) placement while trying to * satisfy the network of adjacent objects and placements. @@ -37,6 +40,18 @@ namespace mobject Placement::resolve () { } + + + + /** implements the logic for selecting the correct + * Placement subclass. + * @return smart ptr owning the created placement object + */ + PlacementFactory::PType + PlacementFactory::operator() (Placement::Style, Time, PMO subject) + { + UNIMPLEMENTED ("create correct Placement subclass"); + } diff --git a/src/proc/mobject/placement.hpp b/src/proc/mobject/placement.hpp index 726379ffb..1293b9745 100644 --- a/src/proc/mobject/placement.hpp +++ b/src/proc/mobject/placement.hpp @@ -45,10 +45,10 @@ namespace mobject typedef cinelerra::Time Time; typedef session::Track Track; - MObject* subject; - public: + MObject* subject; + /** * styles of placement. */ diff --git a/src/proc/mobject/session.hpp b/src/proc/mobject/session.hpp new file mode 100644 index 000000000..b83affe14 --- /dev/null +++ b/src/proc/mobject/session.hpp @@ -0,0 +1,145 @@ +/* + SESSION.hpp - holds the complete session to be edited by the user + + 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. + +*/ + + +/** @file session.hpp + ** Primary Interface to the current Session. + ** The Interface Session is abstract and only accessible via the + ** static field Session::current, which actually refers to a SessManager + ** singleton instance. The latter acts as smart ptr-to-Impl. + ** + */ + + +#ifndef MOBJECT_SESSION_H +#define MOBJECT_SESSION_H + +#include "proc/mobject/placement.hpp" +#include "common/singleton.hpp" + +#include +#include + + + +namespace mobject + { + namespace session + { + class SessManager; + class EDL; + class Fixture; + typedef std::tr1::shared_ptr PFix; + } + + typedef session::SessManager& PSess; ///< acts as a "PImpl" smart ptr + + + /** + * The (current) Session holds all the user + * visible content to be edited and manipulated + * within the Cinelerra Application. From a users + * perspective, it is a collection of Media Objects + * (--> MObject) placed (--> Placement) onto virtual + * Tracks. + * + * Opening a Session has effectively global consequences, + * because the Session defines the available Assets, and some + * kinds of Assets define default behaviour. Thus, access to + * the Session is similar to a Singleton instance. + * + * @note Any client should be aware that the Session can be closed, + * replaced and loaded. The only way to accees the Session is + * via a "PImpl" smart pointer session::PSess (which indeed is + * a reference to the SessManager and is accessible as the static + * field Session::current). You will never be able to get a direct + * pointer or reference to the Session object. + * + */ + class Session : private boost::noncopyable + { + protected: + Session () throw(); + virtual ~Session () = 0; + + public: + static session::SessManager& current; + + virtual bool isValid () = 0; + virtual void add (PPla& placement) = 0; + virtual bool remove (PPla& placement) = 0; + + /// @deprecated Ichthyo doubts it is good design to hand out the EDL?? + virtual session::EDL& currEDL () = 0; + + virtual session::PFix& getFixture () = 0; + virtual void rebuildFixture () = 0; + + }; + + + namespace session + { + + /** + * creation, access and Session lifecycle Interface. + * An instance is accessible via Session::current + */ + class SessManager : private boost::noncopyable + { + public: + /** clear current session contents + * without resetting overall session config. + * Afterwards, the session will contain only one + * empty EDL, while all Assets are retained. + */ + virtual void clear () =0; + + /** reset all session config and + * start with a pristine default session. + */ + virtual void reset () =0; + + /** replace the current session by a new + * session loaded from serialized state. + */ + virtual void load () =0; + + /** create a complete, serialized representation + * of the current session config and contents. + * @todo how to serialize, prameters, return value? + */ + virtual void save () =0; + + /** access to the current session object instance. + * This is the sole access path available for clients. + * @note there is no operator* + */ + virtual Session* operator-> () throw() =0; + + virtual ~SessManager() {}; + }; + + } // namespace mobject::session + +} // namespace mobject +#endif diff --git a/src/proc/mobject/session/abstractmo.hpp b/src/proc/mobject/session/abstractmo.hpp index 560e4e7b6..3ea6da648 100644 --- a/src/proc/mobject/session/abstractmo.hpp +++ b/src/proc/mobject/session/abstractmo.hpp @@ -37,7 +37,19 @@ namespace mobject class AbstractMO : public MObject { ////////////// TODO: work out common services to provide!!!! - }; + shared_ptr placement_; + + public: + /* some dummy implementations used to make the code compile... */ + + virtual shared_ptr& getPlacement () { return placement_; } + virtual Time& getLength() { return length; } + virtual PAsset getMedia () + { + UNIMPLEMENTED ("how to relate MObjects and media assets..."); + return AssetManager::instance().getAsset(IDA(0)); // KABOOM! (just to make it compile) + } + }; diff --git a/src/proc/mobject/session/edl.cpp b/src/proc/mobject/session/edl.cpp index 8fc76bb0c..4b577e059 100644 --- a/src/proc/mobject/session/edl.cpp +++ b/src/proc/mobject/session/edl.cpp @@ -23,6 +23,7 @@ #include "proc/mobject/session/edl.hpp" #include "proc/mobject/session/track.hpp" +#include "proc/mobject/placement.hpp" #include "proc/mobject/mobject.hpp" namespace mobject @@ -30,7 +31,22 @@ namespace mobject namespace session { - /** */ + /** @deprecated not sure if it is a good idea + * to have this on the interface + */ + bool + EDL::contains (const PPla& placement) + { + UNIMPLEMENTED ("test if a given placement is contained within this EDL"); + } + + + PPla& + EDL::find (const string& id) + { + UNIMPLEMENTED ("serch for a given 'thing' within the EDL"); + } + diff --git a/src/proc/mobject/session/edl.hpp b/src/proc/mobject/session/edl.hpp index 31b0319a4..24a7a136f 100644 --- a/src/proc/mobject/session/edl.hpp +++ b/src/proc/mobject/session/edl.hpp @@ -24,26 +24,39 @@ #ifndef MOBJECT_SESSION_EDL_H #define MOBJECT_SESSION_EDL_H -#include +#include +#include #include "proc/mobject/mobject.hpp" -#include "proc/mobject/session/track.hpp" +#include "proc/mobject/placement.hpp" +#include "proc/asset/track.hpp" +using proc_interface::PAsset; // TODO better methot to refer to a track? -using std::list; +using std::vector; +using std::string; namespace mobject { namespace session { - class EDL { protected: - list tracks; - list clips; + vector tracks; + vector clips; + public: + bool contains (const PPla& placement); + PPla& find (const string& id); ///< @todo how to refer to clips? using asset IDs?? + + vector& getTracks () { return tracks; } ///< @todo use track assets correct, make const! + size_t size () + { + UNIMPLEMENTED ("what ist the 'size' of an EDL?"); + return 0; + } }; diff --git a/src/proc/mobject/session/fixture.cpp b/src/proc/mobject/session/fixture.cpp index 73fa72e7e..ed1682168 100644 --- a/src/proc/mobject/session/fixture.cpp +++ b/src/proc/mobject/session/fixture.cpp @@ -1,5 +1,5 @@ /* - Fixture - the (low level) representation of the EDL with concrete placement data + Fixture - the (low level) representation of the EDL with explicit placement data Copyright (C) CinelerraCV 2007, Christian Thaeter @@ -22,6 +22,7 @@ #include "proc/mobject/session/fixture.hpp" +#include "nobugcfg.h" namespace mobject { @@ -33,7 +34,7 @@ namespace mobject list & Fixture::getPlaylistForRender () { - abort();/////////////////////TODO + UNIMPLEMENTED ("get Playlist For Render"); } @@ -43,7 +44,8 @@ namespace mobject Auto* Fixture::getAutomation () { - return 0;/////////////////////TODO + UNIMPLEMENTED ("getAutomation from Fixture"); + return 0; } diff --git a/src/proc/mobject/session/fixture.hpp b/src/proc/mobject/session/fixture.hpp index eebdc87af..4467abd8b 100644 --- a/src/proc/mobject/session/fixture.hpp +++ b/src/proc/mobject/session/fixture.hpp @@ -1,5 +1,5 @@ /* - FIXTURE.hpp - the (low level) representation of the EDL with concrete placement data + FIXTURE.hpp - the (low level) representation of the EDL with explicit placement data Copyright (C) CinelerraCV 2007, Christian Thaeter @@ -25,6 +25,7 @@ #define MOBJECT_SESSION_FIXTURE_H #include +#include #include "proc/mobject/session/edl.hpp" #include "proc/mobject/session/track.hpp" @@ -33,6 +34,7 @@ using std::list; +using std::tr1::shared_ptr; @@ -52,8 +54,12 @@ namespace mobject public: list & getPlaylistForRender () ; - Auto* getAutomation () ; /////TODO: just a placeholder at the moment!!! + Auto* getAutomation () ; ///< @todo: just a placeholder at the moment!!! }; + + + + typedef shared_ptr PFix; diff --git a/src/proc/mobject/session/session.cpp b/src/proc/mobject/session/session.cpp index e926c72ad..136347bf5 100644 --- a/src/proc/mobject/session/session.cpp +++ b/src/proc/mobject/session/session.cpp @@ -21,36 +21,46 @@ * *****************************************************/ -#include "proc/mobject/session/session.hpp" -#include "proc/mobject/session/edl.hpp" -#include "proc/mobject/session/fixture.hpp" +/** @file session.cpp + ** Actual connection between the Session interface and its Implementation. + ** Holds the storage for the SessionManager implementation (singleton) + ** + ** @see session::SessionImpl + ** @see session::SessionManagerImpl + ** + */ + + +#include "proc/mobject/session.hpp" +#include "proc/mobject/session/sessionimpl.hpp" + +#include "common/singleton.hpp" using cinelerra::Singleton; +using mobject::session::SessManager; +using mobject::session::SessManagerImpl; namespace mobject { - namespace session - { - /** @return the system-wide current session. - * Implemented as singleton. - */ - Singleton Session::getCurrent; + /** the sole acces point for all client code to the system-wide + * "current session". Implemented as smart pointer to singleton + * implementation object, where the smart pointer is actually + * the SessionManager (which is singleton as well...). + * + * Consequently, if you want to talk to the session manager, + * you use dot-notation, while you access the session object + * via arrow notaion (e.g. \code Session::current->getFixture() ) + */ + SessManager& Session::current = Singleton()(); + - /** create a new empty session with default values. - */ - Session::Session () - : edl(), - fixture() - { - - } + Session::Session () throw() { } + Session::~Session () { } - } // namespace mobject::session - } // namespace mobject diff --git a/src/proc/mobject/session/session.hpp b/src/proc/mobject/session/session.hpp deleted file mode 100644 index f17ea1b00..000000000 --- a/src/proc/mobject/session/session.hpp +++ /dev/null @@ -1,81 +0,0 @@ -/* - SESSION.hpp - holds the complete session to be edited by the user - - 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_SESSION_H -#define MOBJECT_SESSION_SESSION_H - -#include "common/singleton.hpp" -#include "proc/mobject/placement.hpp" - -#include - - - -namespace mobject - { - namespace session - { - - class EDL; - class Fixture; - - /** - * The (current) Session holds all the user - * visible content to be edited and manipulated - * within the Cinelerra Application. From a users - * perspective, it is a collection of Media Objects - * (--> MObject) placed (--> Placement) onto virtual - * Tracks. - * - * Opening a Session has effectively global consequences, - * because the Session defines the available Assets, and some - * kinds of Assets define default behaviour. Thus, access to - * the Session is similar to a Singleton instance. - * - */ - class Session : private boost::noncopyable - { - protected: - vector edls; - Fixture fixture; - - Session (); - friend class cinelerra::singleton::StaticCreate; //TODO use PImpl or just covariance?? - - public: - static cinelerra::Singleton getCurrent; - - void add (PPla placement); - - - EDL& currEDL () { return edl; } - Fixture& getFixture () { return fixture; } - - }; - - - - } // namespace mobject::session - -} // namespace mobject -#endif diff --git a/src/proc/mobject/session/sessionimpl.cpp b/src/proc/mobject/session/sessionimpl.cpp index d8a946002..056732116 100644 --- a/src/proc/mobject/session/sessionimpl.cpp +++ b/src/proc/mobject/session/sessionimpl.cpp @@ -22,16 +22,92 @@ #include "proc/mobject/session/sessionimpl.hpp" -#include "proc/mobject/session/edl.hpp" -#include "proc/mobject/session/fixture.hpp" +#include "proc/mobject/placement.hpp" +#include "common/error.hpp" namespace mobject { - namespace session { - /** */ + /** create a new empty session with default values. + * @note any exception arising while creating this + * default session will inevitably halt the + * system (and this is desirable) + */ + SessionImpl::SessionImpl () throw() + : Session(), + focusEDL_(0), + edls(1), + fixture(new Fixture) + { + } + + + /** @internal used by SessionManager#clear + * discard all EDL content, without + * touching global configuration. + */ + void + SessionImpl::clear () + { + try + { + edls.clear(); + edls.resize(1); + focusEDL_ = 0; + } + catch (...) + { + focusEDL_ = 0; + throw cinelerra::error::Fatal ("unexpected exception while clearing EDLs"); + } + } + + + bool + SessionImpl::isValid () + { + UNIMPLEMENTED ("session self test"); + return false; // TODO + } + + + void + SessionImpl::add (PPla& placement) + { + UNIMPLEMENTED ("add Placement to the current EDL"); + } + + + bool + SessionImpl::remove (PPla& placement) + { + UNIMPLEMENTED ("search and remove a given Placement from current EDL"); + return false; // TODO + } + + /// @deprecated should not grant direct access to EDL objects + EDL& + SessionImpl::currEDL () + { + ASSERT (focusEDL_ < edls.size()); + return edls[focusEDL_]; + } + + + PFix& + SessionImpl::getFixture () + { + return fixture; + } + + + void + SessionImpl::rebuildFixture () + { + UNIMPLEMENTED ("rebuild Fixture"); + } diff --git a/src/proc/mobject/session/sessionimpl.hpp b/src/proc/mobject/session/sessionimpl.hpp index 5f4aedb1c..658f5d56a 100644 --- a/src/proc/mobject/session/sessionimpl.hpp +++ b/src/proc/mobject/session/sessionimpl.hpp @@ -21,13 +21,21 @@ */ +/** @file sessionimpl.hpp + ** Session and SessionManager Implemention classes. + ** These are primary Interfaces and we hide all implementaion complexities, + ** + */ + + #ifndef MOBJECT_SESSION_SESSIONIMPL_H #define MOBJECT_SESSION_SESSIONIMPL_H -#include "proc/mobject/session/session.hpp" +#include "proc/mobject/session.hpp" #include "proc/mobject/session/edl.hpp" #include "proc/mobject/session/fixture.hpp" +#include #include using std::vector; @@ -46,18 +54,48 @@ namespace mobject class SessionImpl : public mobject::Session { protected: + uint focusEDL_; vector edls; - Fixture fixture; + PFix fixture; - SessionImpl (); - friend class cinelerra::singleton::StaticCreate; + SessionImpl () throw(); + friend class SessManagerImpl; - void add (PPla placement); + void clear (); - EDL& currEDL () { return edl; } - Fixture& getFixture () { return fixture; } + public: + virtual bool isValid (); + virtual void add (PPla& placement); + virtual bool remove (PPla& placement); + + virtual EDL& currEDL (); + + virtual PFix& getFixture (); + virtual void rebuildFixture (); }; + + + /** + * Session manager implementation class holding the + * actual smart pointer to the current Session impl. + */ + class SessManagerImpl : public SessManager + { + boost::scoped_ptr pImpl_; + + SessManagerImpl() throw(); + friend class cinelerra::singleton::StaticCreate; + + public: + virtual void clear () ; + virtual void reset () ; + virtual void load () ; + virtual void save () ; + virtual Session* operator-> () throw() { return pImpl_.get(); } + }; + + } // namespace mobject::session diff --git a/src/proc/mobject/session/sessmanagerimpl.cpp b/src/proc/mobject/session/sessmanagerimpl.cpp new file mode 100644 index 000000000..85998b8c6 --- /dev/null +++ b/src/proc/mobject/session/sessmanagerimpl.cpp @@ -0,0 +1,114 @@ +/* + SessManagerImpl - global session access and lifecycle + + 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. + +* *****************************************************/ + + +/** @file sessmanagerimpl.cpp + ** Implemention of the Session management functions. + ** The Class SessManager is declared alongside with mobject::Session, + ** because it serves as smart ptr-to-Impl at the same time. Effectively, + ** the session manager owns the current session object and only grants + ** access via his overloaded operator->() . Because there is no operator*(), + ** no one can get at the address of the current session object. (correct?) + ** + ** @see sessionimpl.hpp + ** @see mobject::Session#current + ** @see mobject::session::SessionManager_test + ** + */ + + +#include "proc/mobject/session.hpp" +#include "proc/mobject/session/sessionimpl.hpp" + +using boost::scoped_ptr; + + + +namespace mobject + { + namespace session + { + + /** Besides creating the single system-wide Session manger instance, + * creates an empty default Session as well. + * @note any exceptions arising in the course of this will halt + * the system (and this behaviour is desirable). + */ + SessManagerImpl::SessManagerImpl () throw() + : pImpl_ (new SessionImpl) + { + } + + /** @note no transactional behaviour. + * may succeed partial. + */ + void + SessManagerImpl::clear () + { + pImpl_->clear(); + } + + + /** @note this operation is atomic and either succeeds or + * failes completely, in which case the current session + * remains unaltered. + * @todo for this to work, we need to change the implementation of + * AssetManager so support this kind of transactional switch! + */ + void + SessManagerImpl::reset () + { + scoped_ptr tmp (new SessionImpl); + + TODO ("reset the assets registered with AssetManager"); + // Ichthyo-intern: ticket #95 + + pImpl_.swap (tmp); + } + + + void + SessManagerImpl::load () + { + UNIMPLEMENTED ("load serialized session"); + } + + + /** \par Implementation details + * We intend to have several switchable object serialisers. + * One of these serializers should genarate a comprehensible + * text based representation suitable for checking into + * SCM systems. + * Sessions can be saved into one single file or be splitted + * to several files (master file and edl files) + */ + void + SessManagerImpl::save () + { + UNIMPLEMENTED ("save session (serialized)"); + } + + + + } // namespace mobject::session + +} // namespace mobject diff --git a/tests/51asset.tests b/tests/51asset.tests index f13edb706..e105623eb 100644 --- a/tests/51asset.tests +++ b/tests/51asset.tests @@ -11,12 +11,12 @@ return: 0 END -TEST "CreateAsset_test" CreateAsset_test <createClip(); - PM cm = cc->getMedia(); + PM cm = static_pointer_cast (cc->getMedia()); //TODO: solve the reference/interface Problem on MObject, push down to Clip... ASSERT (cm); - ASSERT (0 < cc->length); + ASSERT (0 < cc->getLength()); ASSERT (cm->ident.category.hasKind (VIDEO)); ASSERT (cm->getFilename() == mm->getFilename()); ASSERT (cm->howtoProc() == mm->howtoProc()); @@ -79,7 +80,7 @@ namespace asset return (0 < clip->getParents().size()) && (media == clip->getParents()[0]) - && (contains (media->getDependant(), clip)); +// && (contains (media->getDependant(), clip)); //TODO implement Asset dependecies ; } diff --git a/tests/components/proc/engine/sourcenodetest.cpp b/tests/components/proc/engine/sourcenodetest.cpp index e7fab2279..9bbe30f30 100644 --- a/tests/components/proc/engine/sourcenodetest.cpp +++ b/tests/components/proc/engine/sourcenodetest.cpp @@ -48,6 +48,7 @@ namespace engine { virtual void run(Arg arg) { + UNIMPLEMENTED ("render node pulling source data from backend"); } }; diff --git a/tests/components/proc/mobject/controller/rendersegmenttest.cpp b/tests/components/proc/mobject/controller/rendersegmenttest.cpp index 5ef4064f1..c0ca3259d 100644 --- a/tests/components/proc/mobject/controller/rendersegmenttest.cpp +++ b/tests/components/proc/mobject/controller/rendersegmenttest.cpp @@ -57,6 +57,7 @@ namespace mobject { virtual void run(Arg arg) { + UNIMPLEMENTED ("complete render process for a given test segment of the EDL"); } }; diff --git a/tests/components/proc/mobject/session/addcliptest.cpp b/tests/components/proc/mobject/session/addcliptest.cpp index 6d2d0c7f0..a88b36db9 100644 --- a/tests/components/proc/mobject/session/addcliptest.cpp +++ b/tests/components/proc/mobject/session/addcliptest.cpp @@ -22,7 +22,8 @@ #include "common/test/run.hpp" -#include "proc/mobject/session/session.hpp" +#include "proc/mobject/session.hpp" +#include "proc/mobject/session/edl.hpp" #include "proc/mobject/session/testclip.hpp" #include "proc/mobject/placement.hpp" #include "common/util.hpp" @@ -56,12 +57,12 @@ namespace mobject { virtual void run(Arg arg) { - Session& sess = Session::getCurrent(); + PSess sess = Session::current; PMO clip = TestClip::create(); PPla pla = Placement::create(Placement::FIXED, Time(1), clip); - sess.add (pla); + sess->add (pla); - ASSERT (contains (sess.getEDL(), pla)); + ASSERT (sess->currEDL().contains (pla)); // TODO: Clip-Asset and Placement magic?? } }; diff --git a/tests/components/proc/mobject/session/deletecliptest.cpp b/tests/components/proc/mobject/session/deletecliptest.cpp index 167ef2577..0275992b0 100644 --- a/tests/components/proc/mobject/session/deletecliptest.cpp +++ b/tests/components/proc/mobject/session/deletecliptest.cpp @@ -23,7 +23,8 @@ #include "common/test/run.hpp" #include "proc/assetmanager.hpp" -#include "proc/mobject/session/session.hpp" +#include "proc/mobject/session.hpp" +#include "proc/mobject/session/edl.hpp" // TODO: really neded? #include "proc/mobject/session/testsession1.hpp" //#include "common/util.hpp" @@ -34,6 +35,9 @@ using std::string; using std::cout; +using proc_interface::AssetManager; +using proc_interface::PAsset; +using proc_interface::IDA; namespace mobject { @@ -55,19 +59,19 @@ namespace mobject virtual void run(Arg arg) { buildTestseesion1(); - Session& sess = Session::getCurrent(); + PSess sess = Session::current; AssetManager& aMang = AssetManager::instance(); - PPla clipPlacement = sess.getEDL().find(SESSION1_CLIP); // global Var asigned in buildTestsession1() - PAsset clipAsset = aMang.getAsset(clipPlacement->subject->getMedia()); + PPla clipPlacement = sess->currEDL().find(SESSION1_CLIP); // global Var asigned in buildTestsession1() + PAsset clipAsset = clipPlacement->subject->getMedia(); IDA clipAID = clipAsset->getID(); ASSERT (clipPlacement); - sess.remove (clipPlacement); + sess->remove (clipPlacement); - ASSERT (!sess.getEDL().find(SESSION1_CLIP)); // EDL forgot the Clip/Placement - ASSERT (!aMang.known (clipAID)); // corresponding Clip Asset has disappeared - ASSERT (!aMang.getAsset(clipPlacement->subject->getMedia())); // internal cross-links removed + ASSERT (!sess->currEDL().find(SESSION1_CLIP)); // EDL forgot the Clip/Placement + ASSERT (!aMang.known (clipAID)); // corresponding Clip Asset has disappeared + ASSERT (!clipPlacement->subject->getMedia()); // internal cross-links removed } }; diff --git a/tests/components/proc/mobject/session/rebuildfixturetest.cpp b/tests/components/proc/mobject/session/rebuildfixturetest.cpp index 7af4be5e7..62c77fe11 100644 --- a/tests/components/proc/mobject/session/rebuildfixturetest.cpp +++ b/tests/components/proc/mobject/session/rebuildfixturetest.cpp @@ -22,7 +22,8 @@ #include "common/test/run.hpp" -#include "proc/mobject/session/session.hpp" +#include "proc/mobject/session.hpp" +#include "proc/mobject/session/edl.hpp" #include "proc/mobject/session/testsession1.hpp" #include "common/util.hpp" @@ -58,16 +59,18 @@ namespace mobject { virtual void run(Arg arg) { - clearSession(); + PSess sess = Session::current; + sess.clear(); buildTestseesion1(); - Session& sess = Session::getCurrent(); - ASSERT (sess.isValid()); - sess.rebuildFixture(); + ASSERT (sess->isValid()); + sess->rebuildFixture(); TODO ("check the fixture has been touched. e.g. by hash."); TODO ("query all Placements of all Clips (via AssetManager). Verify explicit plac contained in Fixture."); - - for_each (sess.getFixture(), - bind (&check_is_from_EDL, _1, sess.getEDL())); + + UNIMPLEMENTED ("iterate over fixture"); +// TODO +// for_each (sess->getFixture(), +// bind (&check_is_from_EDL, _1, sess.getEDL())); TODO ("can we check the other direction, from EDL to Fixture??"); } @@ -75,8 +78,8 @@ namespace mobject static void check_is_from_EDL (PPla explicitPlacement, EDL& edl) { - PPla originalPlacement = explicitPlacement->subject->placement; - ASSERT (contains(edl, originalPlacement)); + PPla originalPlacement = explicitPlacement->subject->getPlacement(); + ASSERT (edl.contains(originalPlacement)); } }; diff --git a/tests/components/proc/mobject/session/sessionmanagertest.cpp b/tests/components/proc/mobject/session/sessionmanagertest.cpp index f6f8169e4..db42c9703 100644 --- a/tests/components/proc/mobject/session/sessionmanagertest.cpp +++ b/tests/components/proc/mobject/session/sessionmanagertest.cpp @@ -22,7 +22,7 @@ #include "common/test/run.hpp" -#include "proc/mobject/session/session.hpp" +#include "proc/mobject/session.hpp" #include "proc/mobject/session/testsession1.hpp" //#include "common/util.hpp" //#include @@ -68,8 +68,8 @@ namespace mobject */ void getCurrentSession () { - Session& sess = Session::getCurrent(); - ASSERT (sess.isValid()); + PSess sess = Session::current; + ASSERT (sess->isValid()); } /** @test clear current session contents @@ -80,6 +80,7 @@ namespace mobject void clearSession () { UNIMPLEMENTED ("clear objects in current session"); + Session::current.clear(); } /** @test reset global session config and start with @@ -89,6 +90,7 @@ namespace mobject void resetSession () { UNIMPLEMENTED ("construct a pristine session"); + Session::current.reset(); } /** @test use a mock session serializer to load diff --git a/tests/components/proc/mobject/session/sessionstructuretest.cpp b/tests/components/proc/mobject/session/sessionstructuretest.cpp index 18ee496e0..d2bbe5477 100644 --- a/tests/components/proc/mobject/session/sessionstructuretest.cpp +++ b/tests/components/proc/mobject/session/sessionstructuretest.cpp @@ -22,7 +22,9 @@ #include "common/test/run.hpp" -#include "proc/mobject/session/session.hpp" +#include "proc/mobject/session.hpp" +#include "proc/mobject/session/edl.hpp" // TODO only temporarily needed +#include "proc/mobject/session/fixture.hpp" // TODO only temporarily needed #include "proc/assetmanager.hpp" //#include "common/util.hpp" //#include @@ -55,12 +57,12 @@ namespace mobject { virtual void run(Arg arg) { - Session& sess = Session::getCurrent(); - ASSERT (0 <= sess.getEDL().size()); // TODO implement - ASSERT (0 <= sess.getFixture().size()); // TODO implement - ASSERT (0 < sess.getTracks().size()); // TODO implement + PSess sess = Session::current; + ASSERT (0 <= sess->currEDL().size()); // TODO implement + ASSERT (0 <= sess->getFixture()->size()); // TODO implement + ASSERT (0 < sess->currEDL().getTracks().size()); // TODO implement - PAsset track = sess.getTracks()[0]; + PAsset track = sess->currEDL().getTracks()[0]; AssetManager& aMang = AssetManager::instance(); ASSERT (track == aMang.getAsset (track->getID())); } diff --git a/tests/components/proc/mobject/session/testclip.cpp b/tests/components/proc/mobject/session/testclip.cpp index fb33be2ec..0fefffad8 100644 --- a/tests/components/proc/mobject/session/testclip.cpp +++ b/tests/components/proc/mobject/session/testclip.cpp @@ -22,6 +22,8 @@ #include "proc/mobject/session/testclip.hpp" +#include "backend/mediaaccessfacade.hpp" +#include "backend/mediaaccessmock.hpp" #include "proc/asset/media.hpp" #include "proc/asset/clip.hpp" @@ -33,7 +35,9 @@ namespace mobject { typedef shared_ptr PC; typedef shared_ptr PM; - typedef MediaAccessFacade MAF; + typedef backend_interface::MediaAccessFacade MAF; + using backend_interface::test::MediaAccessMock; + using asset::VIDEO; /** @todo find a way to link to an existing clip object. diff --git a/tests/components/proc/mobject/session/testclip.hpp b/tests/components/proc/mobject/session/testclip.hpp index 3128a623d..39ed7df17 100644 --- a/tests/components/proc/mobject/session/testclip.hpp +++ b/tests/components/proc/mobject/session/testclip.hpp @@ -27,8 +27,11 @@ #include "common/test/run.hpp" #include "common/factory.hpp" + +#include "proc/mobject/session/clip.hpp" //#include "common/util.hpp" + //#include #include @@ -51,7 +54,7 @@ namespace mobject * Can be used as Mock object to record invoked operations. * */ - class TestClip ////TODO inherit from mobject::session::Clip + class TestClip : public mobject::session::Clip /////////////TODO how this???? { /** smart ptr factory allowed to invoke TestClip's ctor */ diff --git a/tests/components/proc/mobject/session/testsession1.hpp b/tests/components/proc/mobject/session/testsession1.hpp index 97a93719f..3e6ad3d25 100644 --- a/tests/components/proc/mobject/session/testsession1.hpp +++ b/tests/components/proc/mobject/session/testsession1.hpp @@ -25,7 +25,7 @@ #define MOBJECT_SESSION_TESTSESSION_H -#include "proc/mobject/session/session.hpp" +#include "proc/mobject/session.hpp" #include "common/error.hpp" //#include "common/factory.hpp" //#include "common/util.hpp" @@ -49,7 +49,8 @@ namespace mobject * in the UML design. All changes are done to the (global) * current session. */ - void buildTestseesion1 () + inline void + buildTestseesion1 () { UNIMPLEMENTED ("Test-Session 1"); }; @@ -59,13 +60,15 @@ namespace mobject * Analyze the current (gloal) Session to verify the * configuration of "Test-Session 1" */ - bool checkTestseesion1 () + inline bool + checkTestsession1 () { UNIMPLEMENTED ("Test-Session 1"); return false; }; - + + const string SESSION1_CLIP("TODO: some sensible way to refer to a clip"); } // namespace session
          PropertyClassDescription
          categoryAssetprimary tree like classification of the asset
          currentSessionStandard access path to get at the current session via the Session Manager, which acts as a "PImpl" smart pointer
          idAssetAsset primary key.
          nameAssetelement ID, comprehensible but sanitized. The tuple (category, name, org) is unique.
          nodesDoAttach