6 Westley is the MLT projects XML serialisation/deserialisation format -
7 as such, it closely mirrors the internal structure of the MLT API.
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
16 There are 3 types of producer:
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.
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).
28 Although westley was defined as a serialisation mechanism for instantiated
29 MLT components, this document will concentrate on the hand authoring of
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
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.
44 While other uses of westley exist, the approach taken here is to maximise
45 efficiency for complex projects.
50 The simplest westley document is:
53 <producer id="producer0">
54 <property name="resource">clip1.dv</property>
58 The westley wrapping is of course superfluous here - loading this document
59 with MLT is identical to loading the clip directly.
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:
66 <producer id="producer0">
67 <property name="resource">clip1.mpeg</property>
68 <property name="audio_track">1</property>
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.
75 A more useful example comes with the pango producer for a text producer.
77 TODO: pango example...
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
86 2) A westley can be specified as a resource, so westleys can naturally
87 encapsulate other westleys.
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.
96 As an example, the following defines two basic producers and a playlist with 3
100 <producer id="producer0">
101 <property name="resource">clip1.dv</property>
103 <producer id="producer1">
104 <property name="resource">clip2.dv</property>
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"/>
113 Here we see how the playlist defines the in/out points of the basic
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.
126 Interlude - Introducing Multitracks:
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.
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.
137 Visualising an MLT tractor and it's interaction with the consumer will
140 +----------------------------------------------+
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 +----------------------------------------------+ |
160 |APPLICATION|--------------------------------------------+
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
167 Note that the application communicates with the producer - it can alter
168 playback speed, position, or even which producer is connected to which
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).
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 :-).
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:
186 <producer id="producer0">
187 <property name="resource">clip1.dv</property>
189 <producer id="producer1">
190 <property name="resource">clip2.dv</property>
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"/>
200 <tractor id="tractor0">
202 <track producer="playlist0"/>
203 <track producer="playlist1"/>
206 <property name="track">0</property>
207 <property name="mlt_service">greyscale</property>
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:
216 +-------+ +-------------+
218 +-------+---+-------------+
222 Adding the filter on the top track, gives us:
224 +-------+ +-------------+
226 +-------+---+-------------+
228 --------+---+-------------+
232 Note that it's only applied to the visible parts of the top track.
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:
239 <producer id="producer0">
240 <property name="resource">clip1.dv</property>
242 <producer id="producer1">
243 <property name="resource">clip2.dv</property>
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"/>
253 <tractor id="tractor0">
255 <track producer="playlist0"/>
256 <track producer="playlist1"/>
259 <property name="track">0</property>
260 <property name="mlt_service">greyscale</property>
263 <tractor id="tractor1">
265 <track producer="tractor0"/>
268 <property name="mlt_service">watermark</property>
269 <property name="resource">watermark1.png</property>
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.
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).
281 TODO: transition example