804
855
// This is used to know when the playing stopped
805
856
if (m_mltProducer && !m_generateScenelist) {
806
857
double pos = m_mltProducer->position();
807
QApplication::postEvent(qApp->mainWidget(), new PositionChangeEvent(GenTime((int) pos, m_fps), m_monitorId + 100));
858
if (qApp->mainWidget()) QApplication::postEvent(qApp->mainWidget(), new PositionChangeEvent(GenTime((int) pos, m_fps), m_monitorId + 100));
808
859
//new QCustomEvent(10002));
813
/* FILE RENDERING STUFF */
815
#ifdef ENABLE_FIREWIRE
818
int fileProgress = 0;
819
int droppedFrames = 0;
821
// FIREWIRE EXPORT, REQUIRES LIBIECi61883
822
static int read_frame (unsigned char *data, int n, unsigned int dropped, void *callback_data)
824
FILE *f = (FILE*) callback_data;
828
if (fread (data, 480, 1, f) < 1) {
831
//long int position = ftell(f);
840
static int g_done = 0;
842
static void sighandler (int sig)
847
void KRender::dv_transmit( raw1394handle_t handle, FILE *f, int channel)
850
unsigned char data[480];
853
fread (data, 480, 1, f);
854
ispal = (data[ 3 ] & 0x80) != 0;
855
dv = iec61883_dv_xmit_init (handle, ispal, read_frame, (void *)f );
857
if (dv) iec61883_dv_set_synch( dv, 1 );
859
if (dv && iec61883_dv_xmit_start (dv, channel) == 0)
861
int fd = raw1394_get_fd (handle);
866
signal (SIGINT, sighandler);
867
signal (SIGPIPE, sighandler);
868
fprintf (stderr, "Starting to transmit %s\n", ispal ? "PAL" : "NTSC");
875
if (select (fd + 1, &rfds, NULL, NULL, &tv) > 0) {
876
result = raw1394_loop_iterate (handle);
877
if (((int)(readCount * 100 / fileSize )) != fileProgress) {
878
fileProgress = readCount * 100 / fileSize;
879
//kdDebug()<<"++ FRAME READ2: "<<fileProgress<<endl;
880
QApplication::postEvent(qApp->mainWidget(), new ProgressEvent(fileProgress, 10006));
881
qApp->processEvents();
885
} while (g_done == 0 && result == 0);
886
iec61883_dv_xmit_stop (dv);
887
droppedFrames = iec61883_dv_get_dropped(dv);
888
fprintf (stderr, "done.\n");
890
iec61883_dv_close (dv);
894
865
void KRender::exportFileToFirewire(QString srcFileName, int port, GenTime startTime, GenTime endTime)
896
#ifdef ENABLE_FIREWIRE
897
//exportTimeline(QString::null);
898
kdDebug()<<"START DV EXPORT ++++++++++++++: "<<srcFileName<<endl;
900
fileSize = QFile(srcFileName).size() / 480;
905
int oplug = -1, iplug = -1;
906
f = fopen (decodedString(srcFileName), "rb");
907
raw1394handle_t handle = raw1394_new_handle_on_port (port);
909
KMessageBox::sorry(0,i18n("Cannot open file: ")+srcFileName.ascii());
912
if (handle == NULL) {
913
KMessageBox::sorry(0,i18n("NO firewire access on that port\nMake sure you have loaded the raw1394 module and that you have write access on /dev/raw1394..."));
916
nodeid_t node = 0xffc0;
918
int channel = iec61883_cmp_connect (handle, raw1394_get_local_id (handle), &oplug, node, &iplug, &bandwidth);
921
dv_transmit (handle, f, channel);
922
iec61883_cmp_disconnect (handle, raw1394_get_local_id (handle), oplug, node, iplug, channel, bandwidth);
924
else KMessageBox::sorry(0,i18n("NO DV device found"));
926
raw1394_destroy_handle (handle);
927
QApplication::postEvent(qApp->mainWidget(), new QCustomEvent(10003));
928
if (droppedFrames > 0) KMessageBox::sorry(0, i18n("Transmission of dv file is finished.\n%1 frames were dropped during transfer.").arg(droppedFrames));
929
else KMessageBox::information(0, i18n("Transmission of dv file finished successfully."));
931
867
KMessageBox::sorry(0, i18n("Firewire is not enabled on your system.\n Please install Libiec61883 and recompile Kdenlive"));
956
891
pix.save(url.path(), "PNG");
957
QApplication::postEvent(qApp->mainWidget(), new UrlEvent(url, 10003));
892
if (notify) QApplication::postEvent(qApp->mainWidget(), new UrlEvent(url, 10003));
895
/** MLT PLAYLIST DIRECT MANIPULATON **/
898
void KRender::mltCheckLength()
900
//kdDebug()<<"checking track length: "<<track<<".........."<<endl;
901
Mlt::Service service(m_mltProducer->get_service());
902
Mlt::Tractor tractor(service);
904
int trackNb = tractor.count( );
906
double trackDuration;
908
Mlt::Producer trackProducer(tractor.track(0));
909
Mlt::Playlist trackPlaylist(( mlt_playlist ) trackProducer.get_service());
910
duration = Mlt::Producer(trackPlaylist.get_producer()).get_playtime() - 1;
911
m_mltProducer->set("out", duration);
912
emit durationChanged();
915
while (trackNb > 1) {
916
Mlt::Producer trackProducer(tractor.track(trackNb - 1));
917
Mlt::Playlist trackPlaylist(( mlt_playlist ) trackProducer.get_service());
918
trackDuration = Mlt::Producer(trackPlaylist.get_producer()).get_playtime() - 1;
920
kdDebug()<<" / / /DURATON FOR TRACK "<<trackNb - 1<<" = "<<trackDuration<<endl;
921
if (trackDuration > duration) duration = trackDuration;
925
Mlt::Producer blackTrackProducer(tractor.track(0));
926
Mlt::Playlist blackTrackPlaylist(( mlt_playlist ) blackTrackProducer.get_service());
927
double blackDuration = Mlt::Producer(blackTrackPlaylist.get_producer()).get_playtime() - 1;
928
kdDebug()<<" / / /DURATON FOR TRACK 0 = "<<blackDuration<<endl;
929
if (blackDuration != duration) {
930
blackTrackPlaylist.remove_region( 0, blackDuration );
934
while (dur > 14000) { // <producer mlt_service=\"colour\" colour=\"black\" in=\"0\" out=\"13999\" />
935
mltInsertClip(0, GenTime(i * 14000, m_fps), QString("<westley><producer mlt_service=\"colour\" colour=\"black\" in=\"0\" out=\"13999\" /></westley>"));
940
mltInsertClip(0, GenTime(), QString("<westley><producer mlt_service=\"colour\" colour=\"black\" in=\"0\" out=\"" + QString::number(dur) + "\" /></westley>"));
942
m_mltProducer->set("out", duration);
943
emit durationChanged();
948
void KRender::mltInsertClip(int track, GenTime position, QString resource)
950
if (!m_mltProducer) {
951
kdDebug()<<"PLAYLIST NOT INITIALISED //////"<<endl;
954
Mlt::Producer parentProd(m_mltProducer->parent());
955
if (parentProd.get_producer() == NULL) {
956
kdDebug()<<"PLAYLIST BROKEN, CANNOT INSERT CLIP //////"<<endl;
959
Mlt::Service service(parentProd.get_service());
960
Mlt::Tractor tractor(service);
962
Mlt::Producer trackProducer(tractor.track(track));
963
Mlt::Playlist trackPlaylist(( mlt_playlist ) trackProducer.get_service());
964
char *tmp = decodedString(resource);
965
Mlt::Producer clip("westley-xml", tmp);
966
//clip.set_in_and_out(in.frames(m_fps), out.frames(m_fps));
969
trackPlaylist.insert_at(position.frames(m_fps), clip, 1);
970
tractor.multitrack()->refresh();
972
if (track != 0) mltCheckLength();
973
double duration = Mlt::Producer(trackPlaylist.get_producer()).get_playtime();
974
kdDebug()<<"// + +INSERTING CLIP: "<<resource<<" AT: "<<position.frames(m_fps)<<" on track: "<<track<<", DURATION: "<<duration<<endl;
979
void KRender::mltCutClip(int track, GenTime position)
981
Mlt::Service service(m_mltProducer->parent().get_service());
982
if (service.type() == playlist_type) kdDebug()<<"// PLAYLIST TYPE"<<endl;
983
if (service.type() == tractor_type) kdDebug()<<"// TRACOT TYPE"<<endl;
984
if (service.type() == multitrack_type) kdDebug()<<"// MULTITRACK TYPE"<<endl;
985
if (service.type() == producer_type) kdDebug()<<"// PROD TYPE"<<endl;
987
Mlt::Tractor tractor(service);
988
Mlt::Producer trackProducer(tractor.track(track));
989
Mlt::Playlist trackPlaylist(( mlt_playlist ) trackProducer.get_service());
990
trackPlaylist.split_at(position.frames(m_fps));
991
trackPlaylist.consolidate_blanks(0);
992
kdDebug()<<"/ / / /CUTTING CLIP AT: "<<position.frames(m_fps)<<endl;
996
void KRender::mltRemoveClip(int track, GenTime position)
998
Mlt::Service service(m_mltProducer->parent().get_service());
999
if (service.type() == playlist_type) kdDebug()<<"// PLAYLIST TYPE"<<endl;
1000
if (service.type() == tractor_type) kdDebug()<<"// TRACOT TYPE"<<endl;
1001
if (service.type() == multitrack_type) kdDebug()<<"// MULTITRACK TYPE"<<endl;
1002
if (service.type() == producer_type) kdDebug()<<"// PROD TYPE"<<endl;
1004
Mlt::Tractor tractor(service);
1005
Mlt::Producer trackProducer(tractor.track(track));
1006
Mlt::Playlist trackPlaylist(( mlt_playlist ) trackProducer.get_service());
1007
int clipIndex = trackPlaylist.get_clip_index_at(position.frames(m_fps));
1008
//trackPlaylist.remove(clipIndex);
1009
trackPlaylist.replace_with_blank(clipIndex);
1010
trackPlaylist.consolidate_blanks(0);
1011
if (track != 0) mltCheckLength();
1012
//emit durationChanged();
1015
void KRender::mltRemoveEffect(int track, GenTime position, QString id, QString tag, int index)
1017
Mlt::Service service(m_mltProducer->parent().get_service());
1019
Mlt::Tractor tractor(service);
1020
Mlt::Producer trackProducer(tractor.track(track));
1021
Mlt::Playlist trackPlaylist(( mlt_playlist ) trackProducer.get_service());
1022
//int clipIndex = trackPlaylist.get_clip_index_at(position.frames(m_fps));
1023
Mlt::Producer *clip = trackPlaylist.get_clip_at(position.frames(m_fps));
1025
kdDebug()<<" / / / CANNOT FIND CLIP TO REMOVE EFFECT"<<endl;
1028
Mlt::Service clipService(clip->get_service());
1030
if (tag.startsWith("ladspa")) tag = "ladspa";
1034
Mlt::Filter *filter = clipService.filter( ct );
1036
if (filter->get("mlt_service") == tag && filter->get("kdenlive_id") == id) {
1037
clipService.detach(*filter);
1038
kdDebug()<<" / / / DLEETED EFFECT: "<<ct<<endl;
1041
filter = clipService.filter( ct );
1045
Mlt::Filter *filter = clipService.filter( index );
1046
if (filter && filter->get("mlt_service") == tag && filter->get("kdenlive_id") == id) clipService.detach(*filter);
1048
kdDebug()<<"WARINIG, FILTER "<<id<<" NOT FOUND!!!!!"<<endl;
1055
void KRender::mltAddEffect(int track, GenTime position, QString id, QString tag, QMap <QString, QString> args)
1057
Mlt::Service service(m_mltProducer->parent().get_service());
1059
Mlt::Tractor tractor(service);
1060
Mlt::Producer trackProducer(tractor.track(track));
1061
Mlt::Playlist trackPlaylist(( mlt_playlist ) trackProducer.get_service());
1063
Mlt::Producer *clip = trackPlaylist.get_clip_at(position.frames(m_fps));
1066
kdDebug()<<"********** CANNOT FIND CLIP TO APPLY EFFECT-----------"<<endl;
1069
Mlt::Service clipService(clip->get_service());
1072
kdDebug()<<" / / INSERTING EFFECT: "<<id<<endl;
1073
if (tag.startsWith("ladspa")) tag = "ladspa";
1074
char *filterId = decodedString(tag);
1075
Mlt::Filter *filter = new Mlt::Filter(filterId);
1076
filter->set("kdenlive_id", id);
1078
QMap<QString, QString>::Iterator it;
1079
QString keyFrameNumber = "#0";
1081
for ( it = args.begin(); it != args.end(); ++it ) {
1082
kdDebug()<<" / / INSERTING EFFECT ARGS: "<<it.key()<<": "<<it.data()<<endl;
1084
QString currentKeyFrameNumber;
1085
if (it.key().startsWith("#")) {
1086
currentKeyFrameNumber = it.key().section(":", 0, 0);
1087
if (currentKeyFrameNumber != keyFrameNumber) {
1088
// attach filter to the clip
1089
clipService.attach(*filter);
1090
filter = new Mlt::Filter(filterId);
1091
filter->set("kdenlive_id", id);
1092
keyFrameNumber = currentKeyFrameNumber;
1094
key = it.key().section(":", 1);
1096
else key = it.key();
1097
char *name = decodedString(key);
1098
char *value = decodedString(it.data());
1099
filter->set(name, value);
1103
// attach filter to the clip
1104
clipService.attach(*filter);
1110
void KRender::mltEditEffect(int track, GenTime position, int index, QString id, QString tag, QMap <QString, QString> args)
1112
QMap<QString, QString>::Iterator it = args.begin();
1113
if (it.key().startsWith("#") || tag.startsWith("ladspa") || tag == "sox" || tag == "autotrack_rectangle") {
1114
// This is a keyframe effect, to edit it, we remove it and re-add it.
1115
mltRemoveEffect(track, position, id, tag, -1);
1116
mltAddEffect(track, position, id, tag, args);
1121
Mlt::Service service(m_mltProducer->parent().get_service());
1123
Mlt::Tractor tractor(service);
1124
Mlt::Producer trackProducer(tractor.track(track));
1125
Mlt::Playlist trackPlaylist(( mlt_playlist ) trackProducer.get_service());
1126
//int clipIndex = trackPlaylist.get_clip_index_at(position.frames(m_fps));
1127
Mlt::Producer *clip = trackPlaylist.get_clip_at(position.frames(m_fps));
1128
Mlt::Service clipService(clip->get_service());
1129
Mlt::Filter *filter = clipService.filter( index );
1132
if (!filter || filter->get("mlt_service") != tag) {
1133
kdDebug()<<"WARINIG, FILTER NOT FOUND!!!!!"<<endl;
1135
filter = clipService.filter( index );
1137
if (filter->get("mlt_service") == tag && filter->get("kdenlive_id") == id) break;
1139
filter = clipService.filter( index );
1143
kdDebug()<<"WARINIG, FILTER "<<id<<" NOT FOUND!!!!!"<<endl;
1147
for ( it = args.begin(); it != args.end(); ++it ) {
1148
kdDebug()<<" / / INSERTING EFFECT ARGS: "<<it.key()<<": "<<it.data()<<endl;
1149
char *name = decodedString(it.key());
1150
char *value = decodedString(it.data());
1151
filter->set(name, value);
1158
void KRender::mltResizeClipEnd(int track, GenTime pos, GenTime in, GenTime out)
1160
Mlt::Service service(m_mltProducer->parent().get_service());
1162
Mlt::Tractor tractor(service);
1163
Mlt::Producer trackProducer(tractor.track(track));
1164
Mlt::Playlist trackPlaylist(( mlt_playlist ) trackProducer.get_service());
1165
if (trackPlaylist.is_blank_at(pos.frames(m_fps) + 1))
1166
kdDebug()<<"//////// ERROR RSIZING BLANK CLIP!!!!!!!!!!!"<<endl;
1167
int clipIndex = trackPlaylist.get_clip_index_at(pos.frames(m_fps) + 1);
1169
int previousDuration = trackPlaylist.clip_length(clipIndex) - 1;
1170
int newDuration = out.frames(m_fps) - 1;
1172
kdDebug()<<" ** RESIZING CLIP END:" << clipIndex << " on track:"<< track <<", mid pos: "<<pos.frames(25)<<", in: "<<in.frames(25)<<", out: "<<out.frames(25)<<", PREVIOUS duration: "<<previousDuration<<endl;
1173
trackPlaylist.resize_clip(clipIndex, in.frames(m_fps), newDuration);
1174
trackPlaylist.consolidate_blanks(0);
1175
if (previousDuration < newDuration) {
1176
// clip was made longer, trim next blank if there is one.
1177
if (trackPlaylist.is_blank(clipIndex + 1)) {
1178
trackPlaylist.split(clipIndex + 1, newDuration - previousDuration);
1179
trackPlaylist.remove(clipIndex + 1);
1182
else trackPlaylist.insert_blank(clipIndex + 1, previousDuration - newDuration - 1);
1184
trackPlaylist.consolidate_blanks(0);
1185
tractor.multitrack()->refresh();
1187
if (track != 0) mltCheckLength();
1191
void KRender::mltChangeTrackState(int track, bool mute, bool blind)
1193
Mlt::Service service(m_mltProducer->parent().get_service());
1195
Mlt::Tractor tractor(service);
1196
Mlt::Producer trackProducer(tractor.track(track));
1197
Mlt::Playlist trackPlaylist(( mlt_playlist ) trackProducer.get_service());
1199
if (blind) trackProducer.set("hide", 3);
1200
else trackProducer.set("hide", 2);
1203
trackProducer.set("hide", 1);
1206
trackProducer.set("hide", 0);
1208
tractor.multitrack()->refresh();
1213
void KRender::mltResizeClipStart(int track, GenTime pos, GenTime moveEnd, GenTime moveStart, GenTime in, GenTime out)
1215
Mlt::Service service(m_mltProducer->parent().get_service());
1216
if (service.type() == playlist_type) kdDebug()<<"// PLAYLIST TYPE"<<endl;
1217
if (service.type() == tractor_type) kdDebug()<<"// TRACOT TYPE"<<endl;
1218
if (service.type() == multitrack_type) kdDebug()<<"// MULTITRACK TYPE"<<endl;
1219
if (service.type() == producer_type) kdDebug()<<"// PROD TYPE"<<endl;
1221
int moveFrame = (moveEnd - moveStart).frames(m_fps);
1223
Mlt::Tractor tractor(service);
1224
Mlt::Producer trackProducer(tractor.track(track));
1225
Mlt::Playlist trackPlaylist(( mlt_playlist ) trackProducer.get_service());
1226
if (trackPlaylist.is_blank_at(pos.frames(m_fps) - 1))
1227
kdDebug()<<"//////// ERROR RSIZING BLANK CLIP!!!!!!!!!!!"<<endl;
1228
int clipIndex = trackPlaylist.get_clip_index_at(pos.frames(m_fps) - 1);
1229
kdDebug()<<" ** RESIZING CLIP START:" << clipIndex << " on track:"<< track <<", mid pos: "<<pos.frames(25)<<", moving: "<<moveFrame<<", in: "<<in.frames(25)<<", out: "<<out.frames(25)<<endl;
1231
trackPlaylist.resize_clip(clipIndex, in.frames(m_fps), out.frames(m_fps));
1232
if (moveFrame > 0) trackPlaylist.insert_blank(clipIndex, moveFrame - 1);
1234
int midpos = moveStart.frames(m_fps) - 1; //+ (moveFrame / 2)
1235
int blankIndex = trackPlaylist.get_clip_index_at(midpos);
1236
int blankLength = trackPlaylist.clip_length(blankIndex);
1238
kdDebug()<<" + resizing blank: "<<blankIndex<<", Mid: "<<midpos<<", Length: "<<blankLength<< ", SIZE DIFF: "<<moveFrame<<endl;
1241
if (blankLength + moveFrame == 0) trackPlaylist.remove(blankIndex);
1242
else trackPlaylist.resize_clip(blankIndex, 0, blankLength + moveFrame -1);
1244
trackPlaylist.consolidate_blanks(0);
1246
kdDebug()<<"-----------------\n"<<"CLIP 0: "<<trackPlaylist.clip_start(0)<<", LENGT: "<<trackPlaylist.clip_length(0)<<endl;
1247
kdDebug()<<"CLIP 1: "<<trackPlaylist.clip_start(1)<<", LENGT: "<<trackPlaylist.clip_length(1)<<endl;
1248
kdDebug()<<"CLIP 2: "<<trackPlaylist.clip_start(2)<<", LENGT: "<<trackPlaylist.clip_length(2)<<endl;
1249
kdDebug()<<"CLIP 3: "<<trackPlaylist.clip_start(3)<<", LENGT: "<<trackPlaylist.clip_length(3)<<endl;
1250
kdDebug()<<"CLIP 4: "<<trackPlaylist.clip_start(4)<<", LENGT: "<<trackPlaylist.clip_length(4)<<endl;
1253
void KRender::mltMoveClip(int startTrack, int endTrack, GenTime moveStart, GenTime moveEnd)
1255
mltMoveClip(startTrack, endTrack, (int) moveStart.frames(m_fps), (int) moveEnd.frames(m_fps));
1259
void KRender::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEnd)
1261
m_mltConsumer->set("refresh", 0);
1262
Mlt::Service service(m_mltProducer->parent().get_service());
1264
Mlt::Tractor tractor(service);
1265
Mlt::Producer trackProducer(tractor.track(startTrack));
1266
Mlt::Playlist trackPlaylist(( mlt_playlist ) trackProducer.get_service());
1267
int clipIndex = trackPlaylist.get_clip_index_at(moveStart + 1);
1270
mlt_field field = mlt_tractor_field(tractor.get_tractor());
1272
mlt_multitrack multitrack = mlt_field_multitrack(field); //mlt_tractor_multitrack(tractor.get_tractor());
1273
kdDebug()<<" -- CURRENT MULTIOTRACK HAS: "<<mlt_multitrack_count(multitrack)<<" tracks"<<endl;;
1274
mlt_service multiprod = mlt_multitrack_service( multitrack );
1276
Mlt::Producer clipProducer(trackPlaylist.replace_with_blank(clipIndex));
1277
trackPlaylist.consolidate_blanks(0);
1278
mlt_events_block( MLT_PRODUCER_PROPERTIES(clipProducer.get_producer()), NULL );
1280
if (endTrack == startTrack) {
1281
if (!trackPlaylist.is_blank_at(moveEnd)) {
1282
kdWarning()<<"// ERROR, CLIP COLLISION----------"<<endl;
1283
int ix = trackPlaylist.get_clip_index_at(moveEnd);
1284
kdDebug()<<"BAD CLIP STARTS AT: "<<trackPlaylist.clip_start(ix)<<", LENGT: "<<trackPlaylist.clip_length(ix)<<endl;
1286
trackPlaylist.insert_at(moveEnd, clipProducer, 1);
1287
trackPlaylist.consolidate_blanks(0);
1290
trackPlaylist.consolidate_blanks(0);
1291
Mlt::Producer destTrackProducer(tractor.track(endTrack));
1292
Mlt::Playlist destTrackPlaylist(( mlt_playlist ) destTrackProducer.get_service());
1293
destTrackPlaylist.consolidate_blanks(1);
1294
destTrackPlaylist.insert_at(moveEnd, clipProducer, 1);
1295
destTrackPlaylist.consolidate_blanks(0);
1299
mlt_events_unblock( MLT_PRODUCER_PROPERTIES(clipProducer.get_producer()), NULL );
1302
void KRender::mltMoveTransition(QString type, int startTrack, int trackOffset, GenTime oldIn, GenTime oldOut, GenTime newIn, GenTime newOut)
1304
m_mltConsumer->set("refresh", 0);
1305
mlt_service serv = m_mltProducer->parent().get_service();
1307
mlt_service nextservice = mlt_service_get_producer(serv);
1308
mlt_properties properties = MLT_SERVICE_PROPERTIES( nextservice );
1309
QString mlt_type = mlt_properties_get( properties, "mlt_type" );
1310
QString resource = mlt_properties_get( properties, "mlt_service");
1311
int old_pos = (oldIn.frames(m_fps) + oldOut.frames(m_fps)) / 2;
1313
int new_in = newIn.frames(m_fps);
1314
int new_out = newOut.frames(m_fps) - 1;
1315
while (mlt_type == "transition") {
1316
mlt_transition tr = (mlt_transition) nextservice;
1317
int currentTrack = mlt_transition_get_b_track(tr);
1318
int currentIn = (int) mlt_transition_get_in(tr);
1319
int currentOut = (int) mlt_transition_get_out(tr);
1320
kdDebug()<<"// FOUND EXISTING TRANS, IN: "<<currentIn<<", OUT: "<<currentOut<<", TRACK: "<<currentTrack<<endl;
1321
//kdDebug()<<"// LOOKING FOR IN: "<<old_in<<", OUT: "<<old_out<<endl;
1322
kdDebug()<<"// OLD IN: "<<oldIn.frames(m_fps)<<" // OLD OUT: "<<oldOut.frames(m_fps)<<", TRACK: "<<startTrack<<", MID POS: "<<old_pos<<endl;
1323
if (resource == type && startTrack == currentTrack && currentIn <= old_pos && currentOut >= old_pos) {
1324
mlt_transition_set_in_and_out(tr, new_in, new_out);
1325
if (trackOffset != 0) {
1326
mlt_properties properties = MLT_TRANSITION_PROPERTIES( tr );
1327
mlt_properties_set_int( properties, "a_track", mlt_transition_get_a_track(tr) + trackOffset );
1328
mlt_properties_set_int( properties, "b_track", mlt_transition_get_b_track(tr) + trackOffset );
1332
nextservice = mlt_service_producer(nextservice);
1333
properties = MLT_SERVICE_PROPERTIES( nextservice );
1334
mlt_type = mlt_properties_get( properties, "mlt_type" );
1335
resource = mlt_properties_get( properties, "mlt_service" );
1339
void KRender::mltAddTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QMap <QString, QString> args)
1341
Mlt::Service service(m_mltProducer->parent().get_service());
1343
Mlt::Tractor tractor(service);
1344
Mlt::Field *field = tractor.field();
1346
char *transId = decodedString(tag);
1347
Mlt::Transition *transition = new Mlt::Transition(transId);
1348
transition->set_in_and_out((int) in.frames(m_fps), (int) out.frames(m_fps));
1349
QMap<QString, QString>::Iterator it;
1352
kdDebug()<<" ------ ADDING TRANSITION PARAMs: "<<args.count()<<endl;
1354
for ( it = args.begin(); it != args.end(); ++it ) {
1356
char *name = decodedString(key);
1357
char *value = decodedString(it.data());
1358
transition->set(name, value);
1359
kdDebug()<<" ------ ADDING TRANS PARAM: "<<name<<": "<<value<<endl;
1360
//filter->set("kdenlive_id", id);
1364
// attach filter to the clip
1365
field->plant_transition(*transition, a_track, b_track);
1371
void KRender::mltSavePlaylist()
1373
kdWarning()<<"// UPDATING PLAYLIST TO DISK++++++++++++++++"<<endl;
1374
Mlt::Consumer *fileConsumer = new Mlt::Consumer("westley");
1375
fileConsumer->set("resource", "/home/one/playlist.xml");
1377
Mlt::Service service(m_mltProducer->get_service());
1378
Mlt::Tractor tractor(service);
1380
fileConsumer->connect(service);
1381
fileConsumer->start();