]> git.sesse.net Git - mlt/blob - mlt/src/tests/charlie.c
ppm ffmpeg
[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 #include "io.h"
8
9 mlt_producer create_producer( char *file )
10 {
11         mlt_producer result = NULL;
12
13         // 1st Line preferences
14         if ( strstr( file, ".mpg" ) )
15                 result = mlt_factory_producer( "mcmpeg", file );
16         else if ( strstr( file, ".mpeg" ) )
17                 result = mlt_factory_producer( "mcmpeg", file );
18         else if ( strstr( file, ".dv" ) )
19                 result = mlt_factory_producer( "mcdv", file );
20         else if ( strstr( file, ".dif" ) )
21                 result = mlt_factory_producer( "mcdv", file );
22         else if ( strstr( file, ".jpg" ) )
23                 result = mlt_factory_producer( "pixbuf", file );
24         else if ( strstr( file, ".JPG" ) )
25                 result = mlt_factory_producer( "pixbuf", file );
26         else if ( strstr( file, ".jpeg" ) )
27                 result = mlt_factory_producer( "pixbuf", file );
28         else if ( strstr( file, ".png" ) )
29                 result = mlt_factory_producer( "pixbuf", file );
30
31         // 2nd Line fallbacks
32         if ( result == NULL && strstr( file, ".dv" ) )
33                 result = mlt_factory_producer( "libdv", file );
34         else if ( result == NULL && strstr( file, ".dif" ) )
35                 result = mlt_factory_producer( "libdv", file );
36
37         return result;
38 }
39
40 void transport_action( mlt_producer producer, char *value )
41 {
42         mlt_properties properties = mlt_producer_properties( producer );
43
44         switch( value[ 0 ] )
45         {
46                 case 'q':
47                         mlt_properties_set_int( properties, "done", 1 );
48                         break;
49                 case '0':
50                         mlt_producer_set_speed( producer, 1 );
51                         mlt_producer_seek( producer, 0 );
52                         break;
53                 case '1':
54                         mlt_producer_set_speed( producer, -5 );
55                         break;
56                 case '2':
57                         mlt_producer_set_speed( producer, -2.5 );
58                         break;
59                 case '3':
60                         mlt_producer_set_speed( producer, -1 );
61                         break;
62                 case '4':
63                         mlt_producer_set_speed( producer, -0.5 );
64                         break;
65                 case '5':
66                         mlt_producer_set_speed( producer, 0 );
67                         break;
68                 case '6':
69                         mlt_producer_set_speed( producer, 0.5 );
70                         break;
71                 case '7':
72                         mlt_producer_set_speed( producer, 1 );
73                         break;
74                 case '8':
75                         mlt_producer_set_speed( producer, 2.5 );
76                         break;
77                 case '9':
78                         mlt_producer_set_speed( producer, 5 );
79                         break;
80         }
81 }
82
83 mlt_consumer create_consumer( char *id, mlt_producer producer )
84 {
85         char *arg = strchr( id, ':' );
86         if ( arg != NULL )
87                 *arg ++ = '\0';
88         mlt_consumer consumer = mlt_factory_consumer( id, arg );
89         if ( consumer != NULL )
90         {
91                 mlt_properties properties = mlt_consumer_properties( consumer );
92                 mlt_properties_set_data( properties, "transport_callback", transport_action, 0, NULL, NULL );
93                 mlt_properties_set_data( properties, "transport_producer", producer, 0, NULL, NULL );
94         }
95         return consumer;
96 }
97
98 void track_service( mlt_field field, void *service, mlt_destructor destructor )
99 {
100         mlt_properties properties = mlt_field_properties( field );
101         int registered = mlt_properties_get_int( properties, "registered" );
102         char *key = mlt_properties_get( properties, "registered" );
103         mlt_properties_set_data( properties, key, service, 0, destructor, NULL );
104         mlt_properties_set_int( properties, "registered", ++ registered );
105 }
106
107 mlt_filter create_filter( mlt_field field, char *id, int track )
108 {
109         char *arg = strchr( id, ':' );
110         if ( arg != NULL )
111                 *arg ++ = '\0';
112         mlt_filter filter = mlt_factory_filter( id, arg );
113         if ( filter != NULL )
114         {
115                 mlt_field_plant_filter( field, filter, track );
116                 track_service( field, filter, ( mlt_destructor )mlt_filter_close );
117         }
118         return filter;
119 }
120
121 void set_properties( mlt_service service, char *namevalue )
122 {
123         mlt_properties properties = mlt_service_properties( service );
124         mlt_properties_parse( properties, namevalue );
125 }
126
127 void transport( mlt_producer producer )
128 {
129         mlt_properties properties = mlt_producer_properties( producer );
130
131         term_init( );
132         fprintf( stderr, "Press 'q' to continue\n" );
133         while( mlt_properties_get_int( properties, "done" ) == 0 )
134         {
135                 int value = term_read( );
136                 if ( value != -1 )
137                         transport_action( producer, ( char * )&value );
138         }
139 }
140
141 int main( int argc, char **argv )
142 {
143         int i;
144         mlt_service  service = NULL;
145         mlt_consumer consumer = NULL;
146         mlt_multitrack multitrack = NULL;
147         mlt_producer producer = NULL;
148         mlt_playlist playlist = NULL;
149         mlt_field field = NULL;
150
151         // Construct the factory
152         mlt_factory_init( getenv( "MLT_REPOSITORY" ) );
153
154         // Set up containers
155         playlist = mlt_playlist_init( );
156
157         // Construct the field
158         field = mlt_field_init( );
159
160         // We need to track the number of registered filters
161         mlt_properties properties = mlt_field_properties( field );
162         mlt_properties_set_int( properties, "registered", 0 );
163
164         // Get the multitrack from the field
165         multitrack = mlt_field_multitrack( field );
166
167         // Parse the arguments
168         for ( i = 1; i < argc; i ++ )
169         {
170                 if ( !strcmp( argv[ i ], "-consumer" ) )
171                 {
172                         consumer = create_consumer( argv[ ++ i ], mlt_multitrack_producer( multitrack ) );
173                         if ( consumer != NULL )
174                                 service = mlt_consumer_service( consumer );
175                 }
176                 else if ( !strcmp( argv[ i ], "-filter" ) )
177                 {
178                         mlt_filter filter = create_filter( field, argv[ ++ i ], 0 );
179                         if ( filter != NULL )
180                                 service = mlt_filter_service( filter );
181                 }
182                 else if ( !strstr( argv[ i ], "=" ) )
183                 {
184                         if ( producer != NULL )
185                                 mlt_playlist_append( playlist, producer );
186                         producer = create_producer( argv[ i ] );
187                         if ( producer != NULL )
188                                 service = mlt_producer_service( producer );
189                 }
190                 else
191                 {
192                         set_properties( service, argv[ i ] );
193                 }
194         }
195
196         // If we have no consumer, default to sdl
197         if ( consumer == NULL )
198                 consumer = create_consumer( "sdl", mlt_multitrack_producer( multitrack ) );
199
200         // Connect producer to playlist
201         if ( producer != NULL )
202                 mlt_playlist_append( playlist, producer );
203
204         // Connect multitrack to producer
205         mlt_multitrack_connect( multitrack, mlt_playlist_producer( playlist ), 0 );
206
207         // Connect consumer to tractor
208         mlt_consumer_connect( consumer, mlt_field_service( field ) );
209
210         // Transport functionality
211         transport( mlt_multitrack_producer( multitrack ) );
212
213         // Close the services
214         mlt_consumer_close( consumer );
215         mlt_field_close( field );
216         mlt_producer_close( producer );
217
218         // Close the factory
219         mlt_factory_close( );
220
221         return 0;
222 }