1 /**
2  * MltParser.cpp - MLT Wrapper
3  * Copyright (C) 2004-2015 Meltytech, LLC
4  * Author: Charles Yates <charles.yates@gmail.com>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19  */
20 
21 #include "Mlt.h"
22 using namespace Mlt;
23 
on_invalid_cb(mlt_parser self,mlt_service object)24 static int on_invalid_cb( mlt_parser self, mlt_service object )
25 {
26 	mlt_properties properties = mlt_parser_properties( self );
27 	Parser *parser = ( Parser * )mlt_properties_get_data( properties, "_parser_object", NULL );
28 	Service service( object );
29 	return parser->on_invalid( &service );
30 }
31 
on_unknown_cb(mlt_parser self,mlt_service object)32 static int on_unknown_cb( mlt_parser self, mlt_service object )
33 {
34 	mlt_properties properties = mlt_parser_properties( self );
35 	Parser *parser = ( Parser * )mlt_properties_get_data( properties, "_parser_object", NULL );
36 	Service service( object );
37 	return parser->on_unknown( &service );
38 }
39 
on_start_producer_cb(mlt_parser self,mlt_producer object)40 static int on_start_producer_cb( mlt_parser self, mlt_producer object )
41 {
42 	mlt_properties properties = mlt_parser_properties( self );
43 	Parser *parser = ( Parser * )mlt_properties_get_data( properties, "_parser_object", NULL );
44 	Producer producer( object );
45 	return parser->on_start_producer( &producer );
46 }
47 
on_end_producer_cb(mlt_parser self,mlt_producer object)48 static int on_end_producer_cb( mlt_parser self, mlt_producer object )
49 {
50 	mlt_properties properties = mlt_parser_properties( self );
51 	Parser *parser = ( Parser * )mlt_properties_get_data( properties, "_parser_object", NULL );
52 	Producer producer( object );
53 	return parser->on_end_producer( &producer );
54 }
55 
on_start_playlist_cb(mlt_parser self,mlt_playlist object)56 static int on_start_playlist_cb( mlt_parser self, mlt_playlist object )
57 {
58 	mlt_properties properties = mlt_parser_properties( self );
59 	Parser *parser = ( Parser * )mlt_properties_get_data( properties, "_parser_object", NULL );
60 	Playlist playlist( object );
61 	return parser->on_start_playlist( &playlist );
62 }
63 
on_end_playlist_cb(mlt_parser self,mlt_playlist object)64 static int on_end_playlist_cb( mlt_parser self, mlt_playlist object )
65 {
66 	mlt_properties properties = mlt_parser_properties( self );
67 	Parser *parser = ( Parser * )mlt_properties_get_data( properties, "_parser_object", NULL );
68 	Playlist playlist( object );
69 	return parser->on_end_playlist( &playlist );
70 }
71 
on_start_tractor_cb(mlt_parser self,mlt_tractor object)72 static int on_start_tractor_cb( mlt_parser self, mlt_tractor object )
73 {
74 	mlt_properties properties = mlt_parser_properties( self );
75 	Parser *parser = ( Parser * )mlt_properties_get_data( properties, "_parser_object", NULL );
76 	Tractor tractor( object );
77 	return parser->on_start_tractor( &tractor );
78 }
79 
on_end_tractor_cb(mlt_parser self,mlt_tractor object)80 static int on_end_tractor_cb( mlt_parser self, mlt_tractor object )
81 {
82 	mlt_properties properties = mlt_parser_properties( self );
83 	Parser *parser = ( Parser * )mlt_properties_get_data( properties, "_parser_object", NULL );
84 	Tractor tractor( object );
85 	return parser->on_end_tractor( &tractor );
86 }
87 
on_start_multitrack_cb(mlt_parser self,mlt_multitrack object)88 static int on_start_multitrack_cb( mlt_parser self, mlt_multitrack object )
89 {
90 	mlt_properties properties = mlt_parser_properties( self );
91 	Parser *parser = ( Parser * )mlt_properties_get_data( properties, "_parser_object", NULL );
92 	Multitrack multitrack( object );
93 	return parser->on_start_multitrack( &multitrack );
94 }
95 
on_end_multitrack_cb(mlt_parser self,mlt_multitrack object)96 static int on_end_multitrack_cb( mlt_parser self, mlt_multitrack object )
97 {
98 	mlt_properties properties = mlt_parser_properties( self );
99 	Parser *parser = ( Parser * )mlt_properties_get_data( properties, "_parser_object", NULL );
100 	Multitrack multitrack( object );
101 	return parser->on_end_multitrack( &multitrack );
102 }
103 
on_start_track_cb(mlt_parser self)104 static int on_start_track_cb( mlt_parser self )
105 {
106 	mlt_properties properties = mlt_parser_properties( self );
107 	Parser *parser = ( Parser * )mlt_properties_get_data( properties, "_parser_object", NULL );
108 	return parser->on_start_track( );
109 }
110 
on_end_track_cb(mlt_parser self)111 static int on_end_track_cb( mlt_parser self )
112 {
113 	mlt_properties properties = mlt_parser_properties( self );
114 	Parser *parser = ( Parser * )mlt_properties_get_data( properties, "_parser_object", NULL );
115 	return parser->on_end_track( );
116 }
117 
on_start_filter_cb(mlt_parser self,mlt_filter object)118 static int on_start_filter_cb( mlt_parser self, mlt_filter object )
119 {
120 	mlt_properties properties = mlt_parser_properties( self );
121 	Parser *parser = ( Parser * )mlt_properties_get_data( properties, "_parser_object", NULL );
122 	Filter filter( object );
123 	return parser->on_start_filter( &filter );
124 }
125 
on_end_filter_cb(mlt_parser self,mlt_filter object)126 static int on_end_filter_cb( mlt_parser self, mlt_filter object )
127 {
128 	mlt_properties properties = mlt_parser_properties( self );
129 	Parser *parser = ( Parser * )mlt_properties_get_data( properties, "_parser_object", NULL );
130 	Filter filter( object );
131 	return parser->on_end_filter( &filter );
132 }
133 
on_start_transition_cb(mlt_parser self,mlt_transition object)134 static int on_start_transition_cb( mlt_parser self, mlt_transition object )
135 {
136 	mlt_properties properties = mlt_parser_properties( self );
137 	Parser *parser = ( Parser * )mlt_properties_get_data( properties, "_parser_object", NULL );
138 	Transition transition( object );
139 	return parser->on_start_transition( &transition );
140 }
141 
on_end_transition_cb(mlt_parser self,mlt_transition object)142 static int on_end_transition_cb( mlt_parser self, mlt_transition object )
143 {
144 	mlt_properties properties = mlt_parser_properties( self );
145 	Parser *parser = ( Parser * )mlt_properties_get_data( properties, "_parser_object", NULL );
146 	Transition transition( object );
147 	return parser->on_end_transition( &transition );
148 }
149 
on_start_chain_cb(mlt_parser self,mlt_chain object)150 static int on_start_chain_cb( mlt_parser self, mlt_chain object )
151 {
152 	mlt_properties properties = mlt_parser_properties( self );
153 	Parser *parser = ( Parser * )mlt_properties_get_data( properties, "_parser_object", NULL );
154 	Chain chain( object );
155 	return parser->on_start_chain( &chain );
156 }
157 
on_end_chain_cb(mlt_parser self,mlt_chain object)158 static int on_end_chain_cb( mlt_parser self, mlt_chain object )
159 {
160 	mlt_properties properties = mlt_parser_properties( self );
161 	Parser *parser = ( Parser * )mlt_properties_get_data( properties, "_parser_object", NULL );
162 	Chain chain( object );
163 	return parser->on_end_chain( &chain );
164 }
165 
on_start_link_cb(mlt_parser self,mlt_link object)166 static int on_start_link_cb( mlt_parser self, mlt_link object )
167 {
168 	mlt_properties properties = mlt_parser_properties( self );
169 	Parser *parser = ( Parser * )mlt_properties_get_data( properties, "_parser_object", NULL );
170 	Link link( object );
171 	return parser->on_start_link( &link );
172 }
173 
on_end_link_cb(mlt_parser self,mlt_link object)174 static int on_end_link_cb( mlt_parser self, mlt_link object )
175 {
176 	mlt_properties properties = mlt_parser_properties( self );
177 	Parser *parser = ( Parser * )mlt_properties_get_data( properties, "_parser_object", NULL );
178 	Link link( object );
179 	return parser->on_end_link( &link );
180 }
181 
Parser()182 Parser::Parser( ) :
183 	Properties( false )
184 {
185 	parser = mlt_parser_new( );
186 	set( "_parser_object", this, 0 );
187 	parser->on_invalid = on_invalid_cb;
188 	parser->on_unknown = on_unknown_cb;
189 	parser->on_start_producer = on_start_producer_cb;
190 	parser->on_end_producer = on_end_producer_cb;
191 	parser->on_start_playlist = on_start_playlist_cb;
192 	parser->on_end_playlist = on_end_playlist_cb;
193 	parser->on_start_tractor = on_start_tractor_cb;
194 	parser->on_end_tractor = on_end_tractor_cb;
195 	parser->on_start_multitrack = on_start_multitrack_cb;
196 	parser->on_end_multitrack = on_end_multitrack_cb;
197 	parser->on_start_track = on_start_track_cb;
198 	parser->on_end_track = on_end_track_cb;
199 	parser->on_start_filter = on_start_filter_cb;
200 	parser->on_end_filter = on_end_filter_cb;
201 	parser->on_start_transition = on_start_transition_cb;
202 	parser->on_end_transition = on_end_transition_cb;
203 	parser->on_start_chain = on_start_chain_cb;
204 	parser->on_end_chain = on_end_chain_cb;
205 	parser->on_start_link = on_start_link_cb;
206 	parser->on_end_link = on_end_link_cb;
207 }
208 
~Parser()209 Parser::~Parser( )
210 {
211 	mlt_parser_close( parser );
212 }
213 
get_properties()214 mlt_properties Parser::get_properties( )
215 {
216 	return mlt_parser_properties( parser );
217 }
218 
start(Service & service)219 int Parser::start( Service &service )
220 {
221 	return mlt_parser_start( parser, service.get_service( ) );
222 }
223 
on_invalid(Service * object)224 int Parser::on_invalid( Service *object )
225 {
226 	object->debug( "Invalid" );
227 	return 0;
228 }
229 
on_unknown(Service * object)230 int Parser::on_unknown( Service *object )
231 {
232 	object->debug( "Unknown" );
233 	return 0;
234 }
235 
on_start_producer(Producer * object)236 int Parser::on_start_producer( Producer *object )
237 {
238 	object->debug( "on_start_producer" );
239 	return 0;
240 }
241 
on_end_producer(Producer * object)242 int Parser::on_end_producer( Producer *object )
243 {
244 	object->debug( "on_end_producer" );
245 	return 0;
246 }
247 
on_start_playlist(Playlist * object)248 int Parser::on_start_playlist( Playlist *object )
249 {
250 	object->debug( "on_start_playlist" );
251 	return 0;
252 }
253 
on_end_playlist(Playlist * object)254 int Parser::on_end_playlist( Playlist *object )
255 {
256 	object->debug( "on_end_playlist" );
257 	return 0;
258 }
259 
on_start_tractor(Tractor * object)260 int Parser::on_start_tractor( Tractor *object )
261 {
262 	object->debug( "on_start_tractor" );
263 	return 0;
264 }
265 
on_end_tractor(Tractor * object)266 int Parser::on_end_tractor( Tractor *object )
267 {
268 	object->debug( "on_end_tractor" );
269 	return 0;
270 }
271 
on_start_multitrack(Multitrack * object)272 int Parser::on_start_multitrack( Multitrack *object )
273 {
274 	object->debug( "on_start_multitrack" );
275 	return 0;
276 }
277 
on_end_multitrack(Multitrack * object)278 int Parser::on_end_multitrack( Multitrack *object )
279 {
280 	object->debug( "on_end_multitrack" );
281 	return 0;
282 }
283 
on_start_track()284 int Parser::on_start_track( )
285 {
286 	fprintf( stderr, "on_start_track\n" );
287 	return 0;
288 }
289 
on_end_track()290 int Parser::on_end_track( )
291 {
292 	fprintf( stderr, "on_end_track\n" );
293 	return 0;
294 }
295 
on_start_filter(Filter * object)296 int Parser::on_start_filter( Filter *object )
297 {
298 	object->debug( "on_start_filter" );
299 	return 0;
300 }
301 
on_end_filter(Filter * object)302 int Parser::on_end_filter( Filter *object )
303 {
304 	object->debug( "on_end_filter" );
305 	return 0;
306 }
307 
on_start_transition(Transition * object)308 int Parser::on_start_transition( Transition *object )
309 {
310 	object->debug( "on_start_transition" );
311 	return 0;
312 }
313 
on_end_transition(Transition * object)314 int Parser::on_end_transition( Transition *object )
315 {
316 	object->debug( "on_end_transition" );
317 	return 0;
318 }
319 
on_start_chain(Chain * object)320 int Parser::on_start_chain( Chain *object )
321 {
322 	object->debug( "on_start_chain" );
323 	return 0;
324 }
325 
on_end_chain(Chain * object)326 int Parser::on_end_chain( Chain *object )
327 {
328 	object->debug( "on_end_chain" );
329 	return 0;
330 }
331 
on_start_link(Link * object)332 int Parser::on_start_link( Link *object )
333 {
334 	object->debug( "on_start_link" );
335 	return 0;
336 }
337 
on_end_link(Link * object)338 int Parser::on_end_link( Link *object )
339 {
340 	object->debug( "on_end_link" );
341 	return 0;
342 }
343