]> git.sesse.net Git - mlt/blob - docs/westley.txt
minor typos
[mlt] / docs / westley.txt
1 WESTLEY
2 -------
3
4 Preamble:
5
6         Westley is the MLT projects XML serialisation/deserialisation format -
7         as such, it closely mirrors the internal structure of the MLT API. 
8
9
10 Introduction:
11
12         A westley document is essentially a list of 'producers' - a producer is
13         an mlt object which generates mlt frames (images and associated audio
14         samples). 
15         
16         There are 3 types of producer:
17         
18         * Basic Producers - these are typically file or device oriented feeds; 
19         * Playlists - these are arrangements of multiple producers;
20         * Multitracks - these are the fx encapsulators.
21
22         In the mlt model, producers are created and attached to 'consumers' -
23         consumers are software playback components (such as SDL), or wrappers for
24         hardware drivers (such as bluefish) or even the westley serialising
25         consumer itself (the latter doesn't receive frames - it merely
26         interrogates the connected producer for its configuration).
27
28         Although westley was defined as a serialisation mechanism for instantiated 
29         MLT components, this document will concentrate on the hand authoring of 
30         westley documents.
31
32
33 Rules:
34
35         As shall become apparent through the remainder of this document, the basic
36         tenet of westley authoring is to organise the document in the following
37         manner:
38
39         1) create producer elements for each unique media clip in the project;
40         2) create playlists for each track;
41         3) create a multitrack and specify filters and transitions;
42         4) adding global filters.
43
44         While other uses of westley exist, the approach taken here is to maximise
45         efficiency for complex projects. 
46
47
48 Basic Producers:
49
50         The simplest westley document is:
51
52         <westley>
53           <producer id="producer0">
54             <property name="resource">clip1.dv</property>
55           </producer>
56         </westley>
57
58         The westley wrapping is of course superfluous here - loading this document
59         with MLT is identical to loading the clip directly. 
60
61         Of course, you can specify additional properties. For example, consider an
62         MPEG file with multiple soundtracks - you could define a westley document to
63         ensure that the second audio track is loaded:
64
65         <westley>
66           <producer id="producer0">
67             <property name="resource">clip1.mpeg</property>
68             <property name="audio_track">1</property>
69           </producer>
70         </westley>
71
72         NB: This relies on the mpeg being handled by the avformat producer, rather
73         than the mcmpeg one. See services.txt for more details.
74
75         A more useful example comes with the pango producer for a text producer.
76
77         TODO: pango example...
78
79         Notes:
80
81         1) It is better not to specify in/out points when defining basic producers
82         as these can be specified in the playlists. The reasoning is that in/out
83         restricts the amount of the clip available, and could lead to the same clip
84         being loaded multiple times if you need different regions of the clip
85         elsewhere;
86         2) A westley can be specified as a resource, so westleys can naturally
87         encapsulate other westleys.
88
89
90 Playlists:
91
92         Playlists provide a 'collection' structure for producers. These can be used
93         to define 'tracks' in the multitrack approach, or simple playlists for
94         sequential, single track playout.
95
96         As an example, the following defines two basic producers and a playlist with 3
97         items:
98
99         <westley>
100           <producer id="producer0">
101             <property name="resource">clip1.dv</property>
102           </producer>
103           <producer id="producer1">
104             <property name="resource">clip2.dv</property>
105           </producer>
106           <playlist id="playlist0">
107             <entry producer="producer0" in="0" out="2999"/>
108             <entry producer="producer1" in="0" out="999"/>
109             <entry producer="producer0" in="3000" out="6999"/>
110           </playlist>
111         </westley>
112
113         Here we see how the playlist defines the in/out points of the basic
114         producers.
115
116         Notes:
117
118         1) All in/out points are absolute frame positions relative to the producer
119         being appended to the playlist;
120         2) Westley documents are currently authored for a specific normalisation;
121         3) The last 'producer' in the document is the default for play out;
122         4) Playlists can reference the same producer multiple times. In/out regions
123         do not need to be contiguous - duplication and skipping is acceptable.
124
125
126 Interlude - Introducing Multitracks:
127
128         So far we've defined basic producers and playlists/tracks - the tractor is
129         the element that allows us to arrange our tracks and specify filters and
130         transitions. Similarly to a playlist, a tractor is a container.
131
132         Note that MLT doesn't see a filter or a transition as a producer in the
133         normal sense - filters and transitions are passive when it comes to seeking.
134         Internally, seeks are carried out on the producers. This is an important
135         point - MLT does not follow a traditional graph oriented model.
136
137         Visualising an MLT tractor and it's interaction with the consumer will
138         assist here:
139
140         +----------------------------------------------+
141         |tractor                                       |
142         | +----------+    +-+    +-+    +-+    +-+     |
143         | |multitrack|    |f|    |f|    |t|    |t|     |
144         | | +------+ |    |i|    |i|    |r|    |r|     |
145         | | |track0|-|--->|l|- ->|l|- ->|a|--->|a|\    |
146         | | +------+ |    |t|    |t|    |n|    |n| \   |
147         | |          |    |e|    |e|    |s|    |s|  \  |
148         | | +------+ |    |r|    |r|    |i|    |i|   \ |    +--------+
149         | | |track1|-|- ->|0|--->|1|--->|t|--->|t|-----|--->|consumer|
150         | | +------+ |    | |    | |    |i|    |i|   / |    +--------+
151         | |          |    | |    | |    |o|    |o|  /  |         ^
152         | | +------+ |    | |    | |    |n|    |n| /   |         |
153         | | |track2|-|- ->| |- ->| |--->|0|- ->|1|/    |         |
154         | | +------+ |    | |    | |    | |    | |     |         |
155         | +----------+    +-+    +-+    +-+    +-+     |         |
156         +----------------------------------------------+         |
157                ^                                                 |
158                |                                                 |
159         +-----------+                                            |
160         |APPLICATION|--------------------------------------------+
161         +-----------+
162
163         Internally, all frames from all tracks pass through all the filters and
164         transitions - these are told which tracks to deal and which regions of the
165         tracks to work on. 
166
167         Note that the application communicates with the producer - it can alter
168         playback speed, position, or even which producer is connected to which
169         consumer. 
170         
171         The consumer receives the first non-blank frame (see below). It has no say
172         in the order in which gets them (the sdl consumer when used with inigo might 
173         appear to be an exception - it isn't - it simply has a route back to the 
174         application to allow the application to interpret key presses).
175
176         Whether this is better or worse than a traditional graph approach is a moot
177         point. The author of this document likes it anyway :-).
178
179
180 Tractors:
181
182         To create a multitrack westley, we can use two playlists and introduce a
183         tractor. For the purposes of demonstration, I'll add a filter here too:
184
185         <westley>
186           <producer id="producer0">
187             <property name="resource">clip1.dv</property>
188           </producer>
189           <producer id="producer1">
190             <property name="resource">clip2.dv</property>
191           </producer>
192           <playlist id="playlist0">
193             <entry producer="producer0" in="0" out="2999"/>
194             <blank length="1000"/>
195             <entry producer="producer0" in="3000" out="6999"/>
196           <playlist id="playlist1">
197             <blank length="3000"/>
198             <entry producer="producer1" in="0" out="999"/>
199           </playlist>
200           <tractor id="tractor0">
201             <multitrack>
202               <track producer="playlist0"/>
203               <track producer="playlist1"/>
204             </multitrack>
205             <filter>
206               <property name="track">0</property>
207               <property name="mlt_service">greyscale</property>
208             </filter>
209           </tractor>
210         </westley>
211         
212         Here we see that blank frames are inserted into the first playlist and a
213         blank is provided at the beginning of the second - this can be visualised in
214         the traditional timeline widget as follows:
215
216         +-------+   +-------------+
217         |a      |   |a            |
218         +-------+---+-------------+
219                 |b  |
220                 +---+
221         
222         Adding the filter on the top track, gives us:
223
224         +-------+   +-------------+
225         |a      |   |a            |
226         +-------+---+-------------+
227         |greyscale                |
228         --------+---+-------------+
229                 |b  |
230                 +---+
231         
232         Note that it's only applied to the visible parts of the top track.
233
234         The requirement to apply a filter to the output, as opposed to a specific track 
235         leads us to the final item in the Rules section above. As an example, let's
236         assume we wish to watermark all output, then we could use the following:
237
238         <westley>
239           <producer id="producer0">
240             <property name="resource">clip1.dv</property>
241           </producer>
242           <producer id="producer1">
243             <property name="resource">clip2.dv</property>
244           </producer>
245           <playlist id="playlist0">
246             <entry producer="producer0" in="0" out="2999"/>
247             <blank length="1000"/>
248             <entry producer="producer0" in="3000" out="6999"/>
249           <playlist id="playlist1">
250             <blank length="3000"/>
251             <entry producer="producer1" in="0" out="999"/>
252           </playlist>
253           <tractor id="tractor0">
254             <multitrack>
255               <track producer="playlist0"/>
256               <track producer="playlist1"/>
257             </multitrack>
258             <filter>
259               <property name="track">0</property>
260               <property name="mlt_service">greyscale</property>
261             </filter>
262           </tractor>
263           <tractor id="tractor1">
264             <multitrack>
265               <track producer="tractor0"/>
266             </multitrack>
267             <filter>
268               <property name="mlt_service">watermark</property>
269               <property name="resource">watermark1.png</property>
270             </filter>
271           </tractor>
272         </westley>
273         
274         Here we employ another tractor and we define a single track (being the
275         tractor we previously defined) and apply a watermarking filter there.
276
277         This is simply provided as an example - the watermarking functionality could
278         be better handled at the playout stage itself (ie: as a filter automatically
279         placed between all producers and the consumer).
280
281         TODO: transition example
282
283
284 Flexibility:
285
286         The information presented above is considered the MLT Westley "normal"
287         form. This is the output generated by the westley consumer, for example,
288         when used with inigo. It is the output generated when you use the
289         "Westley to File" consumer in the demo script, which beginners will find
290         most useful for learning to use westley XML. This section describes 
291         alternative forms the westley producer accepts.
292
293         First of all, the normal form is more of a linear format with producers
294         and playlists defined prior to their usage in a multitrack. Westley
295         also accepts a hierarchical format with producers as children of tracks
296         or playlist entries and with playlists as children of tracks:
297
298         <westley>
299           <tractor>
300             <multitrack>
301               <track>
302                 <playlist>
303                   <entry>
304                     <producer>
305                       <property name="resource">clip1.dv</property>
306                     </producer>
307                   </entry>
308                 </playlist>
309               </track>
310             </multitrack>
311           </tractor>
312         </westley>
313
314         Obviously, this example is meant to demonstrate hierarchy and not effective
315         use of playlist or multitrack!
316
317         Secondly, as part of error handling, westley is forgiving if you fail to
318         supply <tractor>, <track>, and <entry> where one can be understood. This
319         affords an abbreviated syntax that is less verbose and perhaps less 
320         intimidating for a human to read and understand. One can simplify the
321         above example as:
322
323         <westley>
324           <multitrack>
325             <playlist>
326               <producer>
327                 <property name="resource">clip1.dv</property>
328               </producer>
329             </playlist>
330           </multitrack>
331         </westley>
332
333         Yes, filters and transitions can be added to the above example after the
334         closing multitrack tag (</multitrack>) because it is still enclosed within
335         the westley body tags.
336
337         If you specify in and out on a producer and it has been enclosed within
338         an <entry> or <playlist>, then the edit points apply to the playlist
339         entry and not to the producer itself. This facilitates re-use of media:
340
341         <playlist>
342           <producer id="clip1" in="25" out="78">
343             <property name="resource">clip1.dv</property>
344           </producer>
345           <entry producer="clip1" in="119" out="347"/>
346         </playlist>
347
348         In the above example, the producer attribute of the entry element is 
349         a reference to the preceding producer. All references must follow the 
350         definition. The edit points supplied on the producer above will not affect
351         the entry that references it below because westley knows the clip is a 
352         playlist entry and optimises this situation. The advantage is that one
353         does not need to determine every clip to be included ahead of time 
354         and specify them outside the context of the mutlitrack timeline.
355
356         This form of authoring will be easier for many to visualise as a non-linear 
357         editor's timeline. Here is a more complex example:
358
359         <westley>
360           <multitrack>
361             <playlist>
362               <producer id="foo" in="100" out="149">
363                 <property name="resource">clip2.mpeg</property>
364               </producer>
365               <blank length="25"/>
366               <entry producer="foo" in="10" out="59"/>
367             </playlist>
368             <playlist>
369               <blank length="25"/>
370               <producer id="bar" in="100" out="199">
371                 <property name="resource">clip3.mpeg</property>
372               </producer>
373               <entry out="99" producer="bar"/>
374             </playlist>
375           </multitrack>
376           <filter mlt_service="greyscale" track="0"/>
377           <transition mlt_service="luma" in="25" out="49" a_track="0" b_track="1"/>
378           <transition mlt_service="luma" in="75" out="99" a_track="0" b_track="1">
379             <property name="reverse" value="1"/>
380           </transition>
381         </westley>
382
383         Did you notice something different in the last example? Properties can be 
384         expressed using XML attributes on the element as well. However, only 
385         non-service-specific properties are supported in this way. For example,
386         "mlt_service" is available to any producer, filter, or transition. However,
387         "resource" is actually service-specific. Notice the syntax of the last 
388         property, on the last transition. Westley accepts property values using 
389         the "value" attribute as well as using element text.
390
391         We have seen a few different ways of expressing property values. There are
392         a couple more for properties that can accept XML data. For example, the
393         GDK pixbuf producer with librsvg can handle embedded SVG, and the Pango
394         producer can handle embedded Pango markup. You can enclose the embedded XML
395         using a CDATA section:
396
397         <property name="resource"><![CDATA[ <svg>...</svg> ]]></property>
398
399         Please ensure the opening CDATA tag immediately follows the opening
400         property tag and that the section closing tag immediately precedes the
401         closing property tag.
402
403         However, westley can also accept inline embedded XML:
404
405         <property name="resource">
406           <svg>
407           </svg>
408         </property>
409
410         Currently, there is no namespace handling so a conflict will occur only on 
411         any embedded XML that contains an element named "property" because 
412         westley collects embedded XML until it reaches a closing property tag.
413         
414         TODO: xml entities
415
416
417 Technique:
418
419         If one finds the above hierarchical, abbreviated format intuitive,
420         start with a simple template and fill and extend as needed:
421                 <westley>
422                   <multitrack>
423                     <playlist>
424                     </playlist>
425                     ...add a playlist for each track...
426                   </multitrack>
427                   ...add filters and transitions...
428                 </westley>
429                 
430         By using a playlist for each track, it is easier to iteratively add new 
431         clips and blank regions as you develop the project.     You will not have to
432         use <track> or later add <playlist> when necessary.
433         
434         A more advanced template that allows sequencing multitracks is:
435                 <playlist>
436                   <entry>
437                     <multitrack>
438                       <playlist>
439                       </playlist>
440                       ...add a playlist for each track...
441                     </multitrack>
442                     ...add filters and transitions...
443                   </entry>
444                   
445                   <entry>
446                     <multitrack>
447                       <playlist>
448                       </playlist>
449                       ...add a playlist for each track...
450                     </multitrack>
451                     ...add filters and transitions...
452                   </entry>
453                 </playlist>
454
455         If you want to have a silent, black background for audio and video fades,
456         then make the last track simply <producer mlt_service="colour"/>. Then,
457         use composite and volume key-framable properties. 
458         TODO: to be continued
459         
460         TODO: considerations with mixing multiple audio layers