- Mlt::Profile tmpProfile(m_activeProfile.toUtf8().constData());
- m_mltProfile->set_colorspace(tmpProfile.colorspace());
- m_mltProfile->set_frame_rate(tmpProfile.frame_rate_num(), tmpProfile.frame_rate_den());
- m_mltProfile->set_height(tmpProfile.height());
- m_mltProfile->set_width(tmpProfile.width());
- m_mltProfile->set_progressive(tmpProfile.progressive());
- m_mltProfile->set_sample_aspect(tmpProfile.sample_aspect_num(), tmpProfile.sample_aspect_den());
- m_mltProfile->get_profile()->display_aspect_num = tmpProfile.display_aspect_num();
- m_mltProfile->get_profile()->display_aspect_den = tmpProfile.display_aspect_den();
- }
- else {
- m_mltProfile = new Mlt::Profile(m_activeProfile.toUtf8().constData());
+ Mlt::Profile tmpProfile(m_activeProfile.toUtf8().constData());
+ m_mltProfile->set_colorspace(tmpProfile.colorspace());
+ m_mltProfile->set_frame_rate(tmpProfile.frame_rate_num(), tmpProfile.frame_rate_den());
+ m_mltProfile->set_height(tmpProfile.height());
+ m_mltProfile->set_width(tmpProfile.width());
+ m_mltProfile->set_progressive(tmpProfile.progressive());
+ m_mltProfile->set_sample_aspect(tmpProfile.sample_aspect_num(), tmpProfile.sample_aspect_den());
+ m_mltProfile->get_profile()->display_aspect_num = tmpProfile.display_aspect_num();
+ m_mltProfile->get_profile()->display_aspect_den = tmpProfile.display_aspect_den();
+ } else {
+ m_mltProfile = new Mlt::Profile(m_activeProfile.toUtf8().constData());
- if (BMInterface::isSupportedProfile(device, profileProperties)) {
- QString decklink = "decklink:" + QString::number(KdenliveSettings::blackmagic_output_device());
- if (!m_mltConsumer) {
- m_mltConsumer = new Mlt::Consumer(*m_mltProfile, decklink.toUtf8().constData());
- m_showFrameEvent = m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_frame_show);
- mlt_log_set_callback(kdenlive_callback);
- }
- if (m_mltConsumer->is_valid()) {
- m_externalConsumer = true;
- m_mltConsumer->set("terminate_on_pause", 0);
- m_mltConsumer->set("deinterlace_method", "onefield");
- m_mltConsumer->set("real_time", KdenliveSettings::mltthreads());
- }
- if (m_mltConsumer && m_mltConsumer->is_valid()) return;
- } else KMessageBox::informationList(qApp->activeWindow(), i18n("Your project's profile %1 is not compatible with the blackmagic output card. Please see supported profiles below. Switching to normal video display.", m_mltProfile->description()), BMInterface::supportedModes(KdenliveSettings::blackmagic_output_device()));
+ QString decklink = "decklink:" + QString::number(KdenliveSettings::blackmagic_output_device());
+ if (!m_mltConsumer) {
+ m_mltConsumer = new Mlt::Consumer(*m_mltProfile, decklink.toUtf8().constData());
+ m_showFrameEvent = m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_frame_show);
+ mlt_log_set_callback(kdenlive_callback);
+ }
+ if (m_mltConsumer->is_valid()) {
+ externalConsumer = true;
+ m_mltConsumer->set("terminate_on_pause", 0);
+ m_mltConsumer->set("deinterlace_method", KdenliveSettings::mltdeinterlacer().toUtf8().constData());
+ m_mltConsumer->set("rescale", KdenliveSettings::mltinterpolation().toUtf8().constData());
+ m_mltConsumer->set("buffer", "1");
+ m_mltConsumer->set("real_time", KdenliveSettings::mltthreads());
+ }
+ if (m_mltConsumer && m_mltConsumer->is_valid()) {
+ return;
+ }
+ KMessageBox::information(qApp->activeWindow(), i18n("Your project's profile %1 is not compatible with the blackmagic output card. Please see supported profiles below. Switching to normal video display.", m_mltProfile->description()));
- m_mltConsumer = new Mlt::Consumer(*m_mltProfile, "sdl_audio");
- m_mltConsumer->set("scrub_audio", 1);
- m_showFrameEvent = m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_gl_frame_show);
- }
- m_mltConsumer->set("preview_off", 1);
- m_mltConsumer->set("preview_format", mlt_image_rgb24a);
+ if (KdenliveSettings::external_display() && m_name != Kdenlive::ClipMonitor) {
+ int device = KdenliveSettings::blackmagic_output_device();
+ if (device >= 0) {
+ QString decklink = "decklink:" + QString::number(KdenliveSettings::blackmagic_output_device());
+ m_mltConsumer = new Mlt::Consumer(*m_mltProfile, decklink.toUtf8().constData());
+ // Set defaults for decklink consumer
+ if (m_mltConsumer) {
+ m_mltConsumer->set("terminate_on_pause", 0);
+ m_mltConsumer->set("deinterlace_method", KdenliveSettings::mltdeinterlacer().toUtf8().constData());
+ externalConsumer = true;
+ }
+ }
+ }
+ if (!m_mltConsumer || !m_mltConsumer->is_valid()) {
+ m_mltConsumer = new Mlt::Consumer(*m_mltProfile, "sdl_audio");
+ m_mltConsumer->set("scrub_audio", 1);
+ m_mltConsumer->set("preview_off", 1);
+ m_mltConsumer->set("audio_buffer", 512);
+ m_mltConsumer->set("preview_format", mlt_image_rgb24a);
+ }
+ m_mltConsumer->set("buffer", "1");
+ m_showFrameEvent = m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_gl_frame_show);
+ }
- m_mltConsumer = new Mlt::Consumer(*m_mltProfile, "sdl_preview");
- m_showFrameEvent = m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_frame_show);
- m_pauseEvent = m_mltConsumer->listen("consumer-sdl-paused", this, (mlt_listener) consumer_paused);
- }
- m_mltConsumer->set("window_id", m_winid);
- }
- m_mltConsumer->set("resize", 1);
- m_mltConsumer->set("terminate_on_pause", 1);
+ m_mltConsumer = new Mlt::Consumer(*m_mltProfile, "sdl_preview");
+ m_showFrameEvent = m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_frame_show);
+ //m_pauseEvent = m_mltConsumer->listen("consumer-sdl-paused", this, (mlt_listener) consumer_paused);
+ m_mltConsumer->set("progressive", 1);
+ }
+ m_mltConsumer->set("window_id", m_winid);
+ }
+ //m_mltConsumer->set("resize", 1);
- int vindex = -1;
- const QString mltService = producer->get("mlt_service");
- if (mltService == "xml" || mltService == "consumer") {
- // MLT playlist, create producer with blank profile to get real profile info
- // TODO: is there an easier way to get this info (original source clip profile) from MLT?
- Mlt::Profile *original_profile = new Mlt::Profile();
- Mlt::Producer *tmpProd = new Mlt::Producer(*original_profile, path.toUtf8().constData());
- filePropertyMap["progressive"] = QString::number(original_profile->progressive());
- filePropertyMap["colorspace"] = QString::number(original_profile->colorspace());
- filePropertyMap["fps"] = QString::number(original_profile->fps());
- filePropertyMap["aspect_ratio"] = QString::number(original_profile->sar());
- delete tmpProd;
- delete original_profile;
- }
- else if (mltService == "avformat") {
- // Get frame rate
- vindex = producer->get_int("video_index");
-
- // List streams
- int streams = producer->get_int("meta.media.nb_streams");
- QList <int> audio_list;
- QList <int> video_list;
- for (int i = 0; i < streams; i++) {
- QByteArray propertyName = QString("meta.media.%1.stream.type").arg(i).toLocal8Bit();
- QString type = producer->get(propertyName.data());
- if (type == "audio") audio_list.append(i);
- else if (type == "video") video_list.append(i);
- }
-
- if (!info.xml.hasAttribute("video_index") && video_list.count() > 1) {
- // Clip has more than one video stream, ask which one should be used
- QMap <QString, QString> data;
- if (info.xml.hasAttribute("group")) data.insert("group", info.xml.attribute("group"));
- if (info.xml.hasAttribute("groupId")) data.insert("groupId", info.xml.attribute("groupId"));
- emit multiStreamFound(path, audio_list, video_list, data);
- // Force video index so that when reloading the clip we don't ask again for other streams
- filePropertyMap["video_index"] = QString::number(vindex);
- }
-
- if (vindex > -1) {
- snprintf(property, sizeof(property), "meta.media.%d.stream.frame_rate", vindex);
- if (producer->get(property))
- filePropertyMap["fps"] = producer->get(property);
- }
-
- if (!filePropertyMap.contains("fps")) {
- if (producer->get_double("meta.media.frame_rate_den") > 0) {
- filePropertyMap["fps"] = locale.toString(producer->get_double("meta.media.frame_rate_num") / producer->get_double("meta.media.frame_rate_den"));
- } else filePropertyMap["fps"] = producer->get("source_fps");
- }
- }
+ int vindex = -1;
+ const QString mltService = producer->get("mlt_service");
+ if (mltService == "xml" || mltService == "consumer") {
+ // MLT playlist, create producer with blank profile to get real profile info
+ // TODO: is there an easier way to get this info (original source clip profile) from MLT?
+ Mlt::Profile *original_profile = new Mlt::Profile();
+ Mlt::Producer *tmpProd = new Mlt::Producer(*original_profile, path.toUtf8().constData());
+ filePropertyMap["progressive"] = QString::number(original_profile->progressive());
+ filePropertyMap["colorspace"] = QString::number(original_profile->colorspace());
+ filePropertyMap["fps"] = QString::number(original_profile->fps());
+ filePropertyMap["aspect_ratio"] = QString::number(original_profile->sar());
+ delete tmpProd;
+ delete original_profile;
+ }
+ else if (mltService == "avformat") {
+ // Get frame rate
+ vindex = producer->get_int("video_index");
+
+ // List streams
+ int streams = producer->get_int("meta.media.nb_streams");
+ QList <int> audio_list;
+ QList <int> video_list;
+ for (int i = 0; i < streams; ++i) {
+ QByteArray propertyName = QString("meta.media.%1.stream.type").arg(i).toLocal8Bit();
+ QString type = producer->get(propertyName.data());
+ if (type == "audio") audio_list.append(i);
+ else if (type == "video") video_list.append(i);
+ }
+
+ if (!info.xml.hasAttribute("video_index") && video_list.count() > 1) {
+ // Clip has more than one video stream, ask which one should be used
+ QMap <QString, QString> data;
+ if (info.xml.hasAttribute("group")) data.insert("group", info.xml.attribute("group"));
+ if (info.xml.hasAttribute("groupId")) data.insert("groupId", info.xml.attribute("groupId"));
+ emit multiStreamFound(path, audio_list, video_list, data);
+ // Force video index so that when reloading the clip we don't ask again for other streams
+ filePropertyMap["video_index"] = QString::number(vindex);
+ }
+
+ if (vindex > -1) {
+ snprintf(property, sizeof(property), "meta.media.%d.stream.frame_rate", vindex);
+ if (producer->get(property))
+ filePropertyMap["fps"] = producer->get(property);
+ }
+
+ if (!filePropertyMap.contains("fps")) {
+ if (producer->get_double("meta.media.frame_rate_den") > 0) {
+ filePropertyMap["fps"] = locale.toString(producer->get_double("meta.media.frame_rate_num") / producer->get_double("meta.media.frame_rate_den"));
+ } else filePropertyMap["fps"] = producer->get("source_fps");
+ }
+ }
- if (vindex > -1) {
- /*if (context->duration == AV_NOPTS_VALUE) {
- kDebug() << " / / / / / / / /ERROR / / / CLIP HAS UNKNOWN DURATION";
- emit removeInvalidClip(clipId);
- delete producer;
- return;
- }*/
- // Get the video_index
- int video_max = 0;
- int default_audio = producer->get_int("audio_index");
- int audio_max = 0;
-
- int scan = producer->get_int("meta.media.progressive");
- filePropertyMap["progressive"] = QString::number(scan);
-
- // Find maximum stream index values
- for (int ix = 0; ix < producer->get_int("meta.media.nb_streams"); ix++) {
- snprintf(property, sizeof(property), "meta.media.%d.stream.type", ix);
- QString type = producer->get(property);
- if (type == "video")
- video_max = ix;
- else if (type == "audio")
- audio_max = ix;
- }
- filePropertyMap["default_video"] = QString::number(vindex);
- filePropertyMap["video_max"] = QString::number(video_max);
- filePropertyMap["default_audio"] = QString::number(default_audio);
- filePropertyMap["audio_max"] = QString::number(audio_max);
-
- snprintf(property, sizeof(property), "meta.media.%d.codec.long_name", vindex);
- if (producer->get(property)) {
- filePropertyMap["videocodec"] = producer->get(property);
- } else {
- snprintf(property, sizeof(property), "meta.media.%d.codec.name", vindex);
- if (producer->get(property))
- filePropertyMap["videocodec"] = producer->get(property);
- }
- QString query;
- query = QString("meta.media.%1.codec.pix_fmt").arg(vindex);
- filePropertyMap["pix_fmt"] = producer->get(query.toUtf8().constData());
- filePropertyMap["colorspace"] = producer->get("meta.media.colorspace");
-
- } else kDebug() << " / / / / /WARNING, VIDEO CONTEXT IS NULL!!!!!!!!!!!!!!";
- if (producer->get_int("audio_index") > -1) {
- // Get the audio_index
- int index = producer->get_int("audio_index");
- snprintf(property, sizeof(property), "meta.media.%d.codec.long_name", index);
- if (producer->get(property)) {
- filePropertyMap["audiocodec"] = producer->get(property);
- } else {
- snprintf(property, sizeof(property), "meta.media.%d.codec.name", index);
- if (producer->get(property))
- filePropertyMap["audiocodec"] = producer->get(property);
- }
- }
- }
+ if (vindex > -1) {
+ /*if (context->duration == AV_NOPTS_VALUE) {
+ kDebug() << " / / / / / / / /ERROR / / / CLIP HAS UNKNOWN DURATION";
+ emit removeInvalidClip(clipId);
+ delete producer;
+ return;
+ }*/
+ // Get the video_index
+ int video_max = 0;
+ int default_audio = producer->get_int("audio_index");
+ int audio_max = 0;
+
+ int scan = producer->get_int("meta.media.progressive");
+ filePropertyMap["progressive"] = QString::number(scan);
+
+ // Find maximum stream index values
+ for (int ix = 0; ix < producer->get_int("meta.media.nb_streams"); ix++) {
+ snprintf(property, sizeof(property), "meta.media.%d.stream.type", ix);
+ QString type = producer->get(property);
+ if (type == "video")
+ video_max = ix;
+ else if (type == "audio")
+ audio_max = ix;
+ }
+ filePropertyMap["default_video"] = QString::number(vindex);
+ filePropertyMap["video_max"] = QString::number(video_max);
+ filePropertyMap["default_audio"] = QString::number(default_audio);
+ filePropertyMap["audio_max"] = QString::number(audio_max);
+
+ snprintf(property, sizeof(property), "meta.media.%d.codec.long_name", vindex);
+ if (producer->get(property)) {
+ filePropertyMap["videocodec"] = producer->get(property);
+ }
+ snprintf(property, sizeof(property), "meta.media.%d.codec.name", vindex);
+ if (producer->get(property)) {
+ filePropertyMap["videocodecid"] = producer->get(property);
+ }
+ QString query;
+ query = QString("meta.media.%1.codec.pix_fmt").arg(vindex);
+ filePropertyMap["pix_fmt"] = producer->get(query.toUtf8().constData());
+ filePropertyMap["colorspace"] = producer->get("meta.media.colorspace");
+
+ } else kDebug() << " / / / / /WARNING, VIDEO CONTEXT IS NULL!!!!!!!!!!!!!!";
+ if (producer->get_int("audio_index") > -1) {
+ // Get the audio_index
+ int index = producer->get_int("audio_index");
+ snprintf(property, sizeof(property), "meta.media.%d.codec.long_name", index);
+ if (producer->get(property)) {
+ filePropertyMap["audiocodec"] = producer->get(property);
+ } else {
+ snprintf(property, sizeof(property), "meta.media.%d.codec.name", index);
+ if (producer->get(property))
+ filePropertyMap["audiocodec"] = producer->get(property);
+ }
+ }
+ }
- // This is an audio only clip, create fake multitrack to apply audiowave filter
- Mlt::Tractor *tractor = new Mlt::Tractor();
- Mlt::Producer *color= new Mlt::Producer(*m_mltProfile, "color:red");
- color->set_in_and_out(0, producer->get_out());
- tractor->set_track(*producer, 0);
- tractor->set_track(*color, 1);
-
- Mlt::Consumer xmlConsumer(*m_mltProfile, "xml:audio_hack");
- if (!xmlConsumer.is_valid()) return -1;
- xmlConsumer.set("terminate_on_pause", 1);
- xmlConsumer.connect(tractor->parent());
- xmlConsumer.run();
- delete tractor;
- delete color;
- delete producer;
- QString playlist = QString::fromUtf8(xmlConsumer.get("audio_hack"));
-
- Mlt::Producer *result = new Mlt::Producer(*m_mltProfile, "xml-string", playlist.toUtf8().constData());
- Mlt::Filter *filter = new Mlt::Filter(*m_mltProfile, "audiowave");
- result->attach(*filter);
- tractor = new Mlt::Tractor();
- tractor->set_track(*result, 0);
- delete result;
- delete filter;
- producer = &(tractor->parent());
- m_mltConsumer->connect(*producer);
+ // This is an audio only clip, create fake multitrack to apply audiowave filter
+ Mlt::Tractor *tractor = new Mlt::Tractor();
+ Mlt::Producer *color= new Mlt::Producer(*m_mltProfile, "color:red");
+ color->set_in_and_out(0, producer->get_out());
+ tractor->set_track(*producer, 0);
+ tractor->set_track(*color, 1);
+
+ Mlt::Consumer xmlConsumer(*m_mltProfile, "xml:audio_hack");
+ if (!xmlConsumer.is_valid()) return -1;
+ xmlConsumer.set("terminate_on_pause", 1);
+ xmlConsumer.connect(tractor->parent());
+ xmlConsumer.run();
+ delete tractor;
+ delete color;
+ delete producer;
+ QString playlist = QString::fromUtf8(xmlConsumer.get("audio_hack"));
+
+ Mlt::Producer *result = new Mlt::Producer(*m_mltProfile, "xml-string", playlist.toUtf8().constData());
+ Mlt::Filter *filter = new Mlt::Filter(*m_mltProfile, "audiowave");
+ result->attach(*filter);
+ tractor = new Mlt::Tractor();
+ tractor->set_track(*result, 0);
+ delete result;
+ delete filter;
+ producer = &(tractor->parent());
+ m_mltConsumer->connect(*producer);
- if (frame.is_valid()) {
- mlt_image_format format = mlt_image_rgb24a;
- int width = 0;
- int height = 0;
- const uchar* image = frame.get_image(format, width, height);
- QImage qimage(width, height, QImage::Format_ARGB32_Premultiplied);
- memcpy(qimage.scanLine(0), image, width * height * 4);
- emit showImageSignal(qimage);
- if (analyseAudio) showAudio(frame);
- if (sendFrameForAnalysis && frame.get_frame()->convert_image) {
- emit frameUpdated(qimage.rgbSwapped());
- }
- }
+ if (frame->is_valid()) {
+ mlt_image_format format = mlt_image_rgb24;
+ int width = 0;
+ int height = 0;
+ const uchar* image = frame->get_image(format, width, height);
+ QImage qimage(width, height, QImage::Format_RGB888); //Format_ARGB32_Premultiplied);
+ memcpy(qimage.scanLine(0), image, width * height * 3);
+ if (analyseAudio) showAudio(*frame);
+ delete frame;
+ emit showImageSignal(qimage);
+ if (sendFrameForAnalysis) {
+ emit frameUpdated(qimage);
+ }
+ } else delete frame;
+ showFrameSemaphore.release();
- Mlt::Filter *filter = new Mlt::Filter(*m_mltProfile, filterTag);
- if (filter && filter->is_valid()) {
- filter->set("kdenlive_id", filterId);
- int x1 = keyFrames.at(i).section(':', 0, 0).toInt() + offset;
- double y1 = keyFrames.at(i).section(':', 1, 1).toDouble();
- int x2 = keyFrames.at(i + 1).section(':', 0, 0).toInt();
- double y2 = keyFrames.at(i + 1).section(':', 1, 1).toDouble();
- if (x2 == -1) x2 = duration;
-
- for (int j = 0; j < params.count(); j++) {
- filter->set(params.at(j).name().toUtf8().constData(), params.at(j).value().toUtf8().constData());
- }
+ Mlt::Filter *filter = new Mlt::Filter(*m_mltProfile, qstrdup(tag.toUtf8().constData()));
+ if (filter && filter->is_valid()) {
+ filter->set("kdenlive_id", qstrdup(params.paramValue("id").toUtf8().constData()));
+ int x1 = keyFrames.at(i).section(':', 0, 0).toInt() + offset;
+ double y1 = keyFrames.at(i).section(':', 1, 1).toDouble();
+ int x2 = keyFrames.at(i + 1).section(':', 0, 0).toInt();
+ double y2 = keyFrames.at(i + 1).section(':', 1, 1).toDouble();
+ if (x2 == -1) x2 = duration;
- if (currentbTrack == ix && currentaTrack < ix) forceTransitionTrack = true;
- currentbTrack++;
- trackChanged = true;
- }
- if (currentaTrack >= ix) {
- currentaTrack++;
- trackChanged = true;
- }
- kDebug()<<"// Newtrans: "<<currentaTrack<<"/"<<currentbTrack;
-
- // disconnect all transitions
- Mlt::Properties trans_props(transition.get_properties());
- Mlt::Transition *cp = new Mlt::Transition(*m_mltProfile, transition.get("mlt_service"));
- Mlt::Properties new_trans_props(cp->get_properties());
- new_trans_props.inherit(trans_props);
-
- if (trackChanged) {
- // Transition track needs to be adjusted
- cp->set("a_track", currentaTrack);
- cp->set("b_track", currentbTrack);
- // Check if transition track was changed and needs to be forced
- if (forceTransitionTrack) cp->set("force_track", 1);
- TransitionInfo trInfo;
- trInfo.startPos = GenTime(transition.get_in(), m_fps);
- trInfo.a_track = currentaTrack;
- trInfo.b_track = currentbTrack;
- trInfo.forceTrack = cp->get_int("force_track");
- transitionInfos.append(trInfo);
- }
- trList.append(cp);
- field->disconnect_service(transition);
+ if (currentbTrack == ix && currentaTrack < ix) forceTransitionTrack = true;
+ currentbTrack++;
+ trackChanged = true;
+ }
+ if (currentaTrack >= ix) {
+ currentaTrack++;
+ trackChanged = true;
+ }
+ kDebug()<<"// Newtrans: "<<currentaTrack<<"/"<<currentbTrack;
+
+ // disconnect all transitions
+ Mlt::Properties trans_props(transition.get_properties());
+ Mlt::Transition *cp = new Mlt::Transition(*m_mltProfile, transition.get("mlt_service"));
+ Mlt::Properties new_trans_props(cp->get_properties());
+ cloneProperties(new_trans_props, trans_props);
+ //new_trans_props.inherit(trans_props);
+
+ if (trackChanged) {
+ // Transition track needs to be adjusted
+ cp->set("a_track", currentaTrack);
+ cp->set("b_track", currentbTrack);
+ // Check if transition track was changed and needs to be forced
+ if (forceTransitionTrack) cp->set("force_track", 1);
+ TransitionInfo trInfo;
+ trInfo.startPos = GenTime(transition.get_in(), m_fps);
+ trInfo.a_track = currentaTrack;
+ trInfo.b_track = currentbTrack;
+ trInfo.forceTrack = cp->get_int("force_track");
+ transitionInfos.append(trInfo);
+ }
+ trList.append(cp);
+ field->disconnect_service(transition);
- for (int i = 1; i < video_list.count(); i++) {
- int vindex = video_list.at(i);
- int aindex = 0;
- if (i <= audio_list.count() -1) {
- aindex = audio_list.at(i);
- }
- data.insert("video_index", QString::number(vindex));
- data.insert("audio_index", QString::number(aindex));
- data.insert("bypassDuplicate", "1");
- emit addClip(KUrl(path), data);
- }
- return;
+ for (int i = 1; i < video_list.count(); ++i) {
+ int vindex = video_list.at(i);
+ int aindex = 0;
+ if (i <= audio_list.count() -1) {
+ aindex = audio_list.at(i);
+ }
+ data.insert("video_index", QString::number(vindex));
+ data.insert("audio_index", QString::number(aindex));
+ data.insert("bypassDuplicate", "1");
+ emit addClip(KUrl(path), data);
+ }
+ return;
- Mlt::Producer multiprod(* m_mltProfile, path.toUtf8().constData());
- multiprod.set("video_index", video_list.at(j));
- QImage thumb = KThumb::getFrame(&multiprod, 0, swidth, width, 60);
- QGroupBox *streamFrame = new QGroupBox(i18n("Video stream %1", video_list.at(j)), content);
- streamFrame->setProperty("vindex", video_list.at(j));
- groupList << streamFrame;
- streamFrame->setCheckable(true);
- streamFrame->setChecked(true);
- QVBoxLayout *vh = new QVBoxLayout( streamFrame );
- QLabel *iconLabel = new QLabel(content);
- iconLabel->setPixmap(QPixmap::fromImage(thumb));
- vh->addWidget(iconLabel);
- if (audio_list.count() > 1) {
- QComboBox *cb = new QComboBox(content);
- for (int k = 0; k < audio_list.count(); k++) {
- cb->addItem(i18n("Audio stream %1", audio_list.at(k)), audio_list.at(k));
- }
- comboList << cb;
- cb->setCurrentIndex(qMin(j, audio_list.count() - 1));
- vh->addWidget(cb);
- }
- vbox->addWidget(streamFrame);
+ Mlt::Producer multiprod(* m_mltProfile, path.toUtf8().constData());
+ multiprod.set("video_index", video_list.at(j));
+ QImage thumb = KThumb::getFrame(&multiprod, 0, swidth, width, 60);
+ QGroupBox *streamFrame = new QGroupBox(i18n("Video stream %1", video_list.at(j)), content);
+ streamFrame->setProperty("vindex", video_list.at(j));
+ groupList << streamFrame;
+ streamFrame->setCheckable(true);
+ streamFrame->setChecked(true);
+ QVBoxLayout *vh = new QVBoxLayout( streamFrame );
+ QLabel *iconLabel = new QLabel(content);
+ iconLabel->setPixmap(QPixmap::fromImage(thumb));
+ vh->addWidget(iconLabel);
+ if (audio_list.count() > 1) {
+ QComboBox *cb = new QComboBox(content);
+ for (int k = 0; k < audio_list.count(); k++) {
+ cb->addItem(i18n("Audio stream %1", audio_list.at(k)), audio_list.at(k));
+ }
+ comboList << cb;
+ cb->setCurrentIndex(qMin(j, audio_list.count() - 1));
+ vh->addWidget(cb);
+ }
+ vbox->addWidget(streamFrame);
- // import selected streams
- for (int i = 0; i < groupList.count(); i++) {
- if (groupList.at(i)->isChecked()) {
- int vindex = groupList.at(i)->property("vindex").toInt();
- int aindex = comboList.at(i)->itemData(comboList.at(i)->currentIndex()).toInt();
- data.insert("video_index", QString::number(vindex));
- data.insert("audio_index", QString::number(aindex));
- data.insert("bypassDuplicate", "1");
- emit addClip(KUrl(path), data);
- }
- }
+ // import selected streams
+ for (int i = 0; i < groupList.count(); ++i) {
+ if (groupList.at(i)->isChecked()) {
+ int vindex = groupList.at(i)->property("vindex").toInt();
+ int aindex = comboList.at(i)->itemData(comboList.at(i)->currentIndex()).toInt();
+ data.insert("video_index", QString::number(vindex));
+ data.insert("audio_index", QString::number(aindex));
+ data.insert("bypassDuplicate", "1");
+ emit addClip(KUrl(path), data);
+ }
+ }