#include <QDebug>
-
static void kdenlive_callback(void* /*ptr*/, int level, const char* fmt, va_list vl)
{
if (level > MLT_LOG_ERROR) return;
if (self->sendFrameForAnalysis && frame_ptr->convert_image) {
self->emitFrameUpdated(frame);
}
- if (self->analyseAudio) 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) {
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("buffer", 12);
+ m_mltConsumer->set("deinterlace_method", "onefield");
mlt_log_set_callback(kdenlive_callback);
}
if (m_mltConsumer && m_mltConsumer->is_valid()) return;
void Render::getFileProperties(const QDomElement xml, const QString &clipId, int imageHeight, bool replaceProducer)
{
- KUrl url = KUrl(xml.attribute("resource", QString()));
+ QString path;
+ if (KdenliveSettings::enableproxy() && xml.hasAttribute("proxy")) path = xml.attribute("proxy");
+ else path = xml.attribute("resource");
+ KUrl url = KUrl(path);
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);
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);
- QVector<int16_t> sampleVector(samples);
- memcpy(sampleVector.data(), data, samples*sizeof(int16_t));
- qDebug() << samples << " samples. Freq=" << freq << ", channels=" << num_channels;
-
- 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);
}
- qDebug() << channels.size() << ": size.";
+ // 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<int16_t> sampleVector(samples*num_channels);
+ memcpy(sampleVector.data(), data, samples*num_channels*sizeof(int16_t));
+
if (samples > 0) {
- emit showAudioSignal(channels);
- qDebug() << "Emitting audioSamplesSignal with " << samples << " samples.";
emit audioSamplesSignal(sampleVector, freq, num_channels, samples);
- } else {
- emit showAudioSignal(QByteArray());
- qDebug() << "Not emitting audioSamplesSignal.";
}
}
mlt_service_unlock(service.get_service());
return false;
}
- Mlt::Producer *clip2 = prod->cut(info.cropStart.frames(m_fps), (info.cropDuration + info.cropStart).frames(m_fps));
+
+ Mlt::Producer *clip2 = prod->cut(info.cropStart.frames(m_fps), (info.cropDuration + info.cropStart).frames(m_fps) - 1);
trackPlaylist.insert_at(info.startPos.frames(m_fps), clip2, 1);
delete clip2;
}
int position = trackPlaylist.clip_start(clipIndex);
int blankDuration = trackPlaylist.clip_length(clipIndex);
- diff = -diff;
- if (blankDuration - diff == 0) {
+ if (blankDuration + diff == 0) {
trackPlaylist.remove(clipIndex);
- } else trackPlaylist.remove_region(position, diff);
+ } else trackPlaylist.remove_region(position, -diff);
}
trackPlaylist.consolidate_blanks(0);
}
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);
}
m_isBlocked = true;
previousStart += moveFrame;
+ if (previousStart < 0) {
+ // this is possible for images and color clips
+ previousOut -= previousStart;
+ previousStart = 0;
+ }
+
int length = previousOut + 1;
if (length > clip->get_length()) {
clip->parent().set("length", length + 1);