X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Frenderer.cpp;h=d99a2e801e404ddc9f61148aae921246da0d2be9;hb=daeb7e290bcadae72e34ea8f84aed02908bcc839;hp=62626128766907a52070ee26fb12e62e97709ba3;hpb=4b24e46624307c866463521b97490c4d211065d0;p=kdenlive diff --git a/src/renderer.cpp b/src/renderer.cpp index 62626128..d99a2e80 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -47,7 +47,7 @@ #include #include - +#include static void kdenlive_callback(void* /*ptr*/, int level, const char* fmt, va_list vl) { @@ -68,7 +68,9 @@ static void consumer_frame_show(mlt_consumer, Render * self, mlt_frame frame_ptr if (self->sendFrameForAnalysis && frame_ptr->convert_image) { self->emitFrameUpdated(frame); } - self->showAudio(frame); + if (self->analyseAudio) { + self->showAudio(frame); + } if (frame.get_double("_speed") == 0.0) { self->emitConsumerStopped(); } else if (frame.get_double("_speed") < 0.0 && mlt_frame_get_position(frame_ptr) <= 0) { @@ -95,11 +97,13 @@ Render::Render(const QString & rendererName, int winid, QString profile, QWidget QObject(parent), m_isBlocked(0), sendFrameForAnalysis(false), + analyseAudio(KdenliveSettings::monitor_audio()), m_name(rendererName), m_mltConsumer(NULL), m_mltProducer(NULL), m_mltProfile(NULL), m_framePosition(0), + m_externalConsumer(false), m_isZoneMode(false), m_isLoopMode(false), m_isSplitView(false), @@ -195,17 +199,18 @@ void Render::buildConsumer(const QString profileName) tmp = qstrdup(decklink.toUtf8().constData()); m_mltConsumer = new Mlt::Consumer(*m_mltProfile, tmp); delete[] tmp; - if (m_mltConsumer) { + if (m_mltConsumer->is_valid()) { + m_externalConsumer = true; m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_frame_show); m_mltConsumer->set("terminate_on_pause", 0); - m_mltConsumer->set("audio_buffer", 1024); - m_mltConsumer->set("frequency", 48000); + m_mltConsumer->set("buffer", 12); + m_mltConsumer->set("deinterlace_method", "onefield"); mlt_log_set_callback(kdenlive_callback); } 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())); } - + m_externalConsumer = false; QString videoDriver = KdenliveSettings::videodrivername(); if (!videoDriver.isEmpty()) { if (videoDriver == "x11_noaccel") { @@ -270,15 +275,17 @@ Mlt::Producer *Render::invalidProducer(const QString &id) int Render::resetProfile(const QString profileName) { if (m_mltConsumer) { - if (KdenliveSettings::external_display() && m_activeProfile == profileName) return 1; - QString videoDriver = KdenliveSettings::videodrivername(); - QString currentDriver = m_mltConsumer->get("video_driver"); - if (getenv("SDL_VIDEO_YUV_HWACCEL") != NULL && currentDriver == "x11") currentDriver = "x11_noaccel"; - QString background = KdenliveSettings::window_background().name(); - QString currentBackground = m_mltConsumer->get("window_background"); - if (m_activeProfile == profileName && currentDriver == videoDriver && background == currentBackground) { - kDebug() << "reset to same profile, nothing to do"; - return 1; + if (m_externalConsumer == KdenliveSettings::external_display()) { + if (KdenliveSettings::external_display() && m_activeProfile == profileName) return 1; + QString videoDriver = KdenliveSettings::videodrivername(); + QString currentDriver = m_mltConsumer->get("video_driver"); + if (getenv("SDL_VIDEO_YUV_HWACCEL") != NULL && currentDriver == "x11") currentDriver = "x11_noaccel"; + QString background = KdenliveSettings::window_background().name(); + QString currentBackground = m_mltConsumer->get("window_background"); + if (m_activeProfile == profileName && currentDriver == videoDriver && background == currentBackground) { + kDebug() << "reset to same profile, nothing to do"; + return 1; + } } if (m_isSplitView) slotSplitView(false); @@ -517,14 +524,17 @@ void Render::getFileProperties(const QDomElement xml, const QString &clipId, int { KUrl url = KUrl(xml.attribute("resource", QString())); Mlt::Producer *producer = NULL; + CLIPTYPE type = (CLIPTYPE)xml.attribute("type").toInt(); + //kDebug() << "PROFILE WIDT: "<< xml.attribute("mlt_service") << ": "<< m_mltProfile->width() << "\n...................\n\n"; /*if (xml.attribute("type").toInt() == TEXT && !QFile::exists(url.path())) { emit replyGetFileProperties(clipId, producer, QMap < QString, QString >(), QMap < QString, QString >(), replaceProducer); return; }*/ - if (xml.attribute("type").toInt() == COLOR) { + + if (type == COLOR) { producer = new Mlt::Producer(*m_mltProfile, 0, ("colour:" + xml.attribute("colour")).toUtf8().constData()); - } else if (xml.attribute("type").toInt() == TEXT) { + } else if (type == TEXT) { producer = new Mlt::Producer(*m_mltProfile, 0, ("kdenlivetitle:" + xml.attribute("resource")).toUtf8().constData()); if (producer && producer->is_valid() && xml.hasAttribute("xmldata")) producer->set("xmldata", xml.attribute("xmldata").toUtf8().constData()); @@ -598,8 +608,7 @@ void Render::getFileProperties(const QDomElement xml, const QString &clipId, int } // setup length here as otherwise default length (currently 15000 frames in MLT) will be taken even if outpoint is larger - if (xml.attribute("type").toInt() == COLOR || xml.attribute("type").toInt() == TEXT - || xml.attribute("type").toInt() == IMAGE || xml.attribute("type").toInt() == SLIDESHOW) + if (type == COLOR || type == TEXT || type == IMAGE || type == SLIDESHOW) producer->set("length", xml.attribute("out").toInt() - xml.attribute("in").toInt() + 1); if (xml.hasAttribute("out")) @@ -628,7 +637,7 @@ void Render::getFileProperties(const QDomElement xml, const QString &clipId, int Mlt::Frame *frame = producer->get_frame(); - if (xml.attribute("type").toInt() == SLIDESHOW) { + if (type == SLIDESHOW) { int ttl = xml.hasAttribute("ttl") ? xml.attribute("ttl").toInt() : 0; if (ttl) producer->set("ttl", ttl); if (!xml.attribute("animation").isEmpty()) { @@ -788,7 +797,6 @@ void Render::getFileProperties(const QDomElement xml, const QString &clipId, int metadataPropertyMap[ name.section('.', 0, -2)] = value; } producer->seek(0); - kDebug() << "REquested fuile info for: " << url.path(); emit replyGetFileProperties(clipId, producer, filePropertyMap, metadataPropertyMap, replaceProducer); // FIXME: should delete this to avoid a leak... //delete producer; @@ -1219,20 +1227,17 @@ void Render::pause() void Render::switchPlay() { - kDebug() << "// SWITCH PLAY"; if (!m_mltProducer || !m_mltConsumer) return; if (m_isZoneMode) resetZoneMode(); if (m_mltProducer->get_speed() == 0.0) { m_isBlocked = false; - kDebug() << "// SWITCH PLAY, set spped to 1"; if (m_name == "clip" && m_framePosition == (int) m_mltProducer->get_out()) m_mltProducer->seek(0); m_mltProducer->set_speed(1.0); m_mltConsumer->set("refresh", 1); } else { m_isBlocked = true; m_mltConsumer->set("refresh", 0); - kDebug() << "// SWITCH PLAY, set spped to 0"; m_mltProducer->set_speed(0.0); //emit rendererPosition(m_framePosition); m_mltProducer->seek(m_framePosition); @@ -1457,7 +1462,7 @@ void Render::showFrame(Mlt::Frame& frame) QImage qimage(width, height, QImage::Format_ARGB32_Premultiplied); memcpy(qimage.scanLine(0), image, width * height * 4); emit showImageSignal(qimage); - showAudio(frame); + if (analyseAudio) showAudio(frame); if (sendFrameForAnalysis && frame.get_frame()->convert_image) { emit frameUpdated(qimage.rgbSwapped()); } @@ -1465,29 +1470,27 @@ void Render::showFrame(Mlt::Frame& frame) void Render::showAudio(Mlt::Frame& frame) { - if (!frame.is_valid() || frame.get_int("test_audio") != 0) return; + if (!frame.is_valid() || frame.get_int("test_audio") != 0) { + return; + } mlt_audio_format audio_format = mlt_audio_s16; int freq = 0; int num_channels = 0; int samples = 0; int16_t* data = (int16_t*)frame.get_audio(audio_format, freq, num_channels, samples); - if (!data) + + if (!data) { return; - int num_samples = samples > 200 ? 200 : samples; - QByteArray channels; - for (int i = 0; i < num_channels; i++) { - long val = 0; - for (int s = 0; s < num_samples; s ++) { - val += abs(data[i+s*num_channels] / 128); - } - channels.append(val / num_samples); } + // Data format: [ c00 c10 c01 c11 c02 c12 c03 c13 ... c0{samples-1} c1{samples-1} for 2 channels. + // So the vector is of size samples*channels. + QVector sampleVector(samples*num_channels); + memcpy(sampleVector.data(), data, samples*num_channels*sizeof(int16_t)); - if (samples > 0) - emit showAudioSignal(channels); - else - emit showAudioSignal(QByteArray()); + if (samples > 0) { + emit audioSamplesSignal(sampleVector, freq, num_channels, samples); + } } /* @@ -2305,7 +2308,7 @@ bool Render::mltAddTrackEffect(int track, EffectsParameterList params) Mlt::Producer trackProducer(tractor.track(track)); Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service()); Mlt::Service trackService(trackProducer.get_service()); //trackPlaylist - return mltAddEffect(trackService, params, 15000, true); + return mltAddEffect(trackService, params, trackProducer.get_playtime() - 1, true); }