]> git.sesse.net Git - mlt/blobdiff - docs/westley.txt
minor typo fix
[mlt] / docs / westley.txt
index 89e59288d82cc7768e8a3bf5cf84105d08ee03b0..1f42538d091be2e2d0558128eef7fa07b1573a63 100644 (file)
@@ -1,10 +1,22 @@
+Westley Documentation
+
+Copyright (C) 2004 Ushodaya Enterprised Limited
+Authors: Charles Yates <charles.yates@pandora.be>
+Last Revision: 2004-03-20
+
+
 WESTLEY
 -------
 
 Preamble:
 
        Westley is the MLT projects XML serialisation/deserialisation format -
-       as such, it closely mirrors the internal structure of the MLT API. 
+       as such, it closely mirrors the internal structure of the MLT API.
+
+       If you just want to go straight to the DTD, then see 
+       mlt/src/modules/westley/westley.dtd, which gets installed at 
+       $(prefix)/share/mlt/modules/westley.dtd. Currently, the westley parser is
+       non-validating.
 
 
 Introduction:
@@ -173,9 +185,6 @@ Interlude - Introducing Multitracks:
        appear to be an exception - it isn't - it simply has a route back to the 
        application to allow the application to interpret key presses).
 
-       Whether this is better or worse than a traditional graph approach is a moot
-       point. The author of this document likes it anyway :-).
-
 
 Tractors:
 
@@ -231,9 +240,10 @@ Tractors:
        
        Note that it's only applied to the visible parts of the top track.
 
-       The requirement to apply a filter to the output, as opposed to a specific track 
-       leads us to the final item in the Rules section above. As an example, let's
-       assume we wish to watermark all output, then we could use the following:
+       The requirement to apply a filter to the output, as opposed to a specific 
+       track leads us to the final item in the Rules section above. As an example, 
+       let's assume we wish to watermark all output, then we could use the 
+       following:
 
        <westley>
          <producer id="producer0">
@@ -278,4 +288,287 @@ Tractors:
        be better handled at the playout stage itself (ie: as a filter automatically
        placed between all producers and the consumer).
 
