]> git.sesse.net Git - mlt/blob - docs/framework.txt
4ffff1f5e595408e4f23fd66555d8353b4330ac3
[mlt] / docs / framework.txt
1 Framework Documentation
2
3 Copyright (C) 2004 Ushodaya Enterprises Limited
4 Author: Charles Yates <charles.yates@pandora.be>
5 Last Revision: 2004-03-20
6
7
8 MLT FRAMEWORK
9 -------------
10
11 Preamble:
12
13         MLT is a multimedia framework designed for television broadcasting. As such, 
14         it provides a pluggable architecture for the inclusion of new audio/video 
15         sources, filters, transitions and playback devices.
16
17         The framework provides the structure and utility functionality on which
18         all of the MLT applications and services are defined. 
19
20         On its own, the framework provides little more than 'abstract classes' and
21         utilities for managing resources, such as memory, properties, dynamic object
22         loading and service instantiation. 
23
24         This document is split roughly into 3 sections. The first section provides a
25         basic overview of MLT, the second section shows how it's used and the final
26         section shows structure and design, with an emphasis on how the system is 
27         extended.
28
29
30 Target Audience:
31
32         This document is provided as a 'road map' for the framework and should be
33         considered mandatory reading for anyone wishing to develop code at the MLT
34         level. 
35
36         This includes:
37
38         1. framework maintainers;
39         2. module developers;
40         3. application developers;
41         4. anyone interested in MLT.
42
43         The emphasis of the document is in explaining the public interfaces, as
44         opposed to the implementation details.
45
46         It is not required reading for the MLT client/server integration - please
47         refer to valerie.txt and dvcp.txt for more details on this area.
48
49
50 SECTION 1 - BASIC OVERVIEW
51 --------------------------
52
53 Basic Design Information:
54
55         MLT is written in C. 
56         
57         The framework has no dependencies other than the standard C99 and POSIX 
58         libraries. 
59
60         It follows a basic Object Oriented design paradigm, and as such, much of the
61         design is loosely based on the Producer/Consumer design pattern. 
62         
63         It employs Reverse Polish Notation for the application of audio and video FX.
64
65         The framework is designed to be colour space neutral - the currently
66         implemented modules, however, are very much 8bit YUV422 oriented. In theory,
67         the modules could be entirely replaced.
68
69         A vague understanding of these terms is assumed throughout the remainder of
70         this document.
71
72
73 Structure and Flow:
74
75         The general structure of an MLT 'network' is simply the connection of a
76         'producer' to a 'consumer':
77
78         +--------+   +--------+
79         |Producer|-->|Consumer|
80         +--------+   +--------+
81
82         A typical consumer requests MLT Frame objects from the producer, does 
83         something with them and when finished with a frame, closes it. 
84         
85          /\  A common confusion with the producer/consumer terminology used here is 
86         /!!\ that a consumer may 'produce' something. For example, the libdv consumer
87         \!!/ produces DV and the libdv producer seems to consume DV. However, the
88          \/  naming conventions refer only to producers and consumers of MLT Frames.
89
90         To put it another way - a producer produces MLT Frame objects and a consumer 
91         consumes MLT Frame objects.
92
93         An MLT Frame essentially provides an uncompressed image and its associated
94         audio samples.
95
96         Filters may also be placed between the producer and the consumer:
97
98         +--------+   +------+   +--------+
99         |Producer|-->|Filter|-->|Consumer|
100         +--------+   +------+   +--------+
101
102         A service is the collective name for producers, filters, transitions and
103         consumers. 
104
105         The communications between a connected consumer and producer or service are 
106         carried out in 3 phases:
107
108         * get the frame
109         * get the image
110         * get the audio
111
112         MLT employs 'lazy evaluation' - the image and audio need not be extracted
113         from the source until the get image and audio methods are invoked. 
114
115         In essence, the consumer pulls from what it's connected to - this means that
116         threading is typically in the domain of the consumer implementation and some
117         basic functionality is provided on the consumer class to ensure realtime
118         throughput.
119
120
121 SECTION 2 - USAGE
122 -----------------
123
124 Hello World:
125
126         Before we go in to the specifics of the framework architecture, a working
127         example of usage is provided. 
128         
129         The following simply provides a media player:
130
131         #include <stdio.h>
132         #include <unistd.h>
133         #include <framework/mlt.h>
134
135         int main( int argc, char *argv[] )
136         {
137             // Initialise the factory
138             if ( mlt_factory_init( NULL ) == 0 )
139             {
140                 // Create the default consumer
141                 mlt_consumer hello = mlt_factory_consumer( NULL, NULL );
142
143                 // Create via the default producer
144                 mlt_producer world = mlt_factory_producer( NULL, argv[ 1 ] );
145
146                 // Connect the producer to the consumer
147                 mlt_consumer_connect( hello, mlt_producer_service( world ) );
148
149                 // Start the consumer
150                 mlt_consumer_start( hello );
151
152                 // Wait for the consumer to terminate
153                 while( !mlt_consumer_is_stopped( hello ) )
154                     sleep( 1 );
155
156                 // Close the consumer
157                 mlt_consumer_close( hello );
158
159                 // Close the producer
160                 mlt_producer_close( world );
161
162                 // Close the factory
163                 mlt_factory_close( );
164             }
165             else
166             {
167                 // Report an error during initialisation
168                 fprintf( stderr, "Unable to locate factory modules\n" );
169             }
170
171             // End of program
172             return 0;
173         }
174
175         This is a simple example - it doesn't provide any seeking capabilities or
176         runtime configuration options. 
177
178         The first step of any MLT application is the factory initialisation - this
179         ensures that the environment is configured and MLT can function. The factory
180         is covered in more detail below.
181
182         All services are instantiated via the factories, as shown by the
183         mlt_factory_consumer and mlt_factory_producer calls above. There are similar
184         factories for filters and transitions. There are details on all the standard
185         services in services.txt. 
186
187         The defaults requested here are a special case - the NULL usage requests
188         that we use the default producers and consumers. 
189         
190         The default producer is "fezzik". This producer matches file names to 
191         locate a service to use and attaches 'normalising filters' (such as scalers,
192         deinterlacers, resamplers and field normalisers) to the loaded content -
193         these filters ensure that the consumer gets what it asks for.
194
195         The default consumer is "sdl". The combination of fezzik and sdl will
196         provide a media player.
197
198         In this example, we connect the producer and then start the consumer. We
199         then wait until the consumer is stopped (in this case, by the action of the
200         user closing the SDL window) and finally close the consumer, producer and
201         factory before exiting the application.
202
203         Note that the consumer is threaded - waiting for an event of some sort is 
204         always required after starting and before stopping or closing the consumer.
205
206         Also note, you can override the defaults as follows:
207
208         $ MLT_CONSUMER=westley ./hello file.avi
209
210         This will create a westley xml document on stdout.
211
212         $ MLT_CONSUMER=westley MLT_PRODUCER=avformat ./hello file.avi
213
214         This will play the video using the avformat producer directly, thus it will
215         bypass the normalising functions.
216
217         $ MLT_CONSUMER=libdv ./hello file.avi > /dev/dv1394
218
219         This might, if you're lucky, do on the fly, realtime conversions of file.avi
220         to DV and broadcast it to your DV device.
221
222
223 Factories:
224
225         As shown in the 'Hello World' example, factories create service objects.
226
227         The framework itself provides no services - they are provided in the form of
228         a plugin structure. A plugin is organised in the form of a 'module' and a
229         module can provide many services of different types. 
230
231         Once the factory is initialised, all the configured services are available
232         for use.
233
234         The complete set of methods associated to the factory are as follows:
235
236         int mlt_factory_init( char *prefix );
237         const char *mlt_factory_prefix( );
238         char *mlt_environment( char *name );
239         mlt_producer mlt_factory_producer( char *name, void *input );
240         mlt_filter mlt_factory_filter( char *name, void *input );
241         mlt_transition mlt_factory_transition( char *name, void *input );
242         mlt_consumer mlt_factory_consumer( char *name, void *input );
243         void mlt_factory_close( );
244
245         The mlt_factory_prefix returns the path to the location of the installed
246         modules directory. This can be specified in the mlt_factory_init call
247         itself, or it can be specified via the MLT_REPOSITORY environment variable,
248         or in the absence of either of those, it will default to the install
249         prefix/shared/mlt/modules. 
250
251         The mlt_environment provides read only access to a collection of name=value
252         pairs as shown in the following table:
253
254         +------------------+------------------------------------+------------------+
255         |Name              |Description                         |Values            |
256         +------------------+------------------------------------+------------------+
257         |MLT_NORMALISATION |The normalisation of the system     |PAL or NTSC       |
258         +------------------+------------------------------------+------------------+
259         |MLT_PRODUCER      |The default producer                |"fezzik" or other |
260         +------------------+------------------------------------+------------------+
261         |MLT_CONSUMER      |The default consumer                |"sdl" or other    |
262         +------------------+------------------------------------+------------------+
263         |MLT_TEST_CARD     |The default test card producer      |any producer      |
264         +------------------+------------------------------------+------------------+
265
266         These values are initialised from the environment variables of the same
267         name.
268
269         As shown above, a producer can be created using the 'default normalising'
270         producer, and they can also be requested by name. Filters and transitions 
271         are always requested by name - there is no concept of a 'default' for these.
272
273
274 Service Properties:
275
276         As shown in the services.txt document, all services have their own set of
277         properties than can be manipulated to affect their behaviour.
278
279         In order to set properties on a service, we need to retrieve the properties
280         object associated to it. For producers, this is done by invoking:
281
282             mlt_properties properties = mlt_producer_properties( producer );
283
284         All services have a similar method associated to them.
285
286         Once retrieved, setting and getting properties can be done directly on this
287         object, for example:
288
289             mlt_properties_set( properties, "name", "value" );
290         
291         A more complete description of the properties object is found below.
292
293
294 Playlists:
295
296         So far, we've shown a simple producer/consumer configuration - the next
297         phase is to organise producers in playlists.
298
299         Let's assume that we're adapting the Hello World example, and wish to queue
300         a number of files for playout, ie:
301
302             hello *.avi
303
304         Instead of invoking mlt_factory_producer directly, we'll create a new
305         function called create_playlist. This function is responsible for creating
306         the playlist, creating each producer and appending to the playlist.
307
308         mlt_producer create_playlist( int argc, char **argv )
309         {
310             // We're creating a playlist here
311             mlt_playlist playlist = mlt_playlist_init( );
312
313             // We need the playlist properties to ensure clean up
314             mlt_properties properties = mlt_playlist_properties( playlist );
315
316             // Loop through each of the arguments
317             int i = 0;
318             for ( i = 1; i < argc; i ++ )
319             {
320                 // Create the producer
321                 mlt_producer producer = mlt_factory_producer( NULL, argv[ i ] );
322
323                 // Add it to the playlist
324                 mlt_playlist_append( playlist, producer );
325
326                         // Close the producer (see below)
327                         mlt_producer_close( producer );
328             }
329
330             // Return the playlist as a producer
331             return mlt_playlist_producer( playlist );
332         }
333
334         Notice that we close the producer after the append. Actually, what we're 
335         doing is closing our reference to it - the playlist creates its own reference
336         to the producer on append and insert, and it will close its reference 
337         when the playlist is destroyed[*].
338
339         Note also that if you append multiple instances of the same producer, it 
340         will create multiple references to it.
341
342         Now all we need do is to replace these lines in the main function:
343
344             // Create a normalised producer
345             mlt_producer world = mlt_factory_producer( NULL, argv[ 1 ] );
346
347         with:
348
349             // Create a playlist
350             mlt_producer world = create_playlist( argc, argv );
351
352         and we have a means to play multiple clips.
353
354         [*] This reference functionality was introduced in mlt 0.1.2 - it is 100%
355         compatable with the early mechanism of registering the reference and 
356         destructor with the properties of the playlist object.
357
358
359 Filters:
360
361         Inserting filters between the producer and consumer is just a case of
362         instantiating the filters, connecting the first to the producer, the next
363         to the previous filter and the last filter to the consumer.
364
365         For example:
366
367             // Create a producer from something
368             mlt_producer producer = mlt_factory_producer( ... );
369
370             // Create a consumer from something
371             mlt_consumer consumer = mlt_factory_consumer( ... );
372
373             // Create a greyscale filter
374             mlt_filter filter = mlt_factory_filter( "greyscale", NULL );
375
376             // Connect the filter to the producer
377             mlt_filter_connect( filter, mlt_producer_service( producer ), 0 );
378
379             // Connect the consumer to filter
380             mlt_consumer_connect( consumer, mlt_filter_service( filter ) );
381
382         As with producers and consumers, filters can be manipulated via their
383         properties object - the mlt_filter_properties method can be invoked and
384         properties can be set as needed.
385
386         The additional argument in the filter connection is an important one as it
387         dictates the 'track' on which the filter operates. For basic producers and
388         playlists, there's only one track (0), and as you will see in the next
389         section, even multiple tracks have a single track output.
390
391
392 Multiple Tracks and Transitions:
393
394         MLT's approach to multiple tracks is governed by two requirements:
395
396         1) The need for a consumer and producer to communicate with one another via
397         a single frame;
398         2) The desire to be able to serialise and manipulate a 'network' (or filter
399         graph if you prefer).
400
401         We can visualise a multitrack in the way that an NLE presents it:
402
403            +-----------------+                          +-----------------------+
404         0: |a1               |                          |a2                     |
405            +---------------+-+--------------------------+-+---------------------+
406         1:                 |b1                            |
407                            +------------------------------+
408
409         The overlapping areas of track 0 and 1 would (presumably) have some kind of
410         transition - without a transition, the frames from b1 and b2 would be shown 
411         during the areas of overlap (ie: by default, the higher numbered track takes 
412         precedence over the lower numbered track). 
413
414         MLT has a multitrack object, but it is not a producer in the sense that it
415         can be connected directly to a consumer and everything will work correctly.
416         A consumer would treat it precisely as it would a normal producer, and, in
417         the case of the multitrack above, you would never see anything from track 1
418         other than the transitions between the clips - the gap between a1 and a2 
419         would show test frames.
420
421         This happens because a consumer pulls one frame from the producer it's 
422         connected to while a multitrack will provide one frame per track.
423         Something, somewhere, must ensure that all frames are pulled from the
424         multitrack and elect the correct frame to pass on.
425
426         Hence, MLT provides a wrapper for the multitrack, which is called a
427         'tractor', and its the tractors task to ensure that all tracks are pulled
428         evenly, the correct frame is output and that we have 'producer like'
429         behaviour.
430
431         Thus, a multitrack is conceptually 'pulled' by a tractor as shown here:
432
433         +----------+
434         |multitrack|
435         | +------+ |    +-------+
436         | |track0|-|--->|tractor|
437         | +------+ |    |\      |
438         |          |    | \     |
439         | +------+ |    |  \    |
440         | |track1|-|--->|---o---|--->
441         | +------+ |    |  /    |
442         |          |    | /     |
443         | +------+ |    |/      |
444         | |track2|-|--->|       |
445         | +------+ |    +-------+
446         +----------+
447
448         With a combination of the two, we can now connect multitracks to consumers.
449         The last non-test card will be retrieved and passed on. 
450
451         The tracks can be producers, playlists, or even other tractors. 
452
453         Now we wish to insert filters and transitions between the multitrack and the
454         tractor. We can do this directly by inserting filters directly between the
455         tractor and the multitrack, but this involves a lot of connecting and
456         reconnecting left and right producers and consumers, and it seemed only fair
457         that we should be able to automate that process. 
458
459         So in keeping with our agricultural theme, the concept of the 'field' was 
460         born. We 'plant' filters and transitions in the field and the tractor pulls 
461         the multitrack (think of a combine harvester :-)) over the field and 
462         produces a 'bail' (sorry - kidding - frame :-)).
463
464         Conceptually, we can see it like this:
465
466         +----------+
467         |multitrack|
468         | +------+ |    +-------------+    +-------+
469         | |track0|-|--->|field        |--->|tractor|
470         | +------+ |    |             |    |\      |
471         |          |    |   filters   |    | \     |
472         | +------+ |    |     and     |    |  \    |
473         | |track1|-|--->| transitions |--->|---o---|--->
474         | +------+ |    |             |    |  /    |
475         |          |    |             |    | /     |
476         | +------+ |    |             |    |/      |
477         | |track2|-|--->|             |--->|       |
478         | +------+ |    +-------------+    +-------+
479         +----------+
480
481         In reality, we create a field first, and from that we obtain a multitrack
482         and a tractor. We can then populate the multitrack, field and finally,
483         connect the tractor to the consumer. 
484         
485         The reasoning behind this is possibly flawed - it might have made more 
486         sense to produce the tractor and have it encapsulate the field and the
487         multitrack as that is how it looks to a connected consumer:
488
489         +-----------------------------------------------+
490         |tractor          +--------------------------+  |
491         | +----------+    | +-+    +-+    +-+    +-+ |  |
492         | |multitrack|    | |f|    |f|    |t|    |t| |  |
493         | | +------+ |    | |i|    |i|    |r|    |r| |  |
494         | | |track0|-|--->| |l|- ->|l|- ->|a|--->|a|\|  |
495         | | +------+ |    | |t|    |t|    |n|    |n| |  |
496         | |          |    | |e|    |e|    |s|    |s| |\ |
497         | | +------+ |    | |r|    |r|    |i|    |i| | \|
498         | | |track1|-|- ->| |0|--->|1|--->|t|--->|t|-|--o--->
499         | | +------+ |    | | |    | |    |i|    |i| | /|
500         | |          |    | | |    | |    |o|    |o| |/ |
501         | | +------+ |    | | |    | |    |n|    |n| |  |
502         | | |track2|-|- ->| | |- ->| |--->|0|- ->|1|/|  |
503         | | +------+ |    | | |    | |    | |    | | |  |
504         | +----------+    | +-+    +-+    +-+    +-+ |  |
505         |                 +--------------------------+  |
506         +-----------------------------------------------+
507
508         An example will hopefully clarify this. 
509         
510         Let's assume that we want to provide a 'watermark' to our hello world 
511         example. We have already extended the example to play multiple clips,
512         and now we will place a text based watermark, reading 'Hello World' in 
513         the top left hand corner:
514
515         mlt_producer create_tracks( int argc, char **argv )
516         {
517             // Create the field
518             mlt_field field = mlt_field_init( );
519         
520             // Obtain the multitrack
521             mlt_multitrack multitrack = mlt_field_multitrack( field );
522         
523             // Obtain the tractor
524             mlt_tractor tractor = mlt_field_tractor( field );
525         
526             // Obtain a composite transition
527             mlt_transition transition = mlt_factory_transition( "composite", "10%,10%:15%x15%" );
528         
529             // Create track 0
530             mlt_producer track0 = create_playlist( argc, argv );
531         
532             // Create the watermark track - note we NEED fezzik for scaling here
533             mlt_producer track1 = mlt_factory_producer( "fezzik", "pango" );
534         
535             // Get the length of track0
536             mlt_position length = mlt_producer_get_playtime( track0 );
537         
538             // Set the properties of track1
539             mlt_properties properties = mlt_producer_properties( track1 );
540             mlt_properties_set( properties, "text", "Hello\nWorld" );
541             mlt_properties_set_position( properties, "in", 0 );
542             mlt_properties_set_position( properties, "out", length - 1 );
543             mlt_properties_set_position( properties, "length", length );
544             mlt_properties_set_int( properties, "a_track", 0 );
545             mlt_properties_set_int( properties, "b_track", 1 );
546
547             // Now set the properties on the transition
548             properties = mlt_transition_properties( transition );
549             mlt_properties_set_position( properties, "in", 0 );
550             mlt_properties_set_position( properties, "out", length - 1 );
551         
552             // Add our tracks to the multitrack
553             mlt_multitrack_connect( multitrack, track0, 0 );
554             mlt_multitrack_connect( multitrack, track1, 1 );
555         
556             // Now plant the transition
557             mlt_field_plant_transition( field, transition, 0, 1 );
558         
559             // Now set the properties on the tractor
560             properties = mlt_tractor_properties( tractor );
561             mlt_properties_set_data( properties, "multitrack", multitrack, 0, ( mlt_destructor )mlt_multitrack_close, NULL );
562             mlt_properties_set_data( properties, "field", field, 0, ( mlt_destructor )mlt_field_close, NULL );
563             mlt_properties_set_data( properties, "track0", track0, 0, ( mlt_destructor )mlt_producer_close, NULL );
564             mlt_properties_set_data( properties, "track1", track1, 0, ( mlt_destructor )mlt_producer_close, NULL );
565             mlt_properties_set_data( properties, "transition", transition, 0, ( mlt_destructor )mlt_transition_close, NULL );
566         
567             // Return the tractor
568             return mlt_tractor_producer( tractor );
569         }
570
571         Now all we need do is to replace these lines in the main function:
572
573             // Create a playlist
574             mlt_producer world = create_playlist( argc, argv );
575
576         with:
577
578             // Create a watermarked playlist
579             mlt_producer world = create_tracks( argc, argv );
580
581         and we have a means to play multiple clips with a horribly obtrusive
582         watermark - just what the world needed, right? ;-)
583
584         Incidentally, the same thing could be achieved with the more trivial
585         watermark filter inserted between the producer and the consumer.
586
587
588 SECTION 3 - STRUCTURE AND DESIGN
589 --------------------------------
590
591 Class Hierarchy:
592
593         The mlt framework consists of an OO class hierarchy which consists of the
594         following public classes and abstractions:
595
596         mlt_properties
597           mlt_frame
598           mlt_service
599             mlt_producer
600               mlt_playlist
601               mlt_tractor
602             mlt_filter
603             mlt_transition
604             mlt_consumer
605         mlt_deque
606         mlt_pool
607         mlt_factory
608
609         Each class defined above can be read as extending the classes above and to
610         the left.
611
612         The following sections describe the properties, stacking/queuing and memory 
613         pooling functionality provided by the framework - these are key components 
614         and a basic understanding of these is required for the remainder of the
615         documentation.
616
617
618 mlt_properties:
619
620         The properties class is the base class for the frame and service classes.
621
622         It is designed to provide an efficient lookup table for various types of
623         information, such as strings, integers, floating points values and pointers
624         to data and data structures. 
625
626         All properties are indexed by a unique string. 
627         
628         The most basic use of properties is as follows:
629
630             // 1. Create a new, empty properties set;
631             mlt_properties properties = mlt_properties_new( );
632
633             // 2. Assign the value "world" to the property "hello";
634             mlt_properties_set( properties, "hello", "world" );
635
636             // 3. Retrieve and print the value of "hello";
637             printf( "%s\n", mlt_properties_get( properties, "hello" ) );
638
639             // 4. Reassign "hello" to "world!";
640             mlt_properties_set( properties, "hello", "world!" );
641
642             // 5. Retrieve and print the value of "hello";
643             printf( "%s\n", mlt_properties_get( properties, "hello" ) );
644
645             // 6. Assign the value "0" to "int";
646             mlt_properties_set( properties, "int", "0" );
647
648             // 7. Retrieve and print the integer value of "int";
649             printf( "%d\n", mlt_properties_get_int( properties, "int" ) );
650
651             // 8. Assign the integer value 50 to "int2";
652             mlt_properties_set_int( properties, "int2", 50 );
653
654             // 9. Retrieve and print the double value of "int2";
655             printf( "%s\n", mlt_properties_get( properties, "int2" ) );
656
657         Steps 2 through 5 demonstrate that the "name" is unique - set operations on 
658         an existing "name" change the value. They also free up memory associated to 
659         the previous value. Note that it also possible to change type in this way
660         too.
661
662         Steps 6 and 7 demonstrate that the properties object handles deserialisation
663         from strings. The string value of "0" is set, the integer value of 0 is
664         retrieved.
665
666         Steps 8 and 9 demonstrate that the properties object handles serialisation
667         to strings.
668
669         To show all the name/value pairs in a properties, it is possible to iterate
670         through them:
671
672             for ( i = 0; i < mlt_properties_count( properties ); i ++ )
673                 printf( "%s = %s\n", mlt_properties_get_name( properties, i ),
674                                      mlt_properties_get_value( properties, i ) );
675
676         Note that properties are retrieved in the order in which they are set. 
677
678         Properties are also used to hold pointers to memory. This is done via the
679         set_data call:
680
681         uint8_t *image = malloc( size );
682         mlt_properties_set_data( properties, "image", image, size, NULL, NULL );
683
684         In this example, we specify that the pointer can be retrieved from
685         properties by a subsequent request to get_data:
686
687             image = mlt_properties_get_data( properties, "image", &size );
688
689         or:
690
691             image = mlt_properties_get_data( properties, "image", NULL );
692
693         if we don't wish to retrieve the size.
694
695         Two points here:
696
697         1) The allocated memory remains after the properties object is closed unless
698            you specify a destructor. In the case above, this can be done with:
699
700            mlt_properties_set_data( properties, "image", image, size, free, NULL );
701
702            When the properties are closed, or the value of "image" is changed, the 
703            destructor is invoked.
704         
705         2) The string value returned by mlt_properties_get is NULL. Typically, you
706            wouldn't wish to serialise an image as a string, but other structures
707            might need such functionality - you can specify a serialiser as the last
708            argument if required (declaration is char *serialise( void * )).
709
710         Properties also provides some more advanced usage capabilities. 
711         
712         It has the ability to inherit all serialisable values from another properties 
713         object:
714
715             mlt_properties_inherit( this, that );
716
717         It has the ability to mirror properties set on this on another set of
718         properties:
719
720             mlt_properties_mirror( this, that );
721
722         After this call, all serialisable values set on this are passed on to that.
723
724
725 mlt_deque:
726
727         Stacks and queues are essential components in the MLT framework. Being of a
728         lazy disposition, we elected to implement a 'Double Ended Queue' (deque) -
729         this encapsulates the functionality of both.
730
731         The API of the deque is defined as follows:
732
733         mlt_deque mlt_deque_init( );
734         int mlt_deque_count( mlt_deque this );
735         int mlt_deque_push_back( mlt_deque this, void *item );
736         void *mlt_deque_pop_back( mlt_deque this );
737         int mlt_deque_push_front( mlt_deque this, void *item );
738         void *mlt_deque_pop_front( mlt_deque this );
739         void *mlt_deque_peek_back( mlt_deque this );
740         void *mlt_deque_peek_front( mlt_deque this );
741         void mlt_deque_close( mlt_deque this );
742
743         The stacking operations are used in a number of places:
744
745         * Reverse Polish Notation (RPN) image and audio operations
746         * memory pooling
747
748         The queuing operations are used in:
749         
750         * the consumer base class;
751         * consumer implementations may require further queues.
752
753
754 mlt_pool:
755
756         The MLT framework provides memory pooling capabilities through the mlt_pool
757         API. Once initilialised, these can be seen as a straightforward drop in
758         replacement for malloc/realloc/free functionality.
759
760         The background behind this API is that malloc/free operations are
761         notoriously inefficient, especially when dealing with large blocks of memory
762         (such as an image). On linux, malloc is optimised for memory allocations
763         less than 128k - memory blocks allocated of these sizes or less are retained
764         in the process heap for subsequent reuse, thus bypassing the kernel calls
765         for repeated allocation/frees for small blocks of memory. However, blocks of
766         memory larger than that require kernel calls and this has a detrimental
767         impact on performance.
768
769         The mlt_pool design is simply to hold a list of stacks - there is one stack
770         per 2^n bytes (where n is between 8 and 31). When an alloc is called, the
771         requested size is rounded to the next 2^n, the stack is retrieved for that
772         size, and an item is popped or created if the stack is empty. 
773
774         Each item has a 'header', situated immediately before the returned address - 
775         this holds the 'stack' to which the item belongs.
776
777         When an item is released, we retrieve the header, obtain the stack and push
778         it back.
779
780         Thus, from the programmers point of view, the API is the same as the
781         traditional malloc/realloc/free calls:
782
783         void *mlt_pool_alloc( int size );
784         void *mlt_pool_realloc( void *ptr, int size );
785         void mlt_pool_release( void *release );
786
787
788 mlt_frame:
789
790         A frame object is essentially defined as:
791
792         +------------+
793         |frame       |
794         +------------+
795         | properties |
796         | image stack|
797         | audio stack|
798         +------------+
799
800         The life cycle of a frame can be represented as follows:
801
802         +-----+----------------------+-----------------------+---------------------+
803         |Stage|Producer              |Filter                 |Consumer             |
804         +-----+----------------------+-----------------------+---------------------+
805         | 0.0 |                      |                       |Request frame        |
806         +-----+----------------------+-----------------------+---------------------+
807         | 0.1 |                      |Receives request       |                     |
808         |     |                      |Request frame          |                     |
809         +-----+----------------------+-----------------------+---------------------+
810         | 0.2 |Receives request      |                       |                     |
811         |     |Generates frame for   |                       |                     |
812         |     |current position      |                       |                     |
813         |     |Increments position   |                       |                     |
814         +-----+----------------------+-----------------------+---------------------+
815         | 0.3 |                      |Receives frame         |                     |
816         |     |                      |Updates frame          |                     |
817         +-----+----------------------+-----------------------+---------------------+
818         | 0.4 |                      |                       |Receives frame       |
819         +-----+----------------------+-----------------------+---------------------+
820
821         Note that neither the filter nor the consumer have any conception of
822         'position' until they receive a frame. Speed and position are properties of
823         the producer, and they are assigned to the frame object when the producer
824         creates it.
825
826         Step 0.3 is a critical one here - if the filter determines that the frame is
827         of interest to it, then it should manipulate the image and/or audio stacks
828         and properties as required.
829
830         Assuming that the filter deals with both image and audio, then it should
831         push data and methods on to the stacks which will deal with the processing. 
832         This can be done with the mlt_frame_push_image and audio methods. In order for 
833         the filter to register interest in the frame, the stacks should hold:
834
835         image stack:
836         [ producer_get_image ] [ data1 ] [ data2 ] [ filter_get_image ]
837
838         audio stack:
839         [ producer_get_audio ] [ data ] [ filter_get_audio ]
840
841         The filter_get methods are invoked automatically when the consumer invokes a
842         get_image on the frame. 
843
844         +-----+----------------------+-----------------------+---------------------+
845         |Stage|Producer              |Filter                 |Consumer             |
846         +-----+----------------------+-----------------------+---------------------+
847         | 1.0 |                      |                       |frame_get_image      |
848         +-----+----------------------+-----------------------+---------------------+
849         | 1.1 |                      |filter_get_image:      |                     |
850         |     |                      | pop data2 and data1   |                     |
851         |     |                      | frame_get_image       |                     |
852         +-----+----------------------+-----------------------+---------------------+
853         | 1.2 |producer_get_image    |                       |                     |
854         |     |  Generates image     |                       |                     |
855         +-----+----------------------+-----------------------+---------------------+
856         | 1.3 |                      |Receives image         |                     |
857         |     |                      |Updates image          |                     |
858         +-----+----------------------+-----------------------+---------------------+
859         | 1.4 |                      |                       |Receives image       |
860         +-----+----------------------+-----------------------+---------------------+
861
862         Obviously, if the filter isn't interested in the image, then it should leave
863         the stack alone, and then the consumer will retrieve its image directly from
864         the producer.
865
866         Similarly, audio is handled as follows:
867
868         +-----+----------------------+-----------------------+---------------------+
869         |Stage|Producer              |Filter                 |Consumer             |
870         +-----+----------------------+-----------------------+---------------------+
871         | 2.0 |                      |                       |frame_get_audio      |
872         +-----+----------------------+-----------------------+---------------------+
873         | 2.1 |                      |filter_get_audio:      |                     |
874         |     |                      | pop data              |                     |
875         |     |                      | frame_get_audio       |                     |
876         +-----+----------------------+-----------------------+---------------------+
877         | 2.2 |producer_get_audio    |                       |                     |
878         |     |  Generates audio     |                       |                     |
879         +-----+----------------------+-----------------------+---------------------+
880         | 2.3 |                      |Receives audio         |                     |
881         |     |                      |Updates audio          |                     |
882         +-----+----------------------+-----------------------+---------------------+
883         | 2.4 |                      |                       |Receives audio       |
884         +-----+----------------------+-----------------------+---------------------+
885
886         And finally, when the consumer is done with the frame, it should close it.
887
888         Note that a consumer may not evaluate both image and audio for any given
889         frame, especially in a realtime environment. See 'Realtime Considerations'
890         below.
891
892         By default, a frame has the following properties:
893
894         +------------------+------------------------------------+------------------+
895         |Name              |Description                         |Values            |
896         +------------------+------------------------------------+------------------+
897         |_position         |The producers frame position        |0 to n            |
898         +------------------+------------------------------------+------------------+
899         |_speed            |The producers speed                 |double            |
900         +------------------+------------------------------------+------------------+
901         |image             |The generated image                 |NULL or pointer   |
902         +------------------+------------------------------------+------------------+
903         |alpha             |The generated alpha mask            |NULL or pointer   |
904         +------------------+------------------------------------+------------------+
905         |width             |The width of the image              |                  |
906         +------------------+------------------------------------+------------------+
907         |height            |The height of the image             |                  |
908         +------------------+------------------------------------+------------------+
909         |normalised_width  |The normalised width of the image   |720               |
910         +------------------+------------------------------------+------------------+
911         |normalised_height |The normalised height of the image  |576 or 480        |
912         +------------------+------------------------------------+------------------+
913         |progressive       |Indicates progressive/interlaced    |0 or 1            |
914         +------------------+------------------------------------+------------------+
915         |top_field_first   |Indicates top field first           |0 or 1            |
916         +------------------+------------------------------------+------------------+
917         |audio             |The generated audio                 |NULL or pointer   |
918         +------------------+------------------------------------+------------------+
919         |frequency         |The frequency of the audio          |                  |
920         +------------------+------------------------------------+------------------+
921         |channels          |The channels of the audio           |                  |
922         +------------------+------------------------------------+------------------+
923         |samples           |The samples of the audio            |                  |
924         +------------------+------------------------------------+------------------+
925         |aspect_ratio      |The sample aspect ratio of the image|double            |
926         +------------------+------------------------------------+------------------+
927         |test_image        |Used to indicate no image available |0 or 1            |
928         +------------------+------------------------------------+------------------+
929         |test_audio        |Used to indicate no audio available |0 or 1            |
930         +------------------+------------------------------------+------------------+
931
932         The consumer can attach the following properties which affect the default
933         behaviour of a frame:
934
935         +------------------+------------------------------------+------------------+
936         |test_card_producer|Synthesise test images from here    |NULL or pointer   |
937         +------------------+------------------------------------+------------------+
938         |consumer_aspect_  |Apply this aspect ratio to the test |double            |
939         |ratio             |card producer                       |                  |
940         +------------------+------------------------------------+------------------+
941         |rescale.interp    |Use this scale method for test image|"string"          |
942         +------------------+------------------------------------+------------------+
943
944         While most of these are mainly self explanatory, the normalised_width and
945         normalised_height values require a little explanation. These are required
946         to ensure that effects are consistently handled as PAL or NTSC, regardless 
947         of the consumers or producers width/height image request. 
948
949         The test_image and audio flags are used to determine when images and audio
950         should be synthesised.
951
952         Additional properties may be provided by the producer implementation, and
953         filters, transitions and consumers may add additional properties to
954         communicate specific requests. These are documented in modules.txt.
955
956         The complete API for the mlt frame is as follows:
957
958         mlt_frame mlt_frame_init( );
959         mlt_properties mlt_frame_properties( mlt_frame this );
960         int mlt_frame_is_test_card( mlt_frame this );
961         int mlt_frame_is_test_audio( mlt_frame this );
962         double mlt_frame_get_aspect_ratio( mlt_frame this );
963         int mlt_frame_set_aspect_ratio( mlt_frame this, double value );
964         mlt_position mlt_frame_get_position( mlt_frame this );
965         int mlt_frame_set_position( mlt_frame this, mlt_position value );
966         int mlt_frame_get_image( mlt_frame this, uint8_t **buffer, mlt_image_format *format, int *width, int *height, int writable );
967         uint8_t *mlt_frame_get_alpha_mask( mlt_frame this );
968         int mlt_frame_get_audio( mlt_frame this, int16_t **buffer, mlt_audio_format *format, int *frequency, int *channels, int *samples );
969         int mlt_frame_push_get_image( mlt_frame this, mlt_get_image get_image );
970         mlt_get_image mlt_frame_pop_get_image( mlt_frame this );
971         int mlt_frame_push_frame( mlt_frame this, mlt_frame that );
972         mlt_frame mlt_frame_pop_frame( mlt_frame this );
973         int mlt_frame_push_service( mlt_frame this, void *that );
974         void *mlt_frame_pop_service( mlt_frame this );
975         int mlt_frame_push_audio( mlt_frame this, void *that );
976         void *mlt_frame_pop_audio( mlt_frame this );
977         void mlt_frame_close( mlt_frame this );
978
979
980 mlt_service:
981
982         The service base class extends properties and allows 0 to m inputs and 0 to
983         n outputs and is represented as follows:
984
985             +-----------+
986         - ->|           |- ->
987         - ->|  Service  |- ->
988         - ->|           |
989             +-----------+
990             | properties|
991             +-----------+
992
993         Descendents of service impose restrictions on how inputs and outputs can be 
994         connected and will provide a basic set of properties. Typically, the service 
995         instance is encapsulated by the descendent in order for it to ensure that
996         its connection rules are followed.
997
998         A service does not define any properties when constructed. It should be
999         noted that producers, filters and transitions my be serialised (say, via the
1000         westley consumer), and care should be taken to distinguish between
1001         serialisable and transient properties. The convention used is to prefix
1002         transient properties with an underscore.
1003
1004         The public interface is defined by the following functions:
1005
1006         int mlt_service_init( mlt_service this, void *child );
1007         mlt_properties mlt_service_properties( mlt_service this );
1008         int mlt_service_connect_producer( mlt_service this, mlt_service producer, int index );
1009         int mlt_service_get_frame( mlt_service this, mlt_frame_ptr frame, int index );
1010         void mlt_service_close( mlt_service this );
1011
1012         Typically, only direct descendents of services need invoke these methods and
1013         developers are encouraged to use those extensions when defining new services. 
1014
1015
1016 mlt_producer:
1017
1018         A producer has 0 inputs and 1 output:
1019
1020             +-----------+
1021             |           |
1022             | Producer  |--->
1023             |           |
1024             +-----------+
1025             | service   |
1026             +-----------+
1027
1028         A producer provides an abstraction for file readers, pipes, streams or any
1029         other image or audio input. 
1030
1031         When instantiated, a producer has the following properties:
1032
1033         +------------------+------------------------------------+------------------+
1034         |Name              |Description                         |Values            |
1035         +------------------+------------------------------------+------------------+
1036         |mlt_type          |The producers type                  |mlt_producer      |
1037         +------------------+------------------------------------+------------------+
1038         |_position         |The producers frame position        |0 to n            |
1039         +------------------+------------------------------------+------------------+
1040         |_speed            |The producers speed                 |double            |
1041         +------------------+------------------------------------+------------------+
1042         |fps               |The output frames per second        |25 or 29.97       |
1043         +------------------+------------------------------------+------------------+
1044         |in                |The in point in frames              |0 to length - 1   |
1045         +------------------+------------------------------------+------------------+
1046         |out               |The out point in frames             |in to length - 1  |
1047         +------------------+------------------------------------+------------------+
1048         |length            |The length of the input in frames   |0 to n            |
1049         +------------------+------------------------------------+------------------+
1050         |aspect_ratio      |aspect_ratio of the source          |0 to n            |
1051         +------------------+------------------------------------+------------------+
1052         |eof               |end of clip behaviour               |"pause" or "loop" |
1053         +------------------+------------------------------------+------------------+
1054         |resource          |Constructor argument (ie: file name)|"<resource>"      |
1055         +------------------+------------------------------------+------------------+
1056
1057         Additional properties may be provided by the producer implementation.
1058
1059         The public interface is defined by the following functions:
1060
1061         mlt_producer mlt_producer_new( );
1062         int mlt_producer_init( mlt_producer this, void *child );
1063         mlt_service mlt_producer_service( mlt_producer this );
1064         mlt_properties mlt_producer_properties( mlt_producer this );
1065         int mlt_producer_seek( mlt_producer this, mlt_position position );
1066         mlt_position mlt_producer_position( mlt_producer this );
1067         mlt_position mlt_producer_frame( mlt_producer this );
1068         int mlt_producer_set_speed( mlt_producer this, double speed );
1069         double mlt_producer_get_speed( mlt_producer this );
1070         double mlt_producer_get_fps( mlt_producer this );
1071         int mlt_producer_set_in_and_out( mlt_producer this, mlt_position in, mlt_position out );
1072         mlt_position mlt_producer_get_in( mlt_producer this );
1073         mlt_position mlt_producer_get_out( mlt_producer this );
1074         mlt_position mlt_producer_get_playtime( mlt_producer this );
1075         mlt_position mlt_producer_get_length( mlt_producer this );
1076         void mlt_producer_prepare_next( mlt_producer this );
1077         void mlt_producer_close( mlt_producer this );
1078
1079
1080 mlt_filter:
1081
1082         The public interface is defined by the following functions:
1083
1084         int mlt_filter_init( mlt_filter this, void *child );
1085         mlt_filter mlt_filter_new( );
1086         mlt_service mlt_filter_service( mlt_filter this );
1087         mlt_properties mlt_filter_properties( mlt_filter this );
1088         mlt_frame mlt_filter_process( mlt_filter this, mlt_frame that );
1089         int mlt_filter_connect( mlt_filter this, mlt_service producer, int index );
1090         void mlt_filter_set_in_and_out( mlt_filter this, mlt_position in, mlt_position out );
1091         int mlt_filter_get_track( mlt_filter this );
1092         mlt_position mlt_filter_get_in( mlt_filter this );
1093         mlt_position mlt_filter_get_out( mlt_filter this );
1094         void mlt_filter_close( mlt_filter );
1095
1096
1097 mlt_transition:
1098
1099         The public interface is defined by the following functions:
1100
1101         int mlt_transition_init( mlt_transition this, void *child );
1102         mlt_transition mlt_transition_new( );
1103         mlt_service mlt_transition_service( mlt_transition this );
1104         mlt_properties mlt_transition_properties( mlt_transition this );
1105         int mlt_transition_connect( mlt_transition this, mlt_service producer, int a_track, int b_track );
1106         void mlt_transition_set_in_and_out( mlt_transition this, mlt_position in, mlt_position out );
1107         int mlt_transition_get_a_track( mlt_transition this );
1108         int mlt_transition_get_b_track( mlt_transition this );
1109         mlt_position mlt_transition_get_in( mlt_transition this );
1110         mlt_position mlt_transition_get_out( mlt_transition this );
1111         mlt_frame mlt_transition_process( mlt_transition this, mlt_frame a_frame, mlt_frame b_frame );
1112         void mlt_transition_close( mlt_transition this );
1113
1114
1115 mlt_consumer:
1116
1117         The public interface is defined by the following functions:
1118
1119         int mlt_consumer_init( mlt_consumer this, void *child );
1120         mlt_service mlt_consumer_service( mlt_consumer this );
1121         mlt_properties mlt_consumer_properties( mlt_consumer this );
1122         int mlt_consumer_connect( mlt_consumer this, mlt_service producer );
1123         int mlt_consumer_start( mlt_consumer this );
1124         mlt_frame mlt_consumer_get_frame( mlt_consumer this );
1125         mlt_frame mlt_consumer_rt_frame( mlt_consumer this );
1126         int mlt_consumer_stop( mlt_consumer this );
1127         int mlt_consumer_is_stopped( mlt_consumer this );
1128         void mlt_consumer_close( mlt_consumer );
1129
1130
1131 Specialised Producers:
1132
1133         There are two major types of specialised producers - playlists and tractors.
1134
1135         The following sections describe these.
1136
1137
1138 mlt_playlist:
1139
1140         mlt_playlist mlt_playlist_init( );
1141         mlt_producer mlt_playlist_producer( mlt_playlist this );
1142         mlt_service mlt_playlist_service( mlt_playlist this );
1143         mlt_properties mlt_playlist_properties( mlt_playlist this );
1144         int mlt_playlist_count( mlt_playlist this );
1145         int mlt_playlist_clear( mlt_playlist this );
1146         int mlt_playlist_append( mlt_playlist this, mlt_producer producer );
1147         int mlt_playlist_append_io( mlt_playlist this, mlt_producer producer, mlt_position in, mlt_position out );
1148         int mlt_playlist_blank( mlt_playlist this, mlt_position length );
1149         mlt_position mlt_playlist_clip( mlt_playlist this, mlt_whence whence, int index );
1150         int mlt_playlist_current_clip( mlt_playlist this );
1151         mlt_producer mlt_playlist_current( mlt_playlist this );
1152         int mlt_playlist_get_clip_info( mlt_playlist this, mlt_playlist_clip_info *info, int index );
1153         int mlt_playlist_insert( mlt_playlist this, mlt_producer producer, int where, mlt_position in, mlt_position out );
1154         int mlt_playlist_remove( mlt_playlist this, int where );
1155         int mlt_playlist_move( mlt_playlist this, int from, int to );
1156         int mlt_playlist_resize_clip( mlt_playlist this, int clip, mlt_position in, mlt_position out );
1157         void mlt_playlist_close( mlt_playlist this );
1158
1159 mlt_tractor: