1 /***************************************************************************
2 * Copyright (C) 2012 by Simon Andreas Eugster (simon.eu@gmail.com) *
3 * This file is part of kdenlive. See www.kdenlive.org. *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 ***************************************************************************/
11 #include "audioEnvelope.h"
13 #include "audioStreamInfo.h"
19 AudioEnvelope::AudioEnvelope(Mlt::Producer *producer) :
22 m_envelopeStdDevCalculated(false)
24 m_info = new AudioInfo(m_producer);
27 AudioEnvelope::~AudioEnvelope()
29 if (m_envelope != NULL) {
36 void AudioEnvelope::loadEnvelope()
38 Q_ASSERT(m_envelope == NULL);
40 std::cout << "Loading envelope ..." << std::endl;
42 m_envelopeSize = m_producer->get_length();
44 int samplingRate = m_info->info(0)->samplingRate();
45 mlt_audio_format format_s16 = mlt_audio_s16;
52 m_envelope = new uint64_t[m_envelopeSize];
58 for (int i = 0; i < m_envelopeSize; i++) {
60 frame = m_producer->get_frame(i);
61 position = mlt_frame_get_position(frame->get_frame());
62 samples = mlt_sample_calculator(m_producer->get_fps(), samplingRate, position);
64 int16_t *data = static_cast<int16_t*>(frame->get_audio(format_s16, samplingRate, channels, samples));
67 for (int k = 0; k < samples; k++) {
72 m_envelopeMean += sum;
73 if (sum > m_envelopeMax) {
77 m_envelopeMean /= m_envelopeSize;
78 std::cout << "Calculating the envelope (" << m_envelopeSize << " frames) took "
79 << t.elapsed() << " ms." << std::endl;
82 int64_t AudioEnvelope::loadStdDev()
84 if (m_envelopeStdDevCalculated) {
85 std::cout << "Standard deviation already calculated, not re-calculating." << std::endl;
88 if (m_envelope == NULL) {
93 for (int i = 0; i < m_envelopeSize; i++) {
94 m_envelopeStdDev += sqrt((m_envelope[i]-m_envelopeMean)*(m_envelope[i]-m_envelopeMean)/m_envelopeSize);
96 m_envelopeStdDevCalculated = true;
99 return m_envelopeStdDev;
102 QImage AudioEnvelope::drawEnvelope()
104 if (m_envelope == NULL) {
108 QImage img(m_envelopeSize, 400, QImage::Format_ARGB32);
109 img.fill(qRgb(255,255,255));
111 for (int x = 0; x < img.width(); x++) {
112 fy = m_envelope[x]/double(m_envelopeMax) * img.height();
113 for (int y = img.height()-1; y > img.height()-1-fy; y--) {
114 img.setPixel(x,y, qRgb(50, 50, 50));
120 void AudioEnvelope::dumpInfo() const
122 if (m_envelope == NULL) {
123 std::cout << "Envelope not generated, no information available." << std::endl;
125 std::cout << "Envelope info" << std::endl
126 << "* size = " << m_envelopeSize << std::endl
127 << "* max = " << m_envelopeMax << std::endl
128 << "* ยต = " << m_envelopeMean << std::endl
130 if (m_envelopeStdDevCalculated) {
131 std::cout << "* s = " << m_envelopeStdDev << std::endl;