diff --git a/io/exportthread.cpp b/io/exportthread.cpp index 1f94a1b47..190a3e0a4 100644 --- a/io/exportthread.cpp +++ b/io/exportthread.cpp @@ -348,7 +348,7 @@ void ExportThread::run() { if (video_enabled) { do { // TODO optimize by rendering the next frame while encoding the last - renderer->start_render(nullptr, sequence, nullptr, video_frame->data[0]); + renderer->start_render(nullptr, sequence, nullptr, video_frame->data[0], video_frame->linesize[0]/4); waitCond.wait(&mutex); if (!continueEncode) break; } while (renderer->did_texture_fail()); @@ -371,11 +371,11 @@ void ExportThread::run() { sws_frame = av_frame_alloc(); sws_frame->format = vcodec_ctx->pix_fmt; sws_frame->width = video_width; - sws_frame->height = video_height; + sws_frame->height = video_height; av_frame_get_buffer(sws_frame, 0); // convert pixel format to format expected by the encoder - sws_scale(sws_ctx, video_frame->data, video_frame->linesize, 0, video_frame->height, sws_frame->data, sws_frame->linesize); + sws_scale(sws_ctx, video_frame->data, video_frame->linesize, 0, video_frame->height, sws_frame->data, sws_frame->linesize); sws_frame->pts = qRound(timecode_secs/av_q2d(video_stream->time_base)); // send converted frame to encoder diff --git a/ui/renderthread.cpp b/ui/renderthread.cpp index b85a3d349..409d948dc 100644 --- a/ui/renderthread.cpp +++ b/ui/renderthread.cpp @@ -193,9 +193,22 @@ void RenderThread::paint() { } if (pixel_buffer != nullptr) { - ctx->functions()->glBindFramebuffer(GL_READ_FRAMEBUFFER, front_buffer); - glReadPixels(0, 0, tex_width, tex_height, GL_RGBA, GL_UNSIGNED_BYTE, pixel_buffer); + + // set main framebuffer to the current read buffer + ctx->functions()->glBindFramebuffer(GL_READ_FRAMEBUFFER, front_buffer); + + // store pixels in buffer + glReadPixels(0, + 0, + pixel_buffer_linesize == 0 ? tex_width : pixel_buffer_linesize, + tex_height, + GL_RGBA, + GL_UNSIGNED_BYTE, + pixel_buffer); + + // release current read buffer ctx->functions()->glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); + pixel_buffer = nullptr; } @@ -204,7 +217,7 @@ void RenderThread::paint() { glDisable(GL_TEXTURE_2D); } -void RenderThread::start_render(QOpenGLContext *share, Sequence *s, const QString& save, GLvoid* pixels, int idivider) { +void RenderThread::start_render(QOpenGLContext *share, Sequence *s, const QString& save, GLvoid* pixels, int pixel_linesize, int idivider) { seq = s; // stall any dependent actions @@ -222,6 +235,7 @@ void RenderThread::start_render(QOpenGLContext *share, Sequence *s, const QStrin save_fn = save; pixel_buffer = pixels; + pixel_buffer_linesize = pixel_linesize; queued = true; diff --git a/ui/renderthread.h b/ui/renderthread.h index 201839dce..3b1e1e1cb 100644 --- a/ui/renderthread.h +++ b/ui/renderthread.h @@ -23,7 +23,7 @@ public: GLuint front_texture; Effect* gizmos; void paint(); - void start_render(QOpenGLContext* share, Sequence* s, const QString &save = nullptr, GLvoid *pixels = nullptr, int idivider = 0); + void start_render(QOpenGLContext* share, Sequence* s, const QString &save = nullptr, GLvoid *pixels = nullptr, int pixel_linesize = 0, int idivider = 0); bool did_texture_fail(); void cancel(); @@ -59,6 +59,7 @@ private: bool running; QString save_fn; GLvoid *pixel_buffer; + int pixel_buffer_linesize; }; #endif // RENDERTHREAD_H