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