-       TODO: transition example
+       Tracks act like "layers" in an image processing program like the GIMP. The 
+       bottom-most track takes highest priority and higher layers are overlays 
+       and do not appear unless there are gaps in the lower layers or unless
+       a transition is applied that merges the tracks on the specifed region.
+       Practically speaking, for A/B video editing it does not mean too much, 
+       and it will work as expected; however, as a general rule apply any CGI
+       (graphic overlays with pixbuf or titles with pango) on tracks higher than
+       your video tracks. Also, this means that any audio-only tracks that are
+       lower than your video tracks will play rather than the audio from the video
+       clip. Remember, nothing is affected like mixing or compositing until one
+       applies a transition or appropriate filter.
+       
+       <westley>
+         <producer id="producer0">
+           <property name="resource">clip1.dv</property>
+         </producer>
+         <playlist id="playlist0">
+           <entry producer="producer0"/>
+         </playlist>
+         <producer id="producer1">
+           <property name="resource">clip2.mpeg</property>
+         </producer>
+         <playlist id="playlist1">
+           <blank length="50"/>
+           <entry producer="producer1"/>
+         </playlist>
+         <tractor id="tractor0" in="0" out="315">
+           <multitrack id="multitrack0">
+             <track producer="playlist0"/>
+             <track producer="playlist1"/>
+           </multitrack>
+           <transition id="transition0" in="50" out="74">
+             <property name="a_track">0</property>
+             <property name="b_track">1</property>
+             <property name="mlt_service">luma</property>
+           </transition>
+           <transition id="transition1" in="50" out="74">
+             <property name="a_track">0</property>
+             <property name="b_track">1</property>
+             <property name="mlt_service">mix</property>
+             <property name="start">0.0</property>
+             <property name="end">1.0</property>
+           </transition>
+         </tractor>
+       </westley>
+
+       A "luma" transition is a video wipe processor that takes a greyscale bitmap
+       for the wipe definition. When one does not specify a bitmap, luma performs
+       a dissolve. The "mix" transition does an audio mix, but it interpolates
+       between the gain scaling factors between the start and end properties - 
+       in this example, from 0.0 (none of track B) to 1.0 (all of track B). 
+       Because the bottom track starts out with a gap specified using the <blank>
+       element, the upper track appears during the blank segment. See the demos and
+       services.txt to get an idea of the capabilities of the included transitions.
+
+Flexibility:
+
+       The information presented above is considered the MLT Westley "normal"
+       form. This is the output generated by the westley consumer, for example,
+       when used with inigo. It is the output generated when you use the
+       "Westley to File" consumer in the demo script, which beginners will find
+       most useful for learning to use westley XML. This section describes 
+       alternative forms the westley producer accepts.
+
+       First of all, the normal form is more of a linear format with producers
+       and playlists defined prior to their usage in a multitrack. Westley
+       also accepts a hierarchical format with producers as children of tracks
+       or playlist entries and with playlists as children of tracks:
+
+       <westley>
+         <tractor>
+           <multitrack>
+             <track>
+               <playlist>
+                 <entry>
+                   <producer>
+                     <property name="resource">clip1.dv</property>
+                   </producer>
+                 </entry>
+               </playlist>
+             </track>
+           </multitrack>
+         </tractor>
+       </westley>
+
+       Obviously, this example is meant to demonstrate hierarchy and not effective
+       use of playlist or multitrack!
+
+       Secondly, as part of error handling, westley is forgiving if you fail to
+       supply <tractor>, <track>, and <entry> where one can be understood. This
+       affords an abbreviated syntax that is less verbose and perhaps less 
+       intimidating for a human to read and understand. One can simplify the
+       above example as:
+
+       <westley>
+         <multitrack>
+           <playlist>
+             <producer>
+               <property name="resource">clip1.dv</property>
+             </producer>
+           </playlist>
+         </multitrack>
+       </westley>
+
+       Yes, filters and transitions can be added to the above example after the
+       closing multitrack tag (</multitrack>) because it is still enclosed within
+       the westley body tags.
+
+       If you specify in and out on a producer and it has been enclosed within
+       an <entry> or <playlist>, then the edit points apply to the playlist
+       entry and not to the producer itself. This facilitates re-use of media:
+
+       <playlist>
+         <producer id="clip1" in="25" out="78">
+           <property name="resource">clip1.dv</property>
+         </producer>
+         <entry producer="clip1" in="119" out="347"/>
+       </playlist>
+
+       In the above example, the producer attribute of the entry element is 
+       a reference to the preceding producer. All references must follow the 
+       definition. The edit points supplied on the producer above will not affect
+       the entry that references it below because westley knows the clip is a 
+       playlist entry and optimises this situation. The advantage is that one
+       does not need to determine every clip to be included ahead of time 
+       and specify them outside the context of the mutlitrack timeline.
+
+       This form of authoring will be easier for many to visualise as a non-linear 
+       editor's timeline. Here is a more complex example:
+
+       <westley>
+         <multitrack>
+           <playlist>
+             <producer id="foo" in="100" out="149">
+               <property name="resource">clip2.mpeg</property>
+             </producer>
+             <blank length="25"/>
+             <entry producer="foo" in="10" out="59"/>
+           </playlist>
+           <playlist>
+             <blank length="25"/>
+             <producer id="bar" in="100" out="199">
+               <property name="resource">clip3.mpeg</property>
+             </producer>
+             <entry out="99" producer="bar"/>
+           </playlist>
+         </multitrack>
+         <filter mlt_service="greyscale" track="0"/>
+         <transition mlt_service="luma" in="25" out="49" a_track="0" b_track="1"/>
+         <transition mlt_service="luma" in="75" out="99" a_track="0" b_track="1">
+           <property name="reverse" value="1"/>
+         </transition>
+       </westley>
+
+       Did you notice something different in the last example? Properties can be 
+       expressed using XML attributes on the element as well. However, only 
+       non-service-specific properties are supported in this way. For example,
+       "mlt_service" is available to any producer, filter, or transition. However,
+       "resource" is actually service-specific. Notice the syntax of the last 
+       property, on the last transition. Westley accepts property values using 
+       the "value" attribute as well as using element text.
+
+       We have seen a few different ways of expressing property values. There are
+       a couple more for properties that can accept XML data. For example, the
+       GDK pixbuf producer with librsvg can handle embedded SVG, and the Pango
+       producer can handle embedded Pango markup. You can enclose the embedded XML
+       using a CDATA section:
+
+       <property name="resource"><![CDATA[ <svg>...</svg> ]]></property>
+
+       Please ensure the opening CDATA tag immediately follows the opening
+       property tag and that the section closing tag immediately precedes the
+       closing property tag.
+
+       However, westley can also accept inline embedded XML:
+
+       <property name="resource">
+         <svg>
+         </svg>
+       </property>
+
+       Currently, there is no namespace handling so a conflict will occur only on 
+       any embedded XML that contains an element named "property" because 
+       westley collects embedded XML until it reaches a closing property tag.
+       
+       
+Entities and Parameterisation:
+       
+       The westley producer parser supports XML entities. An example:
+       
+       <?xml version="1.0"?>
+       <!DOCTYPE westley [
+           <!ENTITY msg "Hello world!">
+       ]>
+       <westley>
+         <producer id="producer0">
+           <property name="mlt_service">pango</property>
+           <property name="text">&msg;</property>
+         </producer>
+       </westley>
+       
+       If you are embedding another XML document into a property value not using
+       a CNODE section, then any DOCTYPE section must be relocated before any of
+       the xml elements to be well-formed. See demo/svg.westley for an example.
+       
+       Entities can be used to parameterise westley! Using the above example, the
+       entity declared serves as the default value for &msg;. The entity content
+       can be overridden from the resource property supplied to the westley
+       producer. The syntax is the familiar, url-encoded query string used with
+       HTTP, e.g.: file?name=value&name=value...
+       
+       There are a couple of rules of usage. The Miracle LOAD command and inigo
+       command line tool require you to preface the URL with "westley:" because
+       the query string destroys the filename extension matching peformed by
+       Fezzik. Also, inigo looks for '=' to tokenise property settings. Therefore, 
+       one uses ':' between name and value instead of '='. Finally, since inigo
+       is run from the shell, one must enclose the URL within single quotes to 
+       prevent shell filename expansion, or similar.
+       
+       Needless to say, the ability to parameterise westley XML compositions is
+       an extremely powerful tool. An example for you to play with is available in 
+       demo/entity.westley. Try overriding the name from inigo:
+       inigo 'westley:entity.westley?name:Charlie'
+       
+       Technically, the entity declaration is not needed in the head of the XML
+       document if you always supply the parameter. However, you run the risk
+       of unpredictable behviour without one. Therefore, it is safest and a best
+       practice to always supply an entity declaration. It is improves the 
+       readability as one does not need to search for the entity references to 
+       see what parameters are available.
+       
+
+Tips and Technique:
+
+       If one finds the above hierarchical, abbreviated format intuitive,
+       start with a simple template and fill and extend as needed:
+           <westley>
+             <multitrack>
+               <playlist>
+               </playlist>
+               ...add a playlist for each track...
+             </multitrack>
+             ...add filters and transitions...
+           </westley>
+           
+       By using a playlist for each track, it is easier to iteratively add new 
+       clips and blank regions as you develop the project. You will not have to
+       use <track> or later add <playlist> when necessary.
+       
+       A more advanced template that allows sequencing multitracks is:
+           <playlist>
+             <entry>
+               <multitrack>
+                 <playlist>
+                 </playlist>
+                 ...add a playlist for each track...
+               </multitrack>
+               ...add filters and transitions...
+             </entry>
+             
+             <entry>
+               <multitrack>
+                 <playlist>
+                 </playlist>
+                 ...add a playlist for each track...
+               </multitrack>
+               ...add filters and transitions...
+             </entry>
+           </playlist>
+
+       If you end up making a collection of templates for various situations, then
+       consider using XML Entities to make the template more effective by moving
+       anything that should parameterised into an entity.
+
+       If you want to have a silent, black background for audio and video fades,
+       then make the top track simply <producer mlt_service="colour"/>. Then,
+       use composite and volume effects. See the "Fade from/to black/silence"
+       demo for an example (demo/mlt_fade_black).
+       
+       If you apply the reverse=1 property to a transition like "luma," then
+       be careful because it also inherently swaps the roles of A and B tracks.
+       Therefore, you need to might need to swap the a_track and b_track values
+       if it did not turn out the way you expected. See the "Clock in and out"
+       for an example (demo/mlt_clock_in_and_out).