]> git.sesse.net Git - mlt/blob - mlt/src/tests/charlie.c
field and playlist provisional implementations
[mlt] / mlt / src / tests / charlie.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #include <framework/mlt.h>
6
7 mlt_producer create_producer( char *file )
8 {
9         mlt_producer result = NULL;
10
11         // 1st Line preferences
12         if ( strstr( file, ".mpg" ) )
13                 result = mlt_factory_producer( "mcmpeg", file );
14         else if ( strstr( file, ".mpeg" ) )
15                 result = mlt_factory_producer( "mcmpeg", file );
16         else if ( strstr( file, ".dv" ) )
17                 result = mlt_factory_producer( "mcdv", file );
18         else if ( strstr( file, ".dif" ) )
19                 result = mlt_factory_producer( "mcdv", file );
20         else if ( strstr( file, ".jpg" ) )
21                 result = mlt_factory_producer( "pixbuf", file );
22         else if ( strstr( file, ".png" ) )
23                 result = mlt_factory_producer( "pixbuf", file );
24
25         // 2nd Line fallbacks
26         if ( result == NULL && strstr( file, ".dv" ) )
27                 result = mlt_factory_producer( "libdv", file );
28         else if ( result == NULL && strstr( file, ".dif" ) )
29                 result = mlt_factory_producer( "libdv", file );
30
31         return result;
32 }
33
34 mlt_consumer create_consumer( char *id )
35 {
36         char *arg = strchr( id, ':' );
37         if ( arg != NULL )
38                 *arg ++ = '\0';
39         return mlt_factory_consumer( id, arg );
40 }
41
42 void track_service( mlt_field field, void *service, mlt_destructor destructor )
43 {
44         mlt_properties properties = mlt_field_properties( field );
45         int registered = mlt_properties_get_int( properties, "registered" );
46         char *key = mlt_properties_get( properties, "registered" );
47         mlt_properties_set_data( properties, key, service, 0, destructor, NULL );
48         mlt_properties_set_int( properties, "registered", ++ registered );
49 }
50
51 mlt_filter create_filter( mlt_field field, char *id, int track )
52 {
53         char *arg = strchr( id, ':' );
54         if ( arg != NULL )
55                 *arg ++ = '\0';
56         mlt_filter filter = mlt_factory_filter( id, arg );
57         if ( filter != NULL )
58         {
59                 mlt_field_plant_filter( field, filter, track );
60                 track_service( field, filter, ( mlt_destructor )mlt_filter_close );
61         }
62         return filter;
63 }
64
65 void set_properties( mlt_service service, char *namevalue )
66 {
67         mlt_properties properties = mlt_service_properties( service );
68         mlt_properties_parse( properties, namevalue );
69 }
70
71 void transport( mlt_producer producer )
72 {
73         char temp[ 132 ];
74         fprintf( stderr, "Press return to continue\n" );
75         fgets( temp, 132, stdin );
76 }
77
78 int main( int argc, char **argv )
79 {
80         int i;
81         mlt_service  service = NULL;
82         mlt_consumer consumer = NULL;
83         mlt_multitrack multitrack = NULL;
84         mlt_tractor tractor = NULL;
85         mlt_producer producer = NULL;
86         mlt_playlist playlist = NULL;
87         mlt_field field = NULL;
88
89         // Construct the factory
90         mlt_factory_init( getenv( "MLT_REPOSITORY" ) );
91
92         // Set up containers
93         playlist = mlt_playlist_init( );
94         multitrack = mlt_multitrack_init( );
95         tractor = mlt_tractor_init( );
96
97         // Field must be connected on construction
98         field = mlt_field_init( mlt_multitrack_service( multitrack ) );
99         mlt_properties properties = mlt_field_properties( field );
100         mlt_properties_set_int( properties, "registered", 0 );
101
102         // Parse the arguments
103         for ( i = 1; i < argc; i ++ )
104         {
105                 if ( !strcmp( argv[ i ], "-consumer" ) )
106                 {
107                         consumer = create_consumer( argv[ ++ i ] );
108                         if ( consumer != NULL )
109                                 service = mlt_consumer_service( consumer );
110                 }
111                 else if ( !strcmp( argv[ i ], "-filter" ) )
112                 {
113                         mlt_filter filter = create_filter( field, argv[ ++ i ], 0 );
114                         if ( filter != NULL )
115                                 service = mlt_filter_service( filter );
116                 }
117                 else if ( !strstr( argv[ i ], "=" ) )
118                 {
119                         if ( producer != NULL )
120                                 mlt_playlist_append( playlist, producer );
121                         producer = create_producer( argv[ i ] );
122                         if ( producer != NULL )
123                                 service = mlt_producer_service( producer );
124                 }
125                 else
126                 {
127                         set_properties( service, argv[ i ] );
128                 }
129         }
130
131         // If we have no consumer, default to sdl
132         if ( consumer == NULL )
133                 consumer= mlt_factory_consumer( "sdl", NULL );
134
135         // Connect producer to playlist
136         mlt_playlist_append( playlist, producer );
137
138         // Connect multitrack to producer
139         mlt_multitrack_connect( multitrack, mlt_playlist_producer( playlist ), 0 );
140
141         // Connect tractor to field
142         mlt_tractor_connect( tractor, mlt_field_service( field ) );
143
144         // Connect consumer to tractor
145         mlt_consumer_connect( consumer, mlt_tractor_service( tractor ) );
146
147         // Transport functionality
148         transport( producer );
149
150         // Close the services
151         mlt_consumer_close( consumer );
152         mlt_tractor_close( tractor );
153         mlt_field_close( field );
154         mlt_multitrack_close( multitrack );
155         mlt_producer_close( producer );
156
157         // Close the factory
158         mlt_factory_close( );
159
160         return 0;
161 }