thumbnail/waveform generation

This commit is contained in:
itsmattkc
2018-06-15 20:17:05 -07:00
parent f8ce6c08f8
commit dc8d4728fc
29 changed files with 849 additions and 479 deletions
+4 -2
View File
@@ -21,13 +21,15 @@ NewSequenceDialog::NewSequenceDialog(QWidget *parent) :
ui->frame_rate_combobox->addItem("10 FPS", 10.0f); ui->frame_rate_combobox->addItem("10 FPS", 10.0f);
ui->frame_rate_combobox->addItem("12.5 FPS", 12.5f); ui->frame_rate_combobox->addItem("12.5 FPS", 12.5f);
ui->frame_rate_combobox->addItem("15 FPS", 15.0f); ui->frame_rate_combobox->addItem("15 FPS", 15.0f);
ui->frame_rate_combobox->addItem("25 FPS", 25.0f); ui->frame_rate_combobox->addItem("23.976 FPS", 23.976f);
ui->frame_rate_combobox->addItem("24 FPS", 24.0f);
ui->frame_rate_combobox->addItem("25 FPS", 25.0f);
ui->frame_rate_combobox->addItem("29.97 FPS", 29.97f); ui->frame_rate_combobox->addItem("29.97 FPS", 29.97f);
ui->frame_rate_combobox->addItem("30 FPS", (float) 30.0f); ui->frame_rate_combobox->addItem("30 FPS", (float) 30.0f);
ui->frame_rate_combobox->addItem("50 FPS", (float) 50.0f); ui->frame_rate_combobox->addItem("50 FPS", (float) 50.0f);
ui->frame_rate_combobox->addItem("59.94 FPS", (float) 59.94f); ui->frame_rate_combobox->addItem("59.94 FPS", (float) 59.94f);
ui->frame_rate_combobox->addItem("60 FPS", (float) 60.0f); ui->frame_rate_combobox->addItem("60 FPS", (float) 60.0f);
ui->frame_rate_combobox->setCurrentIndex(4); ui->frame_rate_combobox->setCurrentIndex(6);
ui->audio_frequency_combobox->addItem("22050 Hz", 22050); ui->audio_frequency_combobox->addItem("22050 Hz", 22050);
ui->audio_frequency_combobox->addItem("24000 Hz", 24000); ui->audio_frequency_combobox->addItem("24000 Hz", 24000);
+2 -2
View File
@@ -51,7 +51,7 @@ private:
class VolumeEffect : public Effect { class VolumeEffect : public Effect {
public: public:
VolumeEffect(Clip* c); VolumeEffect(Clip* c);
void process_audio(uint8_t* samples, int nb_bytes); void process_audio(quint8* samples, int nb_bytes);
Effect* copy(Clip* c); Effect* copy(Clip* c);
void load(QXmlStreamReader* stream); void load(QXmlStreamReader* stream);
void save(QXmlStreamWriter* stream); void save(QXmlStreamWriter* stream);
@@ -62,7 +62,7 @@ public:
class PanEffect : public Effect { class PanEffect : public Effect {
public: public:
PanEffect(Clip* c); PanEffect(Clip* c);
void process_audio(uint8_t* samples, int nb_bytes); void process_audio(quint8* samples, int nb_bytes);
Effect* copy(Clip* c); Effect* copy(Clip* c);
void load(QXmlStreamReader* stream); void load(QXmlStreamReader* stream);
void save(QXmlStreamWriter* stream); void save(QXmlStreamWriter* stream);
+7 -7
View File
@@ -45,10 +45,10 @@ void PanEffect::save(QXmlStreamWriter *stream) {
stream->writeTextElement("pan", QString::number(pan_val->value())); stream->writeTextElement("pan", QString::number(pan_val->value()));
} }
void PanEffect::process_audio(uint8_t *samples, int nb_bytes) { void PanEffect::process_audio(quint8 *samples, int nb_bytes) {
for (int i=0;i<nb_bytes;i+=4) { for (int i=0;i<nb_bytes;i+=4) {
int16_t left_sample = (int16_t) ((samples[i+1] << 8) | samples[i]); qint16 left_sample = (qint16) ((samples[i+1] << 8) | samples[i]);
int16_t right_sample = (int16_t) ((samples[i+3] << 8) | samples[i+2]); qint16 right_sample = (qint16) ((samples[i+3] << 8) | samples[i+2]);
float val = pan_val->value()*0.01; float val = pan_val->value()*0.01;
if (val < 0) { if (val < 0) {
@@ -59,9 +59,9 @@ void PanEffect::process_audio(uint8_t *samples, int nb_bytes) {
left_sample *= (1-val); left_sample *= (1-val);
} }
samples[i+3] = (uint8_t) (right_sample >> 8); samples[i+3] = (quint8) (right_sample >> 8);
samples[i+2] = (uint8_t) right_sample; samples[i+2] = (quint8) right_sample;
samples[i+1] = (uint8_t) (left_sample >> 8); samples[i+1] = (quint8) (left_sample >> 8);
samples[i] = (uint8_t) left_sample; samples[i] = (quint8) left_sample;
} }
} }
+4 -4
View File
@@ -45,11 +45,11 @@ void VolumeEffect::save(QXmlStreamWriter *stream) {
stream->writeTextElement("volume", QString::number(volume_val->value())); stream->writeTextElement("volume", QString::number(volume_val->value()));
} }
void VolumeEffect::process_audio(uint8_t *samples, int nb_bytes) { void VolumeEffect::process_audio(quint8 *samples, int nb_bytes) {
for (int i=0;i<nb_bytes;i+=2) { for (int i=0;i<nb_bytes;i+=2) {
int16_t full_sample = (int16_t) ((samples[i+1] << 8) | samples[i]); qint16 full_sample = (qint16) ((samples[i+1] << 8) | samples[i]);
full_sample *= volume_val->value()*0.01; full_sample *= volume_val->value()*0.01;
samples[i+1] = (uint8_t) (full_sample >> 8); samples[i+1] = (quint8) (full_sample >> 8);
samples[i] = (uint8_t) full_sample; samples[i] = (quint8) full_sample;
} }
} }
+2 -2
View File
@@ -21,7 +21,7 @@ extern "C" {
#include <QApplication> #include <QApplication>
#include <QOffscreenSurface> #include <QOffscreenSurface>
#include <QOpenGLFramebufferObject> #include <QOpenGLFramebufferObject>
#include <QOpenGlPaintDevice> #include <QOpenGLPaintDevice>
#include <QPainter> #include <QPainter>
bool encode(AVFormatContext* fmt_ctx, AVCodecContext* codec_ctx, AVFrame* frame, AVPacket* packet, AVStream* stream) { bool encode(AVFormatContext* fmt_ctx, AVCodecContext* codec_ctx, AVFrame* frame, AVPacket* packet, AVStream* stream) {
@@ -277,7 +277,7 @@ void ExportThread::run() {
long file_audio_samples = 0; long file_audio_samples = 0;
while (panel_timeline->playhead < end && !fail) { while (panel_timeline->playhead < end && !fail) {
panel_viewer->viewer_widget->paintGL(); panel_viewer->viewer_widget->update();
double timecode_secs = (double) panel_timeline->playhead / sequence->frame_rate; double timecode_secs = (double) panel_timeline->playhead / sequence->frame_rate;
if (video_enabled) { if (video_enabled) {
+4 -1
View File
@@ -6,6 +6,7 @@
#include <QMetaType> #include <QMetaType>
#include <QVariant> #include <QVariant>
#include <QMutex> #include <QMutex>
#include <QPixmap>
struct Sequence; struct Sequence;
@@ -16,8 +17,10 @@ struct MediaStream {
bool infinite_length; bool infinite_length;
// preview thumbnail/waveform // preview thumbnail/waveform
QPixmap* preview; bool preview_done;
QImage preview;
QMutex preview_lock; QMutex preview_lock;
int preview_audio_index;
}; };
struct Media struct Media
+173 -2
View File
@@ -1,10 +1,181 @@
#include "previewgenerator.h" #include "previewgenerator.h"
PreviewGenerator::PreviewGenerator(QObject* parent) : QThread(parent) #include "media.h"
{
#include <QPainter>
#include <QPixmap>
#include <QDebug>
#include <QtMath>
extern "C" {
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libswresample/swresample.h>
} }
PreviewGenerator::PreviewGenerator(QObject* parent) : QThread(parent) {
media = NULL;
fmt_ctx = NULL;
}
MediaStream* PreviewGenerator::get_stream_from_file_index(int index) {
for (int i=0;i<media->video_tracks.size();i++) {
if (media->video_tracks.at(i)->file_index == index) {
return media->video_tracks.at(i);
}
}
for (int i=0;i<media->audio_tracks.size();i++) {
if (media->audio_tracks.at(i)->file_index == index) {
return media->audio_tracks.at(i);
}
}
return NULL;
}
#define WAVEFORM_RESOLUTION 256
void PreviewGenerator::run() { void PreviewGenerator::run() {
if (media == NULL) {
qDebug() << "[ERROR] No media was set for preview generation";
} else {
if (media->is_sequence) {
qDebug() << "[ERROR] Cannot run preview generation on a sequence";
} else {
SwsContext* sws_ctx;
SwrContext* swr_ctx;
AVFrame* temp_frame = av_frame_alloc();
AVCodecContext* codec_ctx[fmt_ctx->nb_streams];
for (unsigned int i=0;i<fmt_ctx->nb_streams;i++) {
AVCodec* codec = avcodec_find_decoder(fmt_ctx->streams[i]->codecpar->codec_id);
codec_ctx[i] = avcodec_alloc_context3(codec);
avcodec_parameters_to_context(codec_ctx[i], fmt_ctx->streams[i]->codecpar);
avcodec_open2(codec_ctx[i], codec, NULL);
if (fmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
// initiate qimage
MediaStream* ms = get_stream_from_file_index(i);
ms->preview = QImage(fmt_ctx->streams[i]->duration * av_q2d(fmt_ctx->streams[i]->time_base) * WAVEFORM_RESOLUTION, 255, QImage::Format_RGBA8888);
ms->preview_audio_index = 0;
ms->preview.fill(Qt::transparent);
}
}
AVPacket packet;
bool done = true;
while (av_read_frame(fmt_ctx, &packet) >= 0) {
MediaStream* s = get_stream_from_file_index(packet.stream_index);
if (s != NULL && !s->preview_done) {
if (avcodec_send_packet(codec_ctx[packet.stream_index], &packet) >= 0) {
if (avcodec_receive_frame(codec_ctx[packet.stream_index], temp_frame) >= 0) {
if (fmt_ctx->streams[packet.stream_index]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
int dstH = 120;
int dstW = dstH * ((float)temp_frame->width/(float)temp_frame->height);
uint8_t* data = new uint8_t[dstW*dstH*3];
sws_ctx = sws_getContext(
temp_frame->width,
temp_frame->height,
static_cast<AVPixelFormat>(temp_frame->format),
dstW,
dstH,
static_cast<AVPixelFormat>(AV_PIX_FMT_RGB24),
SWS_FAST_BILINEAR,
NULL,
NULL,
NULL
);
int linesize[AV_NUM_DATA_POINTERS];
linesize[0] = dstW*3;
sws_scale(sws_ctx, temp_frame->data, temp_frame->linesize, 0, temp_frame->height, &data, linesize);
s->preview = QImage(data, dstW, dstH, linesize[0], QImage::Format_RGB888);
// delete [] data;
s->preview_done = true;
s->preview_lock.unlock();
sws_freeContext(sws_ctx);
} else if (fmt_ctx->streams[packet.stream_index]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
int interval = qFloor((temp_frame->sample_rate/WAVEFORM_RESOLUTION)/4)*4;
swr_ctx = swr_alloc_set_opts(
NULL,
temp_frame->channel_layout,
AV_SAMPLE_FMT_S16,
temp_frame->sample_rate,
temp_frame->channel_layout,
static_cast<AVSampleFormat>(temp_frame->format),
temp_frame->sample_rate,
0,
NULL
);
swr_init(swr_ctx);
AVFrame* swr_frame = av_frame_alloc();
swr_frame->channel_layout = temp_frame->channel_layout;
swr_frame->sample_rate = temp_frame->sample_rate;
swr_frame->format = AV_SAMPLE_FMT_S16;
swr_convert_frame(swr_ctx, swr_frame, temp_frame);
int channel_height = s->preview.height()/swr_frame->channels;
QPainter p;
p.begin(&s->preview);
p.setPen(QColor(80, 80, 80));
for (int i=0;i<swr_frame->nb_samples;i+=interval) {
for (int j=0;j<swr_frame->channels;j++) {
qint16 sample = ((swr_frame->data[0][i+1] << 8) | swr_frame->data[0][i]);
sample /= 256;
sample /= swr_frame->channels;
int mid = channel_height*j+(channel_height/2);
p.drawLine(s->preview_audio_index, mid, s->preview_audio_index, mid+sample);
i += 2;
}
s->preview_audio_index++;
}
p.end();
swr_free(&swr_ctx);
av_frame_free(&swr_frame);
}
} else {
qDebug() << "[ERROR] Failed to retrieve frame";
}
} else {
qDebug() << "[ERROR] Failed to send packet";
}
}
av_packet_unref(&packet);
// check if we've got all our previews
if (media->audio_tracks.size() == 0) {
done = true;
for (int i=0;i<media->video_tracks.size();i++) {
if (!media->video_tracks.at(i)->preview_done) {
done = false;
break;
}
}
if (done) {
break;
}
}
}
for (int i=0;i<media->audio_tracks.size();i++) {
media->audio_tracks.at(i)->preview_done = true;
media->audio_tracks.at(i)->preview_lock.unlock();
}
av_frame_free(&temp_frame);
for (unsigned int i=0;i<fmt_ctx->nb_streams;i++) {
avcodec_close(codec_ctx[i]);
}
}
}
if (fmt_ctx != NULL) {
avformat_close_input(&fmt_ctx);
}
} }
+8 -1
View File
@@ -3,11 +3,18 @@
#include <QThread> #include <QThread>
struct Media;
struct MediaStream;
struct AVFormatContext;
class PreviewGenerator : public QThread class PreviewGenerator : public QThread
{ {
public: public:
PreviewGenerator(QObject* parent = 0); PreviewGenerator(QObject* parent = 0);
void run() override; void run();
MediaStream* get_stream_from_file_index(int index);
Media* media;
AVFormatContext* fmt_ctx;
}; };
#endif // PREVIEWGENERATOR_H #endif // PREVIEWGENERATOR_H
+51 -5
View File
@@ -21,11 +21,6 @@
#define OLIVE_FILE_FILTER "Olive Project (*.ove)" #define OLIVE_FILE_FILTER "Olive Project (*.ove)"
void MainWindow::setup_layout() { void MainWindow::setup_layout() {
panel_project = new Project(this);
panel_effect_controls = new EffectControls(this);
panel_viewer = new Viewer(this);
panel_timeline = new Timeline(this);
addDockWidget(Qt::TopDockWidgetArea, panel_project); addDockWidget(Qt::TopDockWidgetArea, panel_project);
addDockWidget(Qt::TopDockWidgetArea, panel_effect_controls); addDockWidget(Qt::TopDockWidgetArea, panel_effect_controls);
addDockWidget(Qt::TopDockWidgetArea, panel_viewer); addDockWidget(Qt::TopDockWidgetArea, panel_viewer);
@@ -69,12 +64,23 @@ MainWindow::MainWindow(QWidget *parent) :
setWindowTitle("Olive (May 2018 | Pre-Alpha)"); setWindowTitle("Olive (May 2018 | Pre-Alpha)");
statusBar()->showMessage("Welcome to Olive::Qt"); statusBar()->showMessage("Welcome to Olive::Qt");
// TODO maybe replace these with non-pointers later on?
panel_project = new Project(this);
panel_effect_controls = new EffectControls(this);
panel_viewer = new Viewer(this);
panel_timeline = new Timeline(this);
setup_layout(); setup_layout();
} }
MainWindow::~MainWindow() MainWindow::~MainWindow()
{ {
delete ui; delete ui;
delete panel_project;
delete panel_effect_controls;
delete panel_viewer;
delete panel_timeline;
} }
void MainWindow::on_action_Import_triggered() void MainWindow::on_action_Import_triggered()
@@ -272,3 +278,43 @@ void MainWindow::on_actionDeselect_All_triggered()
panel_timeline->deselect(); panel_timeline->deselect();
} }
} }
void MainWindow::on_actionGo_to_start_triggered()
{
if (panel_timeline->focused() || panel_viewer->hasFocus()) {
panel_timeline->go_to_start();
}
}
void MainWindow::on_actionReset_to_default_layout_triggered()
{
setup_layout();
}
void MainWindow::on_actionPrevious_Frame_triggered()
{
if (panel_timeline->focused() || panel_viewer->hasFocus()) {
panel_timeline->previous_frame();
}
}
void MainWindow::on_actionNext_Frame_triggered()
{
if (panel_timeline->focused() || panel_viewer->hasFocus()) {
panel_timeline->next_frame();
}
}
void MainWindow::on_actionGo_to_End_triggered()
{
if (panel_timeline->focused() || panel_viewer->hasFocus()) {
panel_timeline->go_to_end();
}
}
void MainWindow::on_actionPlay_Pause_triggered()
{
if (panel_timeline->focused() || panel_viewer->hasFocus()) {
panel_timeline->toggle_play();
}
}
+12
View File
@@ -73,6 +73,18 @@ private slots:
void on_actionDeselect_All_triggered(); void on_actionDeselect_All_triggered();
void on_actionGo_to_start_triggered();
void on_actionReset_to_default_layout_triggered();
void on_actionPrevious_Frame_triggered();
void on_actionNext_Frame_triggered();
void on_actionGo_to_End_triggered();
void on_actionPlay_Pause_triggered();
private: private:
Ui::MainWindow *ui; Ui::MainWindow *ui;
void setup_layout(); void setup_layout();
+59 -1
View File
@@ -24,7 +24,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>653</width> <width>653</width>
<height>17</height> <height>34</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="menu_File"> <widget class="QMenu" name="menu_File">
@@ -76,6 +76,8 @@
<addaction name="actionEffect_Controls"/> <addaction name="actionEffect_Controls"/>
<addaction name="actionViewer"/> <addaction name="actionViewer"/>
<addaction name="actionTimeline"/> <addaction name="actionTimeline"/>
<addaction name="separator"/>
<addaction name="actionReset_to_default_layout"/>
</widget> </widget>
<widget class="QMenu" name="menu_Help"> <widget class="QMenu" name="menu_Help">
<property name="title"> <property name="title">
@@ -91,9 +93,20 @@
<addaction name="actionZoom_In"/> <addaction name="actionZoom_In"/>
<addaction name="actionZoom_out"/> <addaction name="actionZoom_out"/>
</widget> </widget>
<widget class="QMenu" name="menuPlayback">
<property name="title">
<string>Playback</string>
</property>
<addaction name="actionGo_to_start"/>
<addaction name="actionPrevious_Frame"/>
<addaction name="actionPlay_Pause"/>
<addaction name="actionNext_Frame"/>
<addaction name="actionGo_to_End"/>
</widget>
<addaction name="menu_File"/> <addaction name="menu_File"/>
<addaction name="menuEdit"/> <addaction name="menuEdit"/>
<addaction name="menu_View"/> <addaction name="menu_View"/>
<addaction name="menuPlayback"/>
<addaction name="menuWindow"/> <addaction name="menuWindow"/>
<addaction name="menu_Help"/> <addaction name="menu_Help"/>
</widget> </widget>
@@ -303,6 +316,51 @@
<string>Deselect All</string> <string>Deselect All</string>
</property> </property>
</action> </action>
<action name="actionGo_to_start">
<property name="text">
<string>Go to Start</string>
</property>
<property name="shortcut">
<string>Home</string>
</property>
</action>
<action name="actionReset_to_default_layout">
<property name="text">
<string>Reset to default layout</string>
</property>
</action>
<action name="actionPrevious_Frame">
<property name="text">
<string>Previous Frame</string>
</property>
<property name="shortcut">
<string>Left</string>
</property>
</action>
<action name="actionPlay_Pause">
<property name="text">
<string>Play/Pause</string>
</property>
<property name="shortcut">
<string>Space</string>
</property>
</action>
<action name="actionNext_Frame">
<property name="text">
<string>Next Frame</string>
</property>
<property name="shortcut">
<string>Right</string>
</property>
</action>
<action name="actionGo_to_End">
<property name="text">
<string>Go to End</string>
</property>
<property name="shortcut">
<string>End</string>
</property>
</action>
</widget> </widget>
<layoutdefault spacing="6" margin="11"/> <layoutdefault spacing="6" margin="11"/>
<resources> <resources>
+336 -318
View File
@@ -1,318 +1,336 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject> <!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.6.1, 2018-06-13T17:04:15. --> <!-- Written by QtCreator 4.6.2, 2018-06-15T20:01:51. -->
<qtcreator> <qtcreator>
<data> <data>
<variable>EnvironmentId</variable> <variable>EnvironmentId</variable>
<value type="QByteArray">{3af06612-75ce-48d7-b444-7dc372f1566d}</value> <value type="QByteArray">{be57d5b1-e5ae-4026-9f48-bb6e01f50d4e}</value>
</data> </data>
<data> <data>
<variable>ProjectExplorer.Project.ActiveTarget</variable> <variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">0</value> <value type="int">0</value>
</data> </data>
<data> <data>
<variable>ProjectExplorer.Project.EditorSettings</variable> <variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap"> <valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value> <value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value> <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value> <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0"> <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value> <value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value"> <valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value> <value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap> </valuemap>
</valuemap> </valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1"> <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value> <value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value"> <valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value> <value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap> </valuemap>
</valuemap> </valuemap>
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value> <value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value> <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value> <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value> <value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value> <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value> <value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value> <value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value> <value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value> <value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value> <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value> <value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value> <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value> <value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value> <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value> <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value> <value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value> <value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value> <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value> <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value> <value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value> <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value> <value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
</valuemap> </valuemap>
</data> </data>
<data> <data>
<variable>ProjectExplorer.Project.PluginSettings</variable> <variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap"/> <valuemap type="QVariantMap"/>
</data> </data>
<data> <data>
<variable>ProjectExplorer.Project.Target.0</variable> <variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap"> <valuemap type="QVariantMap">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.10.1 MSVC2017 64bit</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.5.1 GCC 64bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.10.1 MSVC2017 64bit</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.5.1 GCC 64bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5101.win64_msvc2017_64_kit</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.55.gcc_64_kit</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value> <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value> <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value> <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0"> <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:/Users/Matt/Documents/temp</value> <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/matt/Documents/build-olive-Desktop_Qt_5_5_1_GCC_64bit-Debug</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value> <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value> <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value> <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value> <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</valuemap> </valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/> <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value> <value type="QString">-w</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value> <value type="QString">-r</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> </valuelist>
</valuemap> <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value> <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> </valuemap>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
</valuemap> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> </valuemap>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
</valuemap> <value type="QString">-w</value>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> <value type="QString">-r</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> </valuelist>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
</valuemap> <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> </valuemap>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> </valuemap>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value> <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value> <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
</valuemap> <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1"> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">//neptune/build-olive-qt-Desktop_Qt_5_10_1_MSVC2017_64bit-Release</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value> </valuemap>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/matt/build-olive-Desktop_Qt_5_5_1_GCC_64bit-Release</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value> <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value> <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
</valuemap> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/> </valuemap>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value> <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value> <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
</valuemap> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> <value type="QString">-w</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> <value type="QString">-r</value>
</valuemap> </valuelist>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> </valuemap>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> </valuemap>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
</valuemap> <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
</valuemap> <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> <value type="QString">-w</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> <value type="QString">-r</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> </valuelist>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value> <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value> <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value> </valuemap>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value> <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
</valuemap> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2"> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">//neptune/build-olive-qt-Desktop_Qt_5_10_1_MSVC2017_64bit-Profile</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> </valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value> <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value> <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value> </valuemap>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value> <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
</valuemap> <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/matt/build-olive-Desktop_Qt_5_5_1_GCC_64bit-Profile</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value> <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value> <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
</valuemap> <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value> <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> </valuemap>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
</valuemap> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> <value type="QString">-w</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> <value type="QString">-r</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> </valuelist>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/> <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value> <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> </valuemap>
</valuemap> <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> </valuemap>
</valuemap> <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Profile</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value> <value type="QString">-w</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value> <value type="QString">-r</value>
</valuemap> </valuelist>
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value> <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0"> <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value> </valuemap>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value> <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
</valuemap> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value> </valuemap>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy Configuration</value> <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value> <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
</valuemap> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Profile</value>
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0"> <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value> <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value> </valuemap>
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value> <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value> <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value> <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/> <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value> </valuemap>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value> <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy Configuration</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value> </valuemap>
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value> <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/> <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value> <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value> <value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value> <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value> <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value> <value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds"> <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<value type="int">0</value> <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
<value type="int">1</value> <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
<value type="int">2</value> <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
<value type="int">3</value> <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
<value type="int">4</value> <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
<value type="int">5</value> <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
<value type="int">6</value> <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
<value type="int">7</value> <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
<value type="int">8</value> <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
<value type="int">9</value> <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
<value type="int">10</value> <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
<value type="int">11</value> <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
<value type="int">12</value> <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
<value type="int">13</value> <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<value type="int">14</value> <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
</valuelist> <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
<value type="int" key="PE.EnvironmentAspect.Base">2</value> <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/> <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">olive</value> <value type="int">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> <value type="int">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:C:/Users/Matt/Desktop/olive/olive.pro</value> <value type="int">2</value>
<value type="bool" key="QmakeProjectManager.QmakeRunConfiguration.UseLibrarySearchPath">true</value> <value type="int">3</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value> <value type="int">4</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">olive.pro</value> <value type="int">5</value>
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value> <value type="int">6</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value> <value type="int">7</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory.default">C:/Users/Matt/Documents/temp</value> <value type="int">8</value>
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value> <value type="int">9</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value> <value type="int">10</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value> <value type="int">11</value>
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value> <value type="int">12</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value> <value type="int">13</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value> <value type="int">14</value>
</valuemap> </valuelist>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value> <value type="int" key="PE.EnvironmentAspect.Base">2</value>
</valuemap> <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
</data> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">olive</value>
<data> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<variable>ProjectExplorer.Project.TargetCount</variable> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/matt/olive/olive.pro</value>
<value type="int">1</value> <value type="bool" key="QmakeProjectManager.QmakeRunConfiguration.UseLibrarySearchPath">true</value>
</data> <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
<data> <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">olive.pro</value>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable> <value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
<value type="int">18</value> <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
</data> <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory.default">/home/matt/Documents/build-olive-Desktop_Qt_5_5_1_GCC_64bit-Debug</value>
<data> <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
<variable>Version</variable> <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="int">18</value> <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
</data> <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
</qtcreator> <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="int">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">18</value>
</data>
<data>
<variable>Version</variable>
<value type="int">18</value>
</data>
</qtcreator>
+23 -18
View File
@@ -20,23 +20,7 @@ EffectControls::EffectControls(QWidget *parent) :
init_effects(); init_effects();
clip = NULL; clip = NULL;
set_clip(NULL); set_clip(NULL);
effects_menu = new QMenu(this);
for (int i=0;i<VIDEO_EFFECT_COUNT;i++) {
QAction* action = new QAction();
action->setText(video_effect_names.at(i));
action->setData(i);
effects_menu->addAction(action);
}
effects_menu->addSeparator();
for (int i=0;i<AUDIO_EFFECT_COUNT;i++) {
QAction* action = new QAction();
action->setText(audio_effect_names.at(i));
action->setData(i);
effects_menu->addAction(action);
}
connect(effects_menu, SIGNAL(triggered(QAction*)), this, SLOT(menu_select(QAction*)));
} }
void EffectControls::menu_select(QAction* q) { void EffectControls::menu_select(QAction* q) {
@@ -51,7 +35,28 @@ EffectControls::~EffectControls()
void EffectControls::on_pushButton_clicked() void EffectControls::on_pushButton_clicked()
{ {
effects_menu->exec(QCursor::pos()); int lim;
QVector<QString>* effect_names;
if (clip->track < 0) {
lim = VIDEO_EFFECT_COUNT;
effect_names = &video_effect_names;
} else {
lim = AUDIO_EFFECT_COUNT;
effect_names = &audio_effect_names;
}
QMenu effects_menu(this);
for (int i=0;i<lim;i++) {
QAction* action = new QAction(&effects_menu);
action->setText(effect_names->at(i));
action->setData(i);
effects_menu.addAction(action);
}
connect(&effects_menu, SIGNAL(triggered(QAction*)), this, SLOT(menu_select(QAction*)));
effects_menu.exec(QCursor::pos());
} }
void EffectControls::set_clip(Clip* c) { void EffectControls::set_clip(Clip* c) {
+1 -2
View File
@@ -25,8 +25,7 @@ private slots:
private: private:
Ui::EffectControls *ui; Ui::EffectControls *ui;
Clip* clip; Clip* clip;
QMenu* effects_menu;
}; };
#endif // EFFECTCONTROLS_H #endif // EFFECTCONTROLS_H
+15 -5
View File
@@ -7,6 +7,10 @@
#include "panels/viewer.h" #include "panels/viewer.h"
#include "playback/playback.h" #include "playback/playback.h"
#include "effects/effects.h" #include "effects/effects.h"
#include "panels/timeline.h"
#include "project/sequence.h"
#include "project/effect.h"
#include "io/previewgenerator.h"
#include <QFileDialog> #include <QFileDialog>
#include <QString> #include <QString>
@@ -17,10 +21,6 @@
#include <QXmlStreamReader> #include <QXmlStreamReader>
#include <QXmlStreamWriter> #include <QXmlStreamWriter>
#include "panels/timeline.h"
#include "project/sequence.h"
#include "project/effect.h"
extern "C" { extern "C" {
#include <libavformat/avformat.h> #include <libavformat/avformat.h>
#include <libavcodec/avcodec.h> #include <libavcodec/avcodec.h>
@@ -76,6 +76,8 @@ void Project::new_sequence(Sequence *s) {
source_table = ui->treeWidget; source_table = ui->treeWidget;
project_changed = true; project_changed = true;
set_sequence(s);
} }
Media* Project::import_file(QString file) { Media* Project::import_file(QString file) {
@@ -110,6 +112,8 @@ Media* Project::import_file(QString file) {
qDebug() << "[ERROR] Unsupported codec in stream %d.\n"; qDebug() << "[ERROR] Unsupported codec in stream %d.\n";
} else { } else {
MediaStream* ms = new MediaStream(); MediaStream* ms = new MediaStream();
ms->preview_done = false;
ms->preview_lock.lock();
ms->file_index = i; ms->file_index = i;
if (pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { if (pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
qDebug() << "[WARNING] INFINITE_LENGTH calculation is inaccurate in this build\n"; qDebug() << "[WARNING] INFINITE_LENGTH calculation is inaccurate in this build\n";
@@ -143,7 +147,13 @@ Media* Project::import_file(QString file) {
project_changed = true; project_changed = true;
} }
} }
avformat_close_input(&pFormatCtx);
PreviewGenerator* pg = new PreviewGenerator();
pg->fmt_ctx = pFormatCtx; // cleaned up in PG
pg->media = m;
connect(pg, SIGNAL(finished()), pg, SLOT(deleteLater()));
pg->run();
delete [] filename; delete [] filename;
return m; return m;
} }
+2 -1
View File
@@ -14,6 +14,7 @@
#include "playback/playback.h" #include "playback/playback.h"
#include <QTime> #include <QTime>
#include <QtMath>
Timeline::Timeline(QWidget *parent) : Timeline::Timeline(QWidget *parent) :
QDockWidget(parent), QDockWidget(parent),
@@ -120,7 +121,7 @@ void Timeline::update_sequence() {
} else { } else {
setWindowTitle("Timeline: " + sequence->name); setWindowTitle("Timeline: " + sequence->name);
redraw_all_clips(); redraw_all_clips();
playback_updater.setInterval(floor(1000 / sequence->frame_rate)); playback_updater.setInterval(qFloor(1000 / sequence->frame_rate));
} }
} }
+3
View File
@@ -340,6 +340,9 @@
<height>15</height> <height>15</height>
</size> </size>
</property> </property>
<property name="focusPolicy">
<enum>Qt::ClickFocus</enum>
</property>
</widget> </widget>
</item> </item>
<item> <item>
+12 -12
View File
@@ -18,7 +18,7 @@ Viewer::Viewer(QWidget *parent) :
{ {
ui->setupUi(this); ui->setupUi(this);
ui->glViewerPane->child = ui->openGLWidget; ui->glViewerPane->child = ui->openGLWidget;
viewer_widget = ui->openGLWidget; viewer_widget = ui->openGLWidget;
update_sequence(); update_sequence();
} }
@@ -31,22 +31,22 @@ Viewer::~Viewer()
void Viewer::update_sequence() { void Viewer::update_sequence() {
bool null_sequence = (sequence == NULL); bool null_sequence = (sequence == NULL);
ui->openGLWidget->setEnabled(!null_sequence); ui->openGLWidget->setEnabled(!null_sequence);
ui->openGLWidget->setVisible(!null_sequence); ui->openGLWidget->setVisible(!null_sequence);
ui->pushButton->setEnabled(!null_sequence); ui->pushButton->setEnabled(!null_sequence);
ui->pushButton_2->setEnabled(!null_sequence); ui->pushButton_2->setEnabled(!null_sequence);
ui->pushButton_3->setEnabled(!null_sequence); ui->pushButton_3->setEnabled(!null_sequence);
ui->pushButton_4->setEnabled(!null_sequence); ui->pushButton_4->setEnabled(!null_sequence);
ui->pushButton_5->setEnabled(!null_sequence); ui->pushButton_5->setEnabled(!null_sequence);
init_audio(); init_audio();
if (!null_sequence) { if (!null_sequence) {
ui->glViewerPane->aspect_ratio = (float) sequence->width / (float) sequence->height; ui->glViewerPane->aspect_ratio = (float) sequence->width / (float) sequence->height;
ui->glViewerPane->adjust(); ui->glViewerPane->adjust();
} }
update(); update();
} }
void Viewer::on_pushButton_clicked() void Viewer::on_pushButton_clicked()
+4 -10
View File
@@ -49,18 +49,12 @@
<widget class="ViewerWidget" name="openGLWidget"> <widget class="ViewerWidget" name="openGLWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>130</x> <x>110</x>
<y>60</y> <y>50</y>
<width>301</width> <width>300</width>
<height>221</height> <height>200</height>
</rect> </rect>
</property> </property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
</widget> </widget>
</widget> </widget>
</item> </item>
+5 -3
View File
@@ -44,13 +44,15 @@ void cache_audio_worker(Clip* c) {
c->effects.at(j)->process_audio(frame->data[0], nb_bytes); c->effects.at(j)->process_audio(frame->data[0], nb_bytes);
} }
if (c->audio_buffer_write == 0) c->audio_buffer_write = audio_ibuffer_read + 1024; if (c->audio_buffer_write == 0) c->audio_buffer_write = (((int)(audio_ibuffer_read/2))*2) + 1024;
int half_buffer = (audio_ibuffer_size/2);
while (c->frame_sample_index < nb_bytes) { while (c->frame_sample_index < nb_bytes) {
if (c->audio_buffer_write >= audio_ibuffer_read+(audio_ibuffer_size/2)) { if (c->audio_buffer_write >= audio_ibuffer_read+half_buffer) {
written = max_write; written = max_write;
break; break;
} else { } else {
audio_ibuffer[c->audio_buffer_write%audio_ibuffer_size] += frame->data[0][c->frame_sample_index]; audio_ibuffer[c->audio_buffer_write%audio_ibuffer_size] += frame->data[0][c->frame_sample_index];
c->audio_buffer_write++; c->audio_buffer_write++;
c->frame_sample_index++; c->frame_sample_index++;
} }
@@ -293,6 +295,7 @@ void cache_clip_worker(Clip* clip, long playhead, bool write_A, bool write_B, bo
} }
void close_clip_worker(Clip* clip) { void close_clip_worker(Clip* clip) {
cc_lock.lock();
// closes ffmpeg file handle and frees any memory used for caching // closes ffmpeg file handle and frees any memory used for caching
if (clip->stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { if (clip->stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
sws_freeContext(clip->sws_ctx); sws_freeContext(clip->sws_ctx);
@@ -314,7 +317,6 @@ void close_clip_worker(Clip* clip) {
av_frame_free(&clip->frame); av_frame_free(&clip->frame);
// remove clip from current_clips // remove clip from current_clips
cc_lock.lock();
bool found = false; bool found = false;
for (int i=0;i<current_clips.count();i++) { for (int i=0;i<current_clips.count();i++) {
if (current_clips[i] == clip) { if (current_clips[i] == clip) {
+4 -4
View File
@@ -44,9 +44,9 @@ struct Clip
long timeline_in; long timeline_in;
long timeline_out; long timeline_out;
int track; int track;
uint8_t color_r; quint8 color_r;
uint8_t color_g; quint8 color_g;
uint8_t color_b; quint8 color_b;
long getLength(); long getLength();
// inherited information (should be set to the same references in copy()) // inherited information (should be set to the same references in copy())
@@ -73,7 +73,7 @@ struct Clip
bool multithreaded; bool multithreaded;
Cacher* cacher; Cacher* cacher;
QWaitCondition can_cache; QWaitCondition can_cache;
uint16_t cache_size; quint16 cache_size;
ClipCache cache_A; ClipCache cache_A;
ClipCache cache_B; ClipCache cache_B;
QMutex lock; QMutex lock;
+1 -1
View File
@@ -29,7 +29,7 @@ public:
virtual void save(QXmlStreamWriter* stream); virtual void save(QXmlStreamWriter* stream);
virtual void process_gl(int* anchor_x, int* anchor_y); virtual void process_gl(int* anchor_x, int* anchor_y);
virtual void process_audio(uint8_t* samples, int nb_bytes); virtual void process_audio(quint8* samples, int nb_bytes);
public slots: public slots:
void field_changed(); void field_changed();
+1 -1
View File
@@ -10,7 +10,7 @@ class SourceTable : public QTreeWidget
public: public:
SourceTable(QWidget* parent = 0); SourceTable(QWidget* parent = 0);
protected: protected:
void mouseDoubleClickEvent(QMouseEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event);
// void dragEnterEvent(QDragEnterEvent *event) override; // void dragEnterEvent(QDragEnterEvent *event) override;
private: private:
}; };
+1 -1
View File
@@ -7,7 +7,7 @@ class TimelineHeader : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit TimelineHeader(QWidget *parent = nullptr); explicit TimelineHeader(QWidget *parent = 0);
protected: protected:
void paintEvent(QPaintEvent*) override; void paintEvent(QPaintEvent*) override;
+55 -17
View File
@@ -19,12 +19,13 @@
#include <QObject> #include <QObject>
#include <QVariant> #include <QVariant>
#include <QPointF> #include <QPointF>
#include <QtMath>
TimelineWidget::TimelineWidget(QWidget *parent) : QWidget(parent) TimelineWidget::TimelineWidget(QWidget *parent) : QWidget(parent)
{ {
bottom_align = false; bottom_align = false;
setMouseTracking(true); setMouseTracking(true);
track_height = 40; track_height = 80;
setAcceptDrops(true); setAcceptDrops(true);
} }
@@ -54,13 +55,13 @@ void TimelineWidget::dragEnterEvent(QDragEnterEvent *event) {
g.clip_in = 0; g.clip_in = 0;
for (int j=0;j<m->audio_tracks.size();j++) { for (int j=0;j<m->audio_tracks.size();j++) {
g.track = j; g.track = j;
g.media_stream = m->audio_tracks[j]; g.media_stream = m->audio_tracks.at(j);
ignore_infinite_length = true; ignore_infinite_length = true;
panel_timeline->ghosts.append(g); panel_timeline->ghosts.append(g);
} }
for (int j=0;j<m->video_tracks.size();j++) { for (int j=0;j<m->video_tracks.size();j++) {
g.track = -1-j; g.track = -1-j;
g.media_stream = m->video_tracks[j]; g.media_stream = m->video_tracks.at(j);
if (m->video_tracks[j]->infinite_length && !ignore_infinite_length) g.out = g.in + 100; if (m->video_tracks[j]->infinite_length && !ignore_infinite_length) g.out = g.in + 100;
panel_timeline->ghosts.append(g); panel_timeline->ghosts.append(g);
} }
@@ -150,6 +151,10 @@ void TimelineWidget::dropEvent(QDropEvent* event) {
} }
} }
void TimelineWidget::mouseDoubleClickEvent(QMouseEvent *event) {
}
void TimelineWidget::mousePressEvent(QMouseEvent *event) { void TimelineWidget::mousePressEvent(QMouseEvent *event) {
if (panel_timeline->tool == TIMELINE_TOOL_EDIT || panel_timeline->tool == TIMELINE_TOOL_RAZOR) { if (panel_timeline->tool == TIMELINE_TOOL_EDIT || panel_timeline->tool == TIMELINE_TOOL_RAZOR) {
panel_timeline->drag_frame_start = panel_timeline->cursor_frame; panel_timeline->drag_frame_start = panel_timeline->cursor_frame;
@@ -200,6 +205,7 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) {
case TIMELINE_TOOL_EDIT: case TIMELINE_TOOL_EDIT:
panel_timeline->seek(panel_timeline->drag_frame_start); panel_timeline->seek(panel_timeline->drag_frame_start);
panel_timeline->selecting = true; panel_timeline->selecting = true;
break; break;
case TIMELINE_TOOL_RAZOR: case TIMELINE_TOOL_RAZOR:
{ {
@@ -609,7 +615,8 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
panel_timeline->seek(qMin(panel_timeline->drag_frame_start, panel_timeline->cursor_frame)); panel_timeline->seek(qMin(panel_timeline->drag_frame_start, panel_timeline->cursor_frame));
} else if (panel_timeline->moving_init) { } else if (panel_timeline->moving_init) {
if (panel_timeline->moving_proc) { if (panel_timeline->moving_proc) {
update_ghosts((QPoint&) event->pos()); QPoint pos = event->pos();
update_ghosts(pos);
} else { } else {
// set up movement // set up movement
// create ghosts // create ghosts
@@ -702,26 +709,34 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
QPoint pos = event->pos(); QPoint pos = event->pos();
int lim = 5; int lim = 5;
int mouse_track = getTrackFromScreenPoint(pos.y()); int mouse_track = getTrackFromScreenPoint(pos.y());
long mouse_frame_lower = panel_timeline->getFrameFromScreenPoint(pos.x()-lim)-1; long mouse_frame_lower = panel_timeline->getFrameFromScreenPoint(pos.x()-lim)-1;
long mouse_frame_upper = panel_timeline->getFrameFromScreenPoint(pos.x()+lim)+1; long mouse_frame_upper = panel_timeline->getFrameFromScreenPoint(pos.x()+lim)+1;
bool found = false; bool found = false;
int closeness = INT_MAX;
for (int i=0;i<sequence->clip_count();i++) { for (int i=0;i<sequence->clip_count();i++) {
Clip* c = sequence->get_clip(i); Clip* c = sequence->get_clip(i);
if (c->track == mouse_track) { if (c->track == mouse_track) {
if (c->timeline_in > mouse_frame_lower && c->timeline_in < mouse_frame_upper) { if (c->timeline_in > mouse_frame_lower && c->timeline_in < mouse_frame_upper) {
panel_timeline->trim_target = i; int nc = abs(c->timeline_in + 1 - panel_timeline->cursor_frame);
panel_timeline->trim_in = true; if (nc < closeness) {
found = true; panel_timeline->trim_target = i;
break; panel_timeline->trim_in = true;
} else if (c->timeline_out > mouse_frame_lower && c->timeline_out < mouse_frame_upper) { closeness = nc;
panel_timeline->trim_target = i; found = true;
panel_timeline->trim_in = false; }
found = true; }
break; if (c->timeline_out > mouse_frame_lower && c->timeline_out < mouse_frame_upper) {
int nc = abs(c->timeline_out - 1 - panel_timeline->cursor_frame);
if (nc < closeness) {
panel_timeline->trim_target = i;
panel_timeline->trim_in = false;
closeness = nc;
found = true;
}
} }
} }
} }
if (found) { if (found) {
setCursor(Qt::SizeHorCursor); setCursor(Qt::SizeHorCursor);
} else { } else {
@@ -765,6 +780,29 @@ void TimelineWidget::redraw_clips() {
QRect clip_rect(panel_timeline->getScreenPointFromFrame(clip->timeline_in), getScreenPointFromTrack(clip->track), clip->getLength() * panel_timeline->zoom, track_height); QRect clip_rect(panel_timeline->getScreenPointFromFrame(clip->timeline_in), getScreenPointFromTrack(clip->track), clip->getLength() * panel_timeline->zoom, track_height);
clip_painter.fillRect(clip_rect, QColor(clip->color_r, clip->color_g, clip->color_b)); clip_painter.fillRect(clip_rect, QColor(clip->color_r, clip->color_g, clip->color_b));
// draw thumbnail/waveform
if (clip->media_stream->preview_lock.tryLock()) {
if (clip->media_stream->preview_done) {
if (clip->track < 0) {
int thumb_y = clip_painter.fontMetrics().height()+CLIP_TEXT_PADDING+CLIP_TEXT_PADDING;
int thumb_height = clip_rect.height()-thumb_y;
if (thumb_height > thumb_y) { // at small clip heights, don't even draw it
QRect thumb_rect(clip_rect.x(), clip_rect.y()+thumb_y, (thumb_height*((float)clip->media_stream->preview.width()/(float)clip->media_stream->preview.height())), thumb_height);
clip_painter.drawImage(thumb_rect, clip->media_stream->preview);
}
} else {
long length = clip->media->get_length_in_frames(clip->sequence->frame_rate);
int waveform_x = ((float)clip->clip_in/(float)length) * clip->media_stream->preview.width();
int waveform_width = (((float)clip->getLength()/(float)length) * clip->media_stream->preview.width());
qDebug() << waveform_x << waveform_width;
QRect source(waveform_x, 0, waveform_width, clip->media_stream->preview.height());
clip_painter.drawImage(clip_rect, clip->media_stream->preview, source);
}
}
clip->media_stream->preview_lock.unlock();
}
clip_painter.setPen(Qt::white); clip_painter.setPen(Qt::white);
clip_painter.drawLine(clip_rect.bottomLeft(), clip_rect.topLeft()); clip_painter.drawLine(clip_rect.bottomLeft(), clip_rect.topLeft());
clip_painter.drawLine(clip_rect.topLeft(), clip_rect.topRight()); clip_painter.drawLine(clip_rect.topLeft(), clip_rect.topRight());
@@ -883,7 +921,7 @@ int TimelineWidget::getTrackFromScreenPoint(int y) {
} }
int temp_track_height = track_height; int temp_track_height = track_height;
if (show_track_lines) temp_track_height--; if (show_track_lines) temp_track_height--;
return (int)floor((float) (y)/ (float) temp_track_height); return (int)qFloor((float) (y)/ (float) temp_track_height);
} }
int TimelineWidget::getScreenPointFromTrack(int track) { int TimelineWidget::getScreenPointFromTrack(int track) {
+2 -1
View File
@@ -15,7 +15,7 @@ class TimelineWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit TimelineWidget(QWidget *parent = nullptr); explicit TimelineWidget(QWidget *parent = 0);
bool bottom_align; bool bottom_align;
@@ -24,6 +24,7 @@ protected:
void paintEvent(QPaintEvent*) override; void paintEvent(QPaintEvent*) override;
void resizeEvent(QResizeEvent*) override; void resizeEvent(QResizeEvent*) override;
void mouseDoubleClickEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event) override; void mousePressEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override;
+1 -1
View File
@@ -7,7 +7,7 @@ class ViewerContainer : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit ViewerContainer(QWidget *parent = nullptr); explicit ViewerContainer(QWidget *parent = 0);
float aspect_ratio; float aspect_ratio;
QWidget* child; QWidget* child;
void adjust(); void adjust();
+54 -54
View File
@@ -35,13 +35,13 @@ void ViewerWidget::retry() {
} }
void ViewerWidget::initializeGL() { void ViewerWidget::initializeGL() {
initializeOpenGLFunctions(); initializeOpenGLFunctions();
glClearColor(0, 0, 0, 1); glClearColor(0, 0, 0, 1);
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND); glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
} }
//void ViewerWidget::resizeGL(int w, int h) //void ViewerWidget::resizeGL(int w, int h)
@@ -54,63 +54,63 @@ void ViewerWidget::paintEvent(QPaintEvent *e) {
void ViewerWidget::paintGL() void ViewerWidget::paintGL()
{ {
if (multithreaded) retry_timer.stop(); if (multithreaded) retry_timer.stop();
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
long playhead = panel_timeline->playhead; long playhead = panel_timeline->playhead;
handle_media(sequence, playhead, multithreaded); handle_media(sequence, playhead, multithreaded);
texture_failed = false; texture_failed = false;
bool render_audio = (panel_timeline->playing || force_audio); bool render_audio = (panel_timeline->playing || force_audio);
cc_lock.lock(); cc_lock.lock();
for (int i=0;i<current_clips.size();i++) { for (int i=0;i<current_clips.size();i++) {
Clip* c = current_clips.at(i); Clip* c = current_clips.at(i);
if (!c->open) { if (!c->open) {
qDebug() << "[WARNING] Tried to display clip" << i << "but it's closed"; qDebug() << "[WARNING] Tried to display clip" << i << "but it's closed";
texture_failed = true; texture_failed = true;
} else if (is_clip_active(c, playhead)) { } else if (is_clip_active(c, playhead)) {
if (c->stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { if (c->stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
// start preparing cache // start preparing cache
get_clip_frame(c, playhead); get_clip_frame(c, playhead);
if (c->texture == NULL) { if (c->texture == NULL) {
qDebug() << "[WARNING] Texture hasn't been created yet"; qDebug() << "[WARNING] Texture hasn't been created yet";
texture_failed = true; texture_failed = true;
} else if (playhead >= c->timeline_in) { } else if (playhead >= c->timeline_in) {
glLoadIdentity(); glLoadIdentity();
int half_width = c->sequence->width/2; int half_width = c->sequence->width/2;
int half_height = c->sequence->height/2; int half_height = c->sequence->height/2;
glOrtho(-half_width, half_width, half_height,- half_height, -1, 1); glOrtho(-half_width, half_width, half_height,- half_height, -1, 1);
int anchor_x = c->media_stream->video_width/2; int anchor_x = c->media_stream->video_width/2;
int anchor_y = c->media_stream->video_height/2; int anchor_y = c->media_stream->video_height/2;
// perform all transform effects // perform all transform effects
for (int j=0;j<c->effects.size();j++) { for (int j=0;j<c->effects.size();j++) {
c->effects.at(j)->process_gl(&anchor_x, &anchor_y); c->effects.at(j)->process_gl(&anchor_x, &anchor_y);
} }
int anchor_right = c->media_stream->video_width - anchor_x; int anchor_right = c->media_stream->video_width - anchor_x;
int anchor_bottom = c->media_stream->video_height - anchor_y; int anchor_bottom = c->media_stream->video_height - anchor_y;
c->texture->bind(); c->texture->bind();
glBegin(GL_QUADS); glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glTexCoord2f(0.0, 0.0);
glVertex2f(-anchor_x, -anchor_y); glVertex2f(-anchor_x, -anchor_y);
glTexCoord2f(1.0, 0.0); glTexCoord2f(1.0, 0.0);
glVertex2f(anchor_right, -anchor_y); glVertex2f(anchor_right, -anchor_y);
glTexCoord2f(1.0, 1.0); glTexCoord2f(1.0, 1.0);
glVertex2f(anchor_right, anchor_bottom); glVertex2f(anchor_right, anchor_bottom);
glTexCoord2f(0.0, 1.0); glTexCoord2f(0.0, 1.0);
glVertex2f(-anchor_x, anchor_bottom); glVertex2f(-anchor_x, anchor_bottom);
glEnd(); glEnd();
c->texture->release(); c->texture->release();
} }
} else if (render_audio && } else if (render_audio &&
c->stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && c->stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
@@ -119,8 +119,8 @@ void ViewerWidget::paintGL()
// clip is not caching, start caching audio // clip is not caching, start caching audio
c->lock.unlock(); c->lock.unlock();
cache_clip(c, playhead, false, false, c->reset_audio); cache_clip(c, playhead, false, false, c->reset_audio);
} }
} }
} }
if (panel_timeline->playing) { if (panel_timeline->playing) {
@@ -137,13 +137,13 @@ void ViewerWidget::paintGL()
} }
} }
cc_lock.unlock(); cc_lock.unlock();
if (texture_failed) { if (texture_failed) {
if (multithreaded) { if (multithreaded) {
retry_timer.start(); retry_timer.start();
} else { } else {
paintGL(); paintGL();
} }
} }
} }
+3 -3
View File
@@ -14,15 +14,15 @@ class ViewerWidget : public QOpenGLWidget, public QOpenGLFunctions
Q_OBJECT Q_OBJECT
public: public:
ViewerWidget(QWidget *parent = 0); ViewerWidget(QWidget *parent = 0);
void initializeGL();
// void resizeGL(int w, int h);
void paintGL();
bool multithreaded; bool multithreaded;
bool force_audio; bool force_audio;
bool enable_paint; bool enable_paint;
protected: protected:
void paintEvent(QPaintEvent *e) override; void paintEvent(QPaintEvent *e) override;
void initializeGL() override;
// void resizeGL(int w, int h);
void paintGL() override;
private: private:
QTimer retry_timer; QTimer retry_timer;
private slots: private slots: