X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Frenderer.cpp;h=26ecea8710d3c0ebc971781e9b6fa02fb1d730be;hb=31ed07c68c21990dde342220bb045178b2ac0ea7;hp=2f554c903cd6eb8638ec6eb37605ebd7d110f722;hpb=7893afa29547c481ca7e58363a7e82bdb824ebf8;p=kdenlive diff --git a/src/renderer.cpp b/src/renderer.cpp index 2f554c90..26ecea87 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -104,10 +104,6 @@ Render::Render(const QString & rendererName, int winid, QString profile, QWidget m_blackClip(NULL), m_winid(winid) { - /*if (rendererName == "project") m_monitorId = 10000; - else m_monitorId = 10001;*/ - /*m_osdTimer = new QTimer(this); - connect(m_osdTimer, SIGNAL(timeout()), this, SLOT(slotOsdTimeout()));*/ if (profile.isEmpty()) profile = KdenliveSettings::current_profile(); buildConsumer(profile); @@ -182,6 +178,7 @@ void Render::buildConsumer(const QString profileName) //TODO: uncomment following line when everything is clean //if (m_mltProfile) delete m_mltProfile; m_mltProfile = new Mlt::Profile(tmp); + m_mltProfile->get_profile()->is_explicit = 1; delete[] tmp; QString videoDriver = KdenliveSettings::videodrivername(); @@ -232,9 +229,6 @@ void Render::buildConsumer(const QString profileName) if (!audioDriver.isEmpty()) m_mltConsumer->set("audio_driver", audioDriver.toUtf8().constData()); - int volume = KdenliveSettings::volume(); - m_mltConsumer->set("volume", (float)volume / 100); - m_mltConsumer->set("progressive", 1); m_mltConsumer->set("audio_buffer", 1024); m_mltConsumer->set("frequency", 48000); @@ -260,9 +254,7 @@ int Render::resetProfile(const QString profileName) 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"); - int volume = KdenliveSettings::volume(); - int currentVolume = (int)(QString(m_mltConsumer->get("volume")).toDouble() * 100.0); - if (m_activeProfile == profileName && currentDriver == videoDriver && volume == currentVolume && background == currentBackground) { + if (m_activeProfile == profileName && currentDriver == videoDriver && background == currentBackground) { kDebug() << "reset to same profile, nothing to do"; return 1; } @@ -538,6 +530,15 @@ void Render::getFileProperties(const QDomElement xml, const QString &clipId, int if (aspect > 0) producer->set("force_aspect_ratio", aspect); } + if (xml.hasAttribute("force_aspect_num") && xml.hasAttribute("force_aspect_den")) { + int width = xml.attribute("frame_size").section('x', 0, 0).toInt(); + int height = xml.attribute("frame_size").section('x', 1, 1).toInt(); + int aspectNumerator = xml.attribute("force_aspect_num").toInt(); + int aspectDenominator = xml.attribute("force_aspect_den").toInt(); + if (aspectDenominator != 0 && width != 0) + producer->set("force_aspect_ratio", double(height) * aspectNumerator / aspectDenominator / width ); + } + if (xml.hasAttribute("force_fps")) { double fps = xml.attribute("force_fps").toDouble(); if (fps > 0) producer->set("force_fps", fps); @@ -560,6 +561,14 @@ void Render::getFileProperties(const QDomElement xml, const QString &clipId, int int aindex = xml.attribute("audio_index").toInt(); if (aindex != 0) producer->set("audio_index", aindex); } + if (xml.hasAttribute("force_colorspace")) { + int colorspace = xml.attribute("force_colorspace").toInt(); + if (colorspace != 0) producer->set("force_colorspace", colorspace); + } + if (xml.hasAttribute("full_luma")) { + int full_luma = xml.attribute("full_luma").toInt(); + if (full_luma != 0) producer->set("set.force_full_luma", full_luma); + } // 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 @@ -638,8 +647,9 @@ void Render::getFileProperties(const QDomElement xml, const QString &clipId, int } } - - filePropertyMap["fps"] = producer->get("source_fps"); + if (producer->get_double("meta.media.frame_rate_den") > 0) { + filePropertyMap["fps"] = QString::number(producer->get_double("meta.media.frame_rate_num") / producer->get_double("meta.media.frame_rate_den")); + } else filePropertyMap["fps"] = producer->get("source_fps"); if (frame && frame->is_valid()) { filePropertyMap["frame_size"] = QString::number(frame->get_int("width")) + 'x' + QString::number(frame->get_int("height")); @@ -720,6 +730,10 @@ void Render::getFileProperties(const QDomElement xml, const QString &clipId, int if (producer->get(property)) filePropertyMap["videocodec"] = producer->get(property); } + QString query; + query = QString("meta.media.%1.codec.pix_fmt").arg(default_video); + filePropertyMap["pix_fmt"] = producer->get(query.toUtf8().constData()); + filePropertyMap["colorspace"] = producer->get("meta.media.colorspace"); if (KdenliveSettings::dropbframes()) { kDebug() << "// LOOKING FOR H264 on: " << default_video; @@ -812,7 +826,6 @@ int Render::setProducer(Mlt::Producer *producer, int position) } else return -1; m_mltConsumer->purge(); - m_isBlocked = true; if (m_mltProducer) { m_mltProducer->set_speed(0); @@ -823,6 +836,7 @@ int Render::setProducer(Mlt::Producer *producer, int position) if (producer) { m_mltProducer = new Mlt::Producer(producer->get_producer()); } else m_mltProducer = m_blackClip->cut(0, 50); + /*if (KdenliveSettings::dropbframes()) { m_mltProducer->set("skip_loop_filter", "all"); m_mltProducer->set("skip_frame", "bidir"); @@ -831,7 +845,8 @@ int Render::setProducer(Mlt::Producer *producer, int position) kDebug() << " WARNING - - - - -INVALID PLAYLIST: "; return -1; } - + int volume = KdenliveSettings::volume(); + m_mltProducer->set("meta.volume", (double)volume / 100); m_fps = m_mltProducer->get_fps(); int error = connectPlaylist(); @@ -918,7 +933,8 @@ int Render::setSceneList(QString playlist, int position) m_mltProducer = m_blackClip->cut(0, 50); error = -1; } - + int volume = KdenliveSettings::volume(); + m_mltProducer->set("meta.volume", (double)volume / 100); m_mltProducer->optimise(); /*if (KdenliveSettings::osdtimecode()) { @@ -964,7 +980,8 @@ int Render::setSceneList(QString playlist, int position) const QString Render::sceneList() { QString playlist; - Mlt::Consumer xmlConsumer(*m_mltProfile, "xml:kdenlive_playlist"); + Mlt::Profile profile((mlt_profile) 0); + Mlt::Consumer xmlConsumer(profile, "xml:kdenlive_playlist"); m_mltProducer->optimise(); xmlConsumer.set("terminate_on_pause", 1); Mlt::Producer prod(m_mltProducer->get_producer()); @@ -1072,9 +1089,17 @@ void Render::refreshDisplay() refresh(); } -void Render::setVolume(double /*volume*/) +int Render::volume() const +{ + if (!m_mltConsumer || !m_mltProducer) return -1; + return ((int) 100 * m_mltProducer->get_double("meta.volume")); +} + +void Render::slotSetVolume(int volume) { if (!m_mltConsumer || !m_mltProducer) return; + m_mltProducer->set("meta.volume", (double)volume / 100.0); + return; /*osdTimer->stop(); m_mltConsumer->set("refresh", 0); // Attach filter for on screen display of timecode @@ -1364,8 +1389,6 @@ void Render::emitConsumerStopped() if (m_isLoopMode) play(m_loopStart); else if (m_isZoneMode) resetZoneMode(); emit rendererStopped((int) pos); - //if (qApp->activeWindow()) QApplication::postEvent(qApp->activeWindow(), new PositionChangeEvent(GenTime((int) pos, m_fps), m_monitorId + 100)); - //new QCustomEvent(10002)); } } @@ -1421,38 +1444,19 @@ void Render::showFrame(Mlt::Frame& frame) void Render::showAudio(Mlt::Frame& frame) { if (!frame.is_valid() || frame.get_int("test_audio") != 0) return; - mlt_audio_format audio_format = mlt_audio_pcm; + mlt_audio_format audio_format = mlt_audio_s16; int freq = 0; int num_channels = 0; int samples = 0; - uint8_t* data = (uint8_t*)frame.get_audio(audio_format, freq, num_channels, samples); + int16_t* data = (int16_t*)frame.get_audio(audio_format, freq, num_channels, samples); if (!data) return; - int value = 0; + int num_samples = samples > 200 ? 200 : samples; QByteArray channels; for (int i = 0; i < num_channels; i++) { - /* switch (audio_format) - { - case 0: - value=( ( (uint8_t*)data) [i] ); - break; - case 1: - value=( ( (uint16_t*)data) [i] >> 8 ); - break; - case 2: - value=( ((uint32_t*)data) [i] >> 16 ); - break; - case 3: - value=( ((float*)data) [i]*255); - break; - default: - value=0; - } - */ long val = 0; - int num_samples = 20; - for (int s = 0; s < samples; s += samples / num_samples) { - val += (data[i+s*num_channels] - 127); + for (int s = 0; s < num_samples; s ++) { + val += abs(data[i+s*num_channels] / 128); } channels.append(val / num_samples); } @@ -1460,6 +1464,8 @@ void Render::showAudio(Mlt::Frame& frame) if (samples > 0) emit showAudioSignal(channels); + else + emit showAudioSignal(QByteArray()); } /* @@ -2071,6 +2077,10 @@ int Render::mltChangeClipSpeed(ItemInfo info, ItemInfo speedIndependantInfo, dou slowprod->set("force_progressive", original->parent().get_int("force_progressive")); int ix = original->parent().get_int("video_index"); if (ix != 0) slowprod->set("video_index", ix); + int colorspace = original->parent().get_int("force_colorspace"); + if (colorspace != 0) slowprod->set("force_colorspace", colorspace); + int full_luma = original->parent().get_int("set.force_full_luma"); + if (full_luma != 0) slowprod->set("set.force_full_luma", full_luma); m_slowmotionProducers.insert(url, slowprod); } Mlt::Producer *clip = trackPlaylist.replace_with_blank(clipIndex); @@ -2144,6 +2154,10 @@ int Render::mltChangeClipSpeed(ItemInfo info, ItemInfo speedIndependantInfo, dou if (threads != 0) slowprod->set("threads", threads); int ix = original->parent().get_int("video_index"); if (ix != 0) slowprod->set("video_index", ix); + int colorspace = original->parent().get_int("force_colorspace"); + if (colorspace != 0) slowprod->set("force_colorspace", colorspace); + int full_luma = original->parent().get_int("set.force_full_luma"); + if (full_luma != 0) slowprod->set("set.force_full_luma", full_luma); m_slowmotionProducers.insert(url, slowprod); } Mlt::Producer *clip = trackPlaylist.replace_with_blank(clipIndex); @@ -2818,11 +2832,7 @@ bool Render::mltResizeClipEnd(ItemInfo info, GenTime clipDuration) int newDuration = (int) clipDuration.frames(m_fps) - 1; int diff = newDuration - (trackPlaylist.clip_length(clipIndex) - 1); - int currentOut; - if (info.cropStart < GenTime()) - currentOut = newDuration - info.cropStart.frames(m_fps); - else - currentOut = newDuration + previousStart; + int currentOut = newDuration + previousStart; if (currentOut > clip->get_length()) { clip->parent().set("length", currentOut + 1); clip->parent().set("out", currentOut); @@ -2950,11 +2960,6 @@ bool Render::mltResizeClipStart(ItemInfo info, GenTime diff) m_isBlocked = true; previousStart += moveFrame; - if (previousStart < 0) { - // special case, in point becoming negative (resizing images) - previousOut -= previousStart; - previousStart = 0; - } int length = previousOut + 1; if (length > clip->get_length()) { @@ -2976,8 +2981,10 @@ bool Render::mltResizeClipStart(ItemInfo info, GenTime diff) if (! trackPlaylist.is_blank(blankIndex)) { kDebug() << "WARNING, CLIP TO RESIZE IS NOT BLANK"; } - if (blankLength + moveFrame == 0) trackPlaylist.remove(blankIndex); - else trackPlaylist.resize_clip(blankIndex, 0, blankLength + moveFrame - 1); + if (blankLength + moveFrame == 0) + trackPlaylist.remove(blankIndex); + else + trackPlaylist.resize_clip(blankIndex, 0, blankLength + moveFrame - 1); } trackPlaylist.consolidate_blanks(0); /*if (QString(clip->parent().get("transparency")).toInt() == 1) {