From 37ceca48da92e860f538605f2ee3e3bd5ff7ae4e Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 17 Jan 2019 09:42:30 +1100 Subject: [PATCH] exporting complete --- io/exportthread.cpp | 23 +++++++++++++++++++++-- ui/renderfunctions.cpp | 25 +++++++++++++++++-------- ui/renderfunctions.h | 2 ++ ui/viewerwidget.cpp | 7 ++----- ui/viewerwindow.cpp | 2 +- 5 files changed, 43 insertions(+), 16 deletions(-) diff --git a/io/exportthread.cpp b/io/exportthread.cpp index dbe139642..92c6dc6ee 100644 --- a/io/exportthread.cpp +++ b/io/exportthread.cpp @@ -7,6 +7,7 @@ #include "panels/viewer.h" #include "ui/viewerwidget.h" #include "ui/renderthread.h" +#include "ui/renderfunctions.h" #include "playback/playback.h" #include "playback/audio.h" #include "dialogs/exportdialog.h" @@ -349,9 +350,26 @@ void ExportThread::run() { while (sequence->playhead <= end_frame && continueEncode) { start_time = QDateTime::currentMSecsSinceEpoch(); - renderer->start_render(nullptr, sequence, nullptr, video_frame->data[0]); - waitCond.wait(&mutex); + if (audio_enabled) { + compose_audio(nullptr, sequence, true); + } + if (video_enabled) { + do { + renderer->start_render(nullptr, sequence, nullptr, video_frame->data[0]); + waitCond.wait(&mutex); + } while (renderer->did_texture_fail()); + } + /*if (sequence->playhead == start_frame) { + // render first frame + if (video_enabled) { + qDebug() << "FIRST FRAME start video thread"; + renderer->start_render(nullptr, sequence, nullptr, video_frame->data[0]); + } + sequence->playhead++; + }*/ + + // encode last frame while rendering next frame double timecode_secs = (double) (sequence->playhead-start_frame) / sequence->frame_rate; if (video_enabled) { // change pixel format @@ -364,6 +382,7 @@ void ExportThread::run() { if (audio_enabled) { // do we need to encode more audio samples? while (continueEncode && file_audio_samples <= (timecode_secs*audio_sampling_rate)) { + // copy samples from audio buffer to AVFrame int adjusted_read = audio_ibuffer_read%audio_ibuffer_size; int copylen = qMin(aframe_bytes, audio_ibuffer_size-adjusted_read); memcpy(audio_frame->data[0], audio_ibuffer+adjusted_read, copylen); diff --git a/ui/renderfunctions.cpp b/ui/renderfunctions.cpp index e44e44516..43381a603 100644 --- a/ui/renderfunctions.cpp +++ b/ui/renderfunctions.cpp @@ -206,16 +206,14 @@ GLuint compose_sequence(Viewer* viewer, int half_width = s->width/2; int half_height = s->height/2; - if (rendering || !nests.isEmpty()) half_height = -half_height; // invert vertical - glPushMatrix(); - glLoadIdentity(); - glOrtho(-half_width, half_width, half_height, -half_height, -1, 10); + if (video) { + glPushMatrix(); + glLoadIdentity(); + glOrtho(-half_width, half_width, -half_height, half_height, -1, 10); + } for (int i=0;ifunctions()->GL_DEFAULT_BLEND; - glColor4f(1.0, 1.0, 1.0, 1.0); - Clip* c = current_clips.at(i); if (c->media != nullptr && c->media->get_type() == MEDIA_TYPE_FOOTAGE && !c->finished_opening) { @@ -223,6 +221,9 @@ GLuint compose_sequence(Viewer* viewer, texture_failed = true; } else { if (c->track < 0) { + ctx->functions()->GL_DEFAULT_BLEND; + glColor4f(1.0, 1.0, 1.0, 1.0); + GLuint textureID = 0; int video_width = c->getWidth(); int video_height = c->getHeight(); @@ -488,7 +489,9 @@ GLuint compose_sequence(Viewer* viewer, viewer->play_wake(); } - glPopMatrix(); + if (video) { + glPopMatrix(); + } if (!nests.isEmpty() && nests.last()->fbo != nullptr) { // returns nested clip's texture @@ -497,3 +500,9 @@ GLuint compose_sequence(Viewer* viewer, return 0; } + +void compose_audio(Viewer* viewer, Sequence* seq, bool render_audio) { + QVector nests; + bool texture_failed; + compose_sequence(viewer, nullptr, seq, nests, false, render_audio, nullptr, texture_failed, audio_rendering); +} diff --git a/ui/renderfunctions.h b/ui/renderfunctions.h index a44dbc9e7..a9fe436be 100644 --- a/ui/renderfunctions.h +++ b/ui/renderfunctions.h @@ -19,4 +19,6 @@ GLuint compose_sequence(Viewer* viewer, bool &texture_failed, bool rendering); +void compose_audio(Viewer* viewer, Sequence* seq, bool render_audio); + #endif // RENDERFUNCTIONS_H diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index c5ce7e080..9b4abc5bd 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -223,9 +223,7 @@ void ViewerWidget::frame_update() { renderer->start_render(context(), viewer->seq); // render the audio - QVector nests; - bool texture_failed; - compose_sequence(viewer, context(), viewer->seq, nests, false, render_audio, &gizmos, texture_failed, audio_rendering); + compose_audio(viewer, viewer->seq, render_audio); } } @@ -445,9 +443,8 @@ void ViewerWidget::paintGL() { glEnable(GL_TEXTURE_2D); // set screen coords to widget size - glLoadIdentity(); - glOrtho(0, 1, 1, 0, -1, 1); + glOrtho(0, 1, 0, 1, -1, 1); // draw texture from render thread diff --git a/ui/viewerwindow.cpp b/ui/viewerwindow.cpp index 635cb9491..e86b0750f 100644 --- a/ui/viewerwindow.cpp +++ b/ui/viewerwindow.cpp @@ -21,7 +21,7 @@ void ViewerWindow::paintGL() { glBindTexture(GL_TEXTURE_2D, texture); glLoadIdentity(); - glOrtho(0, 1, 1, 0, -1, 1); + glOrtho(0, 1, 0, 1, -1, 1); glBegin(GL_QUADS);