From 5afd135796fdfbbf59f1e7910c9adcb816ea316b Mon Sep 17 00:00:00 2001 From: Jonathan Noble Date: Sat, 19 Jan 2019 15:30:35 +0000 Subject: [PATCH 1/6] Fix memory leak from using libavcodec api (cherry picked from commit 8c7eb8997660a70e1e58a4f89a82574931195e63) Sequence class encapsulation work. Memory leak fixes work (cherry picked from commit 7caaa778697ea2a84162f4ce523be8b6cef79647) --- io/previewgenerator.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/io/previewgenerator.cpp b/io/previewgenerator.cpp index 01ea6e548..621a6b3ff 100644 --- a/io/previewgenerator.cpp +++ b/io/previewgenerator.cpp @@ -1,4 +1,4 @@ -#include "previewgenerator.h" +#include "previewgenerator.h" #include "project/media.h" #include "project/footage.h" @@ -277,7 +277,7 @@ void PreviewGenerator::generate_waveform() { if (!s->preview_done) { int dstH = 120; int dstW = dstH * ((float)temp_frame->width/(float)temp_frame->height); - uint8_t* data = new uint8_t[dstW*dstH*4]; + uint8_t* imgData = new uint8_t[dstW*dstH*4]; sws_ctx = sws_getContext( temp_frame->width, @@ -294,9 +294,9 @@ void PreviewGenerator::generate_waveform() { int linesize[AV_NUM_DATA_POINTERS]; linesize[0] = dstW*4; - sws_scale(sws_ctx, temp_frame->data, temp_frame->linesize, 0, temp_frame->height, &data, linesize); + sws_scale(sws_ctx, temp_frame->data, temp_frame->linesize, 0, temp_frame->height, &imgData, linesize); - s->video_preview = QImage(data, dstW, dstH, linesize[0], QImage::Format_RGBA8888); + s->video_preview = QImage(imgData, dstW, dstH, linesize[0], QImage::Format_RGBA8888); s->make_square_thumb(); // is video interlaced? @@ -311,6 +311,8 @@ void PreviewGenerator::generate_waveform() { avcodec_close(codec_ctx[packet->stream_index]); codec_ctx[packet->stream_index] = nullptr; } + + delete[] imgData; } media_lengths[packet->stream_index]++; } else if (fmt_ctx->streams[packet->stream_index]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { @@ -415,7 +417,10 @@ void PreviewGenerator::generate_waveform() { finalize_media(); } delete [] media_lengths; - delete [] codec_ctx; + + if (codec_ctx != NULL) { + avcodec_free_context(codec_ctx); + } } QString PreviewGenerator::get_thumbnail_path(const QString& hash, const FootageStream& ms) { From 52c2fee1420aaff7d1b21c1ae78f0426febf1240 Mon Sep 17 00:00:00 2001 From: Jonathan Noble Date: Fri, 25 Jan 2019 23:33:00 +0000 Subject: [PATCH 2/6] Fixed the use of float as loop counter --- ui/renderfunctions.cpp | 774 +++++++++++++++++++++-------------------- 1 file changed, 389 insertions(+), 385 deletions(-) diff --git a/ui/renderfunctions.cpp b/ui/renderfunctions.cpp index bbab2bd2b..efa206721 100644 --- a/ui/renderfunctions.cpp +++ b/ui/renderfunctions.cpp @@ -25,468 +25,472 @@ #include "panels/viewer.h" extern "C" { - #include +#include } //#define GL_DEFAULT_BLEND glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE) #define GL_DEFAULT_BLEND glBlendFuncSeparate(GL_ONE, GL_ONE, GL_ONE, GL_ONE) GLuint draw_clip(QOpenGLContext* ctx, QOpenGLFramebufferObject* fbo, GLuint texture, bool clear) { - glPushMatrix(); - glLoadIdentity(); - glOrtho(0, 1, 0, 1, -1, 1); + glPushMatrix(); + glLoadIdentity(); + glOrtho(0, 1, 0, 1, -1, 1); - GLint current_fbo = 0; - glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, ¤t_fbo); + GLint current_fbo = 0; + glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, ¤t_fbo); - fbo->bind(); + fbo->bind(); - if (clear) glClear(GL_COLOR_BUFFER_BIT); + if (clear) glClear(GL_COLOR_BUFFER_BIT); - // get current blend mode - GLint src_rgb, src_alpha, dst_rgb, dst_alpha; - glGetIntegerv(GL_BLEND_SRC_RGB, &src_rgb); - glGetIntegerv(GL_BLEND_SRC_ALPHA, &src_alpha); - glGetIntegerv(GL_BLEND_DST_RGB, &dst_rgb); - glGetIntegerv(GL_BLEND_DST_ALPHA, &dst_alpha); + // get current blend mode + GLint src_rgb, src_alpha, dst_rgb, dst_alpha; + glGetIntegerv(GL_BLEND_SRC_RGB, &src_rgb); + glGetIntegerv(GL_BLEND_SRC_ALPHA, &src_alpha); + glGetIntegerv(GL_BLEND_DST_RGB, &dst_rgb); + glGetIntegerv(GL_BLEND_DST_ALPHA, &dst_alpha); - ctx->functions()->GL_DEFAULT_BLEND; + ctx->functions()->GL_DEFAULT_BLEND; - glBindTexture(GL_TEXTURE_2D, texture); - glBegin(GL_QUADS); - glTexCoord2f(0, 0); // top left - glVertex2f(0, 0); // top left - glTexCoord2f(1, 0); // top right - glVertex2f(1, 0); // top right - glTexCoord2f(1, 1); // bottom right - glVertex2f(1, 1); // bottom right - glTexCoord2f(0, 1); // bottom left - glVertex2f(0, 1); // bottom left - glEnd(); - glBindTexture(GL_TEXTURE_2D, 0); + glBindTexture(GL_TEXTURE_2D, texture); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); // top left + glVertex2f(0, 0); // top left + glTexCoord2f(1, 0); // top right + glVertex2f(1, 0); // top right + glTexCoord2f(1, 1); // bottom right + glVertex2f(1, 1); // bottom right + glTexCoord2f(0, 1); // bottom left + glVertex2f(0, 1); // bottom left + glEnd(); + glBindTexture(GL_TEXTURE_2D, 0); -// fbo->release(); - ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); + // fbo->release(); + ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); - // restore previous blendFunc - ctx->functions()->glBlendFuncSeparate(src_rgb, dst_rgb, src_alpha, dst_alpha); + // restore previous blendFunc + ctx->functions()->glBlendFuncSeparate(src_rgb, dst_rgb, src_alpha, dst_alpha); - //if (default_fbo != nullptr) default_fbo->bind(); + //if (default_fbo != nullptr) default_fbo->bind(); - glPopMatrix(); - return fbo->texture(); + glPopMatrix(); + return fbo->texture(); } void process_effect(QOpenGLContext* ctx, - Clip* c, - Effect* e, - double timecode, - GLTextureCoords& coords, - GLuint& composite_texture, - bool& fbo_switcher, - bool& texture_failed, - int data) { - if (e->is_enabled()) { - if (e->enable_coords) { - e->process_coords(timecode, coords, data); - } - if ((e->enable_shader && shaders_are_enabled) || e->enable_superimpose) { - e->startEffect(); - if ((e->enable_shader && shaders_are_enabled) && e->is_glsl_linked()) { - e->process_shader(timecode, coords); - composite_texture = draw_clip(ctx, c->fbo[fbo_switcher], composite_texture, true); - fbo_switcher = !fbo_switcher; - } - if (e->enable_superimpose) { - GLuint superimpose_texture = e->process_superimpose(timecode); - if (superimpose_texture == 0) { - qWarning() << "Superimpose texture was nullptr, retrying..."; - texture_failed = true; - } else { - composite_texture = draw_clip(ctx, c->fbo[!fbo_switcher], superimpose_texture, false); - } - } - e->endEffect(); - } - } + Clip* c, + Effect* e, + double timecode, + GLTextureCoords& coords, + GLuint& composite_texture, + bool& fbo_switcher, + bool& texture_failed, + int data) { + if (e->is_enabled()) { + if (e->enable_coords) { + e->process_coords(timecode, coords, data); + } + if ((e->enable_shader && shaders_are_enabled) || e->enable_superimpose) { + e->startEffect(); + if ((e->enable_shader && shaders_are_enabled) && e->is_glsl_linked()) { + e->process_shader(timecode, coords); + composite_texture = draw_clip(ctx, c->fbo[fbo_switcher], composite_texture, true); + fbo_switcher = !fbo_switcher; + } + if (e->enable_superimpose) { + GLuint superimpose_texture = e->process_superimpose(timecode); + if (superimpose_texture == 0) { + qWarning() << "Superimpose texture was nullptr, retrying..."; + texture_failed = true; + } else { + composite_texture = draw_clip(ctx, c->fbo[!fbo_switcher], superimpose_texture, false); + } + } + e->endEffect(); + } + } } GLuint compose_sequence(Viewer* viewer, - QOpenGLContext* ctx, - Sequence* seq, - QVector& nests, - bool video, - bool render_audio, - Effect** gizmos, - bool& texture_failed, - bool rendering, - int playback_speed) { - GLint current_fbo = 0; - if (video) { - glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, ¤t_fbo); - } + QOpenGLContext* ctx, + Sequence* seq, + QVector& nests, + bool video, + bool render_audio, + Effect** gizmos, + bool& texture_failed, + bool rendering, + int playback_speed) { + GLint current_fbo = 0; + if (video) { + glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, ¤t_fbo); + } - Sequence* s = seq; - long playhead = s->playhead; + Sequence* s = seq; + long playhead = s->playhead; - if (!nests.isEmpty()) { - for (int i=0;imedia->to_sequence(); - playhead += nests.at(i)->clip_in - nests.at(i)->get_timeline_in_with_transition(); - playhead = refactor_frame_number(playhead, nests.at(i)->sequence->frame_rate, s->frame_rate); - } + if (!nests.isEmpty()) { + for (int i=0;imedia->to_sequence(); + playhead += nests.at(i)->clip_in - nests.at(i)->get_timeline_in_with_transition(); + playhead = refactor_frame_number(playhead, nests.at(i)->sequence->frame_rate, s->frame_rate); + } - if (video && nests.last()->fbo != nullptr) { - nests.last()->fbo[0]->bind(); - glClear(GL_COLOR_BUFFER_BIT); -// nests.last()->fbo[0]->release(); - ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); - } - } + if (video && nests.last()->fbo != nullptr) { + nests.last()->fbo[0]->bind(); + glClear(GL_COLOR_BUFFER_BIT); + // nests.last()->fbo[0]->release(); + ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); + } + } - int audio_track_count = 0; + int audio_track_count = 0; - QVector current_clips; + QVector current_clips; - for (int i=0;iclips.size();i++) { - Clip* c = s->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = s->clips.at(i); - // if clip starts within one second and/or hasn't finished yet - if (c != nullptr) { -// if (!(!nests.isEmpty() && !same_sign(c->track, nests.last()->track))) { - if ((c->track < 0) == video) { - bool clip_is_active = false; + // if clip starts within one second and/or hasn't finished yet + if (c != nullptr) { + // if (!(!nests.isEmpty() && !same_sign(c->track, nests.last()->track))) { + if ((c->track < 0) == video) { + bool clip_is_active = false; - if (c->media != nullptr && c->media->get_type() == MEDIA_TYPE_FOOTAGE) { - Footage* m = c->media->to_footage(); - if (!m->invalid && !(c->track >= 0 && !is_audio_device_set())) { - if (m->ready) { - const FootageStream* ms = m->get_stream_from_file_index(c->track < 0, c->media_stream); - if (ms != nullptr && is_clip_active(c, playhead)) { - // if thread is already working, we don't want to touch this, - // but we also don't want to hang the UI thread - if (!c->open) { - open_clip(c, !rendering); - } - clip_is_active = true; - if (c->track >= 0) audio_track_count++; - } else if (c->finished_opening) { - close_clip(c, false); - } - } else { - //qWarning() << "Media '" + m->name + "' was not ready, retrying..."; - texture_failed = true; - } - } - } else { - if (is_clip_active(c, playhead)) { - if (!c->open) open_clip(c, !rendering); - clip_is_active = true; - } else if (c->finished_opening) { - close_clip(c, false); - } - } - if (clip_is_active) { - bool added = false; - for (int j=0;jtrack < c->track) { - current_clips.insert(j, c); - added = true; - break; - } - } - if (!added) { - current_clips.append(c); - } - } - } - } - } + if (c->media != nullptr && c->media->get_type() == MEDIA_TYPE_FOOTAGE) { + Footage* m = c->media->to_footage(); + if (!m->invalid && !(c->track >= 0 && !is_audio_device_set())) { + if (m->ready) { + const FootageStream* ms = m->get_stream_from_file_index(c->track < 0, c->media_stream); + if (ms != nullptr && is_clip_active(c, playhead)) { + // if thread is already working, we don't want to touch this, + // but we also don't want to hang the UI thread + if (!c->open) { + open_clip(c, !rendering); + } + clip_is_active = true; + if (c->track >= 0) audio_track_count++; + } else if (c->finished_opening) { + close_clip(c, false); + } + } else { + //qWarning() << "Media '" + m->name + "' was not ready, retrying..."; + texture_failed = true; + } + } + } else { + if (is_clip_active(c, playhead)) { + if (!c->open) open_clip(c, !rendering); + clip_is_active = true; + } else if (c->finished_opening) { + close_clip(c, false); + } + } + if (clip_is_active) { + bool added = false; + for (int j=0;jtrack < c->track) { + current_clips.insert(j, c); + added = true; + break; + } + } + if (!added) { + current_clips.append(c); + } + } + } + } + } - int half_width = s->width/2; - int half_height = s->height/2; + int half_width = s->width/2; + int half_height = s->height/2; - if (video) { - 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;imedia != nullptr && c->media->get_type() == MEDIA_TYPE_FOOTAGE && !c->finished_opening) { - qWarning() << "Tried to display clip" << i << "but it's closed"; - texture_failed = true; - } else { - if (c->track < 0) { - ctx->functions()->GL_DEFAULT_BLEND; - glColor4f(1.0, 1.0, 1.0, 1.0); + if (c->media != nullptr && c->media->get_type() == MEDIA_TYPE_FOOTAGE && !c->finished_opening) { + qWarning() << "Tried to display clip" << i << "but it's closed"; + 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(); + GLuint textureID = 0; + int video_width = c->getWidth(); + int video_height = c->getHeight(); - if (c->media != nullptr) { - switch (c->media->get_type()) { - case MEDIA_TYPE_FOOTAGE: - // set up opengl texture - if (c->texture == nullptr) { - c->texture = new QOpenGLTexture(QOpenGLTexture::Target2D); - c->texture->setSize(c->stream->codecpar->width, c->stream->codecpar->height); - c->texture->setFormat(get_gl_tex_fmt_from_av(c->pix_fmt)); - c->texture->setMipLevels(c->texture->maximumMipLevels()); - c->texture->setMinMagFilters(QOpenGLTexture::Linear, QOpenGLTexture::Linear); - c->texture->allocateStorage(get_gl_pix_fmt_from_av(c->pix_fmt), QOpenGLTexture::UInt8); - } - get_clip_frame(c, qMax(playhead, c->timeline_in), texture_failed); - textureID = c->texture->textureId(); - break; - case MEDIA_TYPE_SEQUENCE: - textureID = -1; - break; - } - } + if (c->media != nullptr) { + switch (c->media->get_type()) { + case MEDIA_TYPE_FOOTAGE: + // set up opengl texture + if (c->texture == nullptr) { + c->texture = new QOpenGLTexture(QOpenGLTexture::Target2D); + c->texture->setSize(c->stream->codecpar->width, c->stream->codecpar->height); + c->texture->setFormat(get_gl_tex_fmt_from_av(c->pix_fmt)); + c->texture->setMipLevels(c->texture->maximumMipLevels()); + c->texture->setMinMagFilters(QOpenGLTexture::Linear, QOpenGLTexture::Linear); + c->texture->allocateStorage(get_gl_pix_fmt_from_av(c->pix_fmt), QOpenGLTexture::UInt8); + } + get_clip_frame(c, qMax(playhead, c->timeline_in), texture_failed); + textureID = c->texture->textureId(); + break; + case MEDIA_TYPE_SEQUENCE: + textureID = -1; + break; + } + } - if (textureID == 0 && c->media != nullptr) { - qWarning() << "Texture hasn't been created yet"; - texture_failed = true; - } else if (playhead >= c->get_timeline_in_with_transition()) { - glPushMatrix(); + if (textureID == 0 && c->media != nullptr) { + qWarning() << "Texture hasn't been created yet"; + texture_failed = true; + } else if (playhead >= c->get_timeline_in_with_transition()) { + glPushMatrix(); - // start preparing cache - if (c->fbo == nullptr) { - c->fbo = new QOpenGLFramebufferObject* [2]; - c->fbo[0] = new QOpenGLFramebufferObject(video_width, video_height); - c->fbo[1] = new QOpenGLFramebufferObject(video_width, video_height); - ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); - } + // start preparing cache + if (c->fbo == nullptr) { + c->fbo = new QOpenGLFramebufferObject* [2]; + c->fbo[0] = new QOpenGLFramebufferObject(video_width, video_height); + c->fbo[1] = new QOpenGLFramebufferObject(video_width, video_height); + ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); + } - // clear fbos - /*c->fbo[0]->bind(); - glClear(GL_COLOR_BUFFER_BIT); - c->fbo[0]->release(); - c->fbo[1]->bind(); - glClear(GL_COLOR_BUFFER_BIT); - c->fbo[1]->release();*/ + // clear fbos + /*c->fbo[0]->bind(); + glClear(GL_COLOR_BUFFER_BIT); + c->fbo[0]->release(); + c->fbo[1]->bind(); + glClear(GL_COLOR_BUFFER_BIT); + c->fbo[1]->release();*/ - bool fbo_switcher = false; + bool fbo_switcher = false; - glViewport(0, 0, video_width, video_height); + glViewport(0, 0, video_width, video_height); - GLuint composite_texture; + GLuint composite_texture; - if (c->media == nullptr) { - c->fbo[fbo_switcher]->bind(); - glClear(GL_COLOR_BUFFER_BIT); -// c->fbo[fbo_switcher]->release(); - ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); - composite_texture = c->fbo[fbo_switcher]->texture(); - } else { - // for nested sequences - if (c->media->get_type()== MEDIA_TYPE_SEQUENCE) { - nests.append(c); - textureID = compose_sequence(viewer, ctx, seq, nests, video, render_audio, gizmos, texture_failed, rendering, false); - nests.removeLast(); - fbo_switcher = true; - } + if (c->media == nullptr) { + c->fbo[fbo_switcher]->bind(); + glClear(GL_COLOR_BUFFER_BIT); + // c->fbo[fbo_switcher]->release(); + ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); + composite_texture = c->fbo[fbo_switcher]->texture(); + } else { + // for nested sequences + if (c->media->get_type()== MEDIA_TYPE_SEQUENCE) { + nests.append(c); + textureID = compose_sequence(viewer, ctx, seq, nests, video, render_audio, gizmos, texture_failed, rendering, false); + nests.removeLast(); + fbo_switcher = true; + } - composite_texture = draw_clip(ctx, c->fbo[fbo_switcher], textureID, true); - } + composite_texture = draw_clip(ctx, c->fbo[fbo_switcher], textureID, true); + } - fbo_switcher = !fbo_switcher; + fbo_switcher = !fbo_switcher; - // set up default coords - GLTextureCoords coords; - coords.grid_size = 1; - coords.vertexTopLeftX = coords.vertexBottomLeftX = -video_width/2; - coords.vertexTopLeftY = coords.vertexTopRightY = -video_height/2; - coords.vertexTopRightX = coords.vertexBottomRightX = video_width/2; - coords.vertexBottomLeftY = coords.vertexBottomRightY = video_height/2; - coords.vertexBottomLeftZ = coords.vertexBottomRightZ = coords.vertexTopLeftZ = coords.vertexTopRightZ = 1; - coords.textureTopLeftY = coords.textureTopRightY = coords.textureTopLeftX = coords.textureBottomLeftX = 0.0; - coords.textureBottomLeftY = coords.textureBottomRightY = coords.textureTopRightX = coords.textureBottomRightX = 1.0; - coords.textureTopLeftQ = coords.textureTopRightQ = coords.textureTopLeftQ = coords.textureBottomLeftQ = 1; + // set up default coords + GLTextureCoords coords; + coords.grid_size = 1; + coords.vertexTopLeftX = coords.vertexBottomLeftX = -video_width/2; + coords.vertexTopLeftY = coords.vertexTopRightY = -video_height/2; + coords.vertexTopRightX = coords.vertexBottomRightX = video_width/2; + coords.vertexBottomLeftY = coords.vertexBottomRightY = video_height/2; + coords.vertexBottomLeftZ = coords.vertexBottomRightZ = coords.vertexTopLeftZ = coords.vertexTopRightZ = 1; + coords.textureTopLeftY = coords.textureTopRightY = coords.textureTopLeftX = coords.textureBottomLeftX = 0.0; + coords.textureBottomLeftY = coords.textureBottomRightY = coords.textureTopRightX = coords.textureBottomRightX = 1.0; + coords.textureTopLeftQ = coords.textureTopRightQ = coords.textureTopLeftQ = coords.textureBottomLeftQ = 1; - // set up autoscale - if (c->autoscale && (video_width != s->width && video_height != s->height)) { - float width_multiplier = float(s->width) / float(video_width); - float height_multiplier = float(s->height) / float(video_height); - float scale_multiplier = qMin(width_multiplier, height_multiplier); - glScalef(scale_multiplier, scale_multiplier, 1); - } + // set up autoscale + if (c->autoscale && (video_width != s->width && video_height != s->height)) { + float width_multiplier = float(s->width) / float(video_width); + float height_multiplier = float(s->height) / float(video_height); + float scale_multiplier = qMin(width_multiplier, height_multiplier); + glScalef(scale_multiplier, scale_multiplier, 1); + } - // EFFECT CODE START - double timecode = get_timecode(c, playhead); + // EFFECT CODE START + double timecode = get_timecode(c, playhead); - Effect* first_gizmo_effect = nullptr; - Effect* selected_effect = nullptr; + Effect* first_gizmo_effect = nullptr; + Effect* selected_effect = nullptr; - for (int j=0;jeffects.size();j++) { - Effect* e = c->effects.at(j); - process_effect(ctx, c, e, timecode, coords, composite_texture, fbo_switcher, texture_failed, TA_NO_TRANSITION); + for (int j=0;jeffects.size();j++) { + Effect* e = c->effects.at(j); + process_effect(ctx, c, e, timecode, coords, composite_texture, fbo_switcher, texture_failed, TA_NO_TRANSITION); - if (e->are_gizmos_enabled()) { - if (first_gizmo_effect == nullptr) first_gizmo_effect = e; - if (e->container->selected) selected_effect = e; - } - } + if (e->are_gizmos_enabled()) { + if (first_gizmo_effect == nullptr) first_gizmo_effect = e; + if (e->container->selected) selected_effect = e; + } + } - if (selected_effect != nullptr) { - (*gizmos) = selected_effect; - } else if (is_clip_selected(c, true)) { - (*gizmos) = first_gizmo_effect; - } + if (selected_effect != nullptr) { + (*gizmos) = selected_effect; + } else if (is_clip_selected(c, true)) { + (*gizmos) = first_gizmo_effect; + } - if (c->get_opening_transition() != nullptr) { - int transition_progress = playhead - c->get_timeline_in_with_transition(); - if (transition_progress < c->get_opening_transition()->get_length()) { - process_effect(ctx, c, c->get_opening_transition(), (double)transition_progress/(double)c->get_opening_transition()->get_length(), coords, composite_texture, fbo_switcher, texture_failed, TA_OPENING_TRANSITION); - } - } + if (c->get_opening_transition() != nullptr) { + int transition_progress = playhead - c->get_timeline_in_with_transition(); + if (transition_progress < c->get_opening_transition()->get_length()) { + process_effect(ctx, c, c->get_opening_transition(), (double)transition_progress/(double)c->get_opening_transition()->get_length(), coords, composite_texture, fbo_switcher, texture_failed, TA_OPENING_TRANSITION); + } + } - if (c->get_closing_transition() != nullptr) { - int transition_progress = playhead - (c->get_timeline_out_with_transition() - c->get_closing_transition()->get_length()); - if (transition_progress >= 0 && transition_progress < c->get_closing_transition()->get_length()) { - process_effect(ctx, c, c->get_closing_transition(), (double)transition_progress/(double)c->get_closing_transition()->get_length(), coords, composite_texture, fbo_switcher, texture_failed, TA_CLOSING_TRANSITION); - } - } - // EFFECT CODE END + if (c->get_closing_transition() != nullptr) { + int transition_progress = playhead - (c->get_timeline_out_with_transition() - c->get_closing_transition()->get_length()); + if (transition_progress >= 0 && transition_progress < c->get_closing_transition()->get_length()) { + process_effect(ctx, c, c->get_closing_transition(), (double)transition_progress/(double)c->get_closing_transition()->get_length(), coords, composite_texture, fbo_switcher, texture_failed, TA_CLOSING_TRANSITION); + } + } + // EFFECT CODE END - if (!nests.isEmpty()) { - nests.last()->fbo[0]->bind(); - } - glViewport(0, 0, s->width, s->height); + if (!nests.isEmpty()) { + nests.last()->fbo[0]->bind(); + } + glViewport(0, 0, s->width, s->height); - glBindTexture(GL_TEXTURE_2D, composite_texture); + glBindTexture(GL_TEXTURE_2D, composite_texture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glBegin(GL_QUADS); + glBegin(GL_QUADS); - if (coords.grid_size <= 1) { - float z = 0.0f; + if (coords.grid_size <= 1) { + float z = 0.0f; - glTexCoord2f(coords.textureTopLeftX, coords.textureTopLeftY); // top left - glVertex3f(coords.vertexTopLeftX, coords.vertexTopLeftY, z); // top left - glTexCoord2f(coords.textureTopRightX, coords.textureTopRightY); // top right - glVertex3f(coords.vertexTopRightX, coords.vertexTopRightY, z); // top right - glTexCoord2f(coords.textureBottomRightX, coords.textureBottomRightY); // bottom right - glVertex3f(coords.vertexBottomRightX, coords.vertexBottomRightY, z); // bottom right - glTexCoord2f(coords.textureBottomLeftX, coords.textureBottomLeftY); // bottom left - glVertex3f(coords.vertexBottomLeftX, coords.vertexBottomLeftY, z); // bottom left - } else { - float rows = coords.grid_size; - float cols = coords.grid_size; + glTexCoord2f(coords.textureTopLeftX, coords.textureTopLeftY); // top left + glVertex3f(coords.vertexTopLeftX, coords.vertexTopLeftY, z); // top left + glTexCoord2f(coords.textureTopRightX, coords.textureTopRightY); // top right + glVertex3f(coords.vertexTopRightX, coords.vertexTopRightY, z); // top right + glTexCoord2f(coords.textureBottomRightX, coords.textureBottomRightY); // bottom right + glVertex3f(coords.vertexBottomRightX, coords.vertexBottomRightY, z); // bottom right + glTexCoord2f(coords.textureBottomLeftX, coords.textureBottomLeftY); // bottom left + glVertex3f(coords.vertexBottomLeftX, coords.vertexBottomLeftY, z); // bottom left + } else { + const auto rows = coords.grid_size; + const auto cols = coords.grid_size; - for (float k=0;k(k)/rows; + auto next_row_prog = static_cast(k+1)/rows; + for (auto j=0; j(j)/cols; + const auto next_col_prog = static_cast(j+1)/cols; - float vertexTLX = float_lerp(coords.vertexTopLeftX, coords.vertexBottomLeftX, row_prog); - float vertexTRX = float_lerp(coords.vertexTopRightX, coords.vertexBottomRightX, row_prog); - float vertexBLX = float_lerp(coords.vertexTopLeftX, coords.vertexBottomLeftX, next_row_prog); - float vertexBRX = float_lerp(coords.vertexTopRightX, coords.vertexBottomRightX, next_row_prog); + const auto vertexTLX = float_lerp(coords.vertexTopLeftX, coords.vertexBottomLeftX, row_prog); + const auto vertexTRX = float_lerp(coords.vertexTopRightX, coords.vertexBottomRightX, row_prog); + const auto vertexBLX = float_lerp(coords.vertexTopLeftX, coords.vertexBottomLeftX, next_row_prog); + const auto vertexBRX = float_lerp(coords.vertexTopRightX, coords.vertexBottomRightX, next_row_prog); - float vertexTLY = float_lerp(coords.vertexTopLeftY, coords.vertexTopRightY, col_prog); - float vertexTRY = float_lerp(coords.vertexTopLeftY, coords.vertexTopRightY, next_col_prog); - float vertexBLY = float_lerp(coords.vertexBottomLeftY, coords.vertexBottomRightY, col_prog); - float vertexBRY = float_lerp(coords.vertexBottomLeftY, coords.vertexBottomRightY, next_col_prog); + const auto vertexTLY = float_lerp(coords.vertexTopLeftY, coords.vertexTopRightY, col_prog); + const auto vertexTRY = float_lerp(coords.vertexTopLeftY, coords.vertexTopRightY, next_col_prog); + const auto vertexBLY = float_lerp(coords.vertexBottomLeftY, coords.vertexBottomRightY, col_prog); + const auto vertexBRY = float_lerp(coords.vertexBottomLeftY, coords.vertexBottomRightY, next_col_prog); - glTexCoord2f(float_lerp(coords.textureTopLeftX, coords.textureTopRightX, col_prog), float_lerp(coords.textureTopLeftY, coords.textureBottomLeftY, row_prog)); // top left - glVertex2f(float_lerp(vertexTLX, vertexTRX, col_prog), float_lerp(vertexTLY, vertexBLY, row_prog)); // top left - glTexCoord2f(float_lerp(coords.textureTopLeftX, coords.textureTopRightX, next_col_prog), float_lerp(coords.textureTopRightY, coords.textureBottomRightY, row_prog)); // top right - glVertex2f(float_lerp(vertexTLX, vertexTRX, next_col_prog), float_lerp(vertexTRY, vertexBRY, row_prog)); // top right - glTexCoord2f(float_lerp(coords.textureBottomLeftX, coords.textureBottomRightX, next_col_prog), float_lerp(coords.textureTopRightY, coords.textureBottomRightY, next_row_prog)); // bottom right - glVertex2f(float_lerp(vertexBLX, vertexBRX, next_col_prog), float_lerp(vertexTRY, vertexBRY, next_row_prog)); // bottom right - glTexCoord2f(float_lerp(coords.textureBottomLeftX, coords.textureBottomRightX, col_prog), float_lerp(coords.textureTopLeftY, coords.textureBottomLeftY, next_row_prog)); // bottom left - glVertex2f(float_lerp(vertexBLX, vertexBRX, col_prog), float_lerp(vertexTLY, vertexBLY, next_row_prog)); // bottom left - } - } - } + glTexCoord2f(float_lerp(coords.textureTopLeftX, coords.textureTopRightX, col_prog), + float_lerp(coords.textureTopLeftY, coords.textureBottomLeftY, row_prog)); // top left + glVertex2f(float_lerp(vertexTLX, vertexTRX, col_prog), float_lerp(vertexTLY, vertexBLY, row_prog)); // top left + glTexCoord2f(float_lerp(coords.textureTopLeftX, coords.textureTopRightX, next_col_prog), + float_lerp(coords.textureTopRightY, coords.textureBottomRightY, row_prog)); // top right + glVertex2f(float_lerp(vertexTLX, vertexTRX, next_col_prog), float_lerp(vertexTRY, vertexBRY, row_prog)); // top right + glTexCoord2f(float_lerp(coords.textureBottomLeftX, coords.textureBottomRightX, next_col_prog), + float_lerp(coords.textureTopRightY, coords.textureBottomRightY, next_row_prog)); // bottom right + glVertex2f(float_lerp(vertexBLX, vertexBRX, next_col_prog), float_lerp(vertexTRY, vertexBRY, next_row_prog)); // bottom right + glTexCoord2f(float_lerp(coords.textureBottomLeftX, coords.textureBottomRightX, col_prog), + float_lerp(coords.textureTopLeftY, coords.textureBottomLeftY, next_row_prog)); // bottom left + glVertex2f(float_lerp(vertexBLX, vertexBRX, col_prog), float_lerp(vertexTLY, vertexBLY, next_row_prog)); // bottom left + }//for + }//for + } - glEnd(); + glEnd(); - glBindTexture(GL_TEXTURE_2D, 0); // unbind texture + glBindTexture(GL_TEXTURE_2D, 0); // unbind texture - // prepare gizmos - if ((*gizmos) != nullptr - && nests.isEmpty() - && ((*gizmos) == first_gizmo_effect - || (*gizmos) == selected_effect)) { - (*gizmos)->gizmo_draw(timecode, coords); // set correct gizmo coords - (*gizmos)->gizmo_world_to_screen(); // convert gizmo coords to screen coords - } + // prepare gizmos + if ((*gizmos) != nullptr + && nests.isEmpty() + && ((*gizmos) == first_gizmo_effect + || (*gizmos) == selected_effect)) { + (*gizmos)->gizmo_draw(timecode, coords); // set correct gizmo coords + (*gizmos)->gizmo_world_to_screen(); // convert gizmo coords to screen coords + } - if (!nests.isEmpty()) { - ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); - } + if (!nests.isEmpty()) { + ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); + } - glPopMatrix(); + glPopMatrix(); - /*GLfloat motion_blur_frac = (GLfloat) motion_blur_prog / (GLfloat) motion_blur_lim; - if (motion_blur_prog == 0) { - glAccum(GL_LOAD, motion_blur_frac); - } else { - glAccum(GL_ACCUM, motion_blur_frac); - } - motion_blur_prog++;*/ - } - } else { - if (render_audio || (config.enable_audio_scrubbing && audio_scrub && seq->playhead > c->timeline_in)) { - if (c->media != nullptr && c->media->get_type() == MEDIA_TYPE_SEQUENCE) { - nests.append(c); - compose_sequence(viewer, ctx, seq, nests, video, render_audio, gizmos, texture_failed, rendering, playback_speed); - nests.removeLast(); - } else { - if (c->lock.tryLock()) { - // clip is not caching, start caching audio - cache_clip(c, playhead, c->audio_reset, !render_audio, nests, playback_speed); - c->lock.unlock(); - } - } - } + /*GLfloat motion_blur_frac = (GLfloat) motion_blur_prog / (GLfloat) motion_blur_lim; + if (motion_blur_prog == 0) { + glAccum(GL_LOAD, motion_blur_frac); + } else { + glAccum(GL_ACCUM, motion_blur_frac); + } + motion_blur_prog++;*/ + } + } else { + if (render_audio || (config.enable_audio_scrubbing && audio_scrub && seq->playhead > c->timeline_in)) { + if (c->media != nullptr && c->media->get_type() == MEDIA_TYPE_SEQUENCE) { + nests.append(c); + compose_sequence(viewer, ctx, seq, nests, video, render_audio, gizmos, texture_failed, rendering, playback_speed); + nests.removeLast(); + } else { + if (c->lock.tryLock()) { + // clip is not caching, start caching audio + cache_clip(c, playhead, c->audio_reset, !render_audio, nests, playback_speed); + c->lock.unlock(); + } + } + } - // visually update all the keyframe values - if (c->sequence == seq) { // only if you can currently see them - double ts = (playhead - c->get_timeline_in_with_transition() + c->get_clip_in_with_transition())/s->frame_rate; - for (int i=0;ieffects.size();i++) { - Effect* e = c->effects.at(i); - for (int j=0;jrow_count();j++) { - EffectRow* r = e->row(j); - for (int k=0;kfieldCount();k++) { - r->field(k)->validate_keyframe_data(ts); - } - } - } - } - } - } - } + // visually update all the keyframe values + if (c->sequence == seq) { // only if you can currently see them + double ts = (playhead - c->get_timeline_in_with_transition() + c->get_clip_in_with_transition())/s->frame_rate; + for (int i=0;ieffects.size();i++) { + Effect* e = c->effects.at(i); + for (int j=0;jrow_count();j++) { + EffectRow* r = e->row(j); + for (int k=0;kfieldCount();k++) { + r->field(k)->validate_keyframe_data(ts); + } + } + } + } + } + } + } - if (audio_track_count == 0 && viewer != nullptr) { - viewer->play_wake(); - } + if (audio_track_count == 0 && viewer != nullptr) { + viewer->play_wake(); + } - if (video) { - glPopMatrix(); - } + if (video) { + glPopMatrix(); + } - if (!nests.isEmpty() && nests.last()->fbo != nullptr) { - // returns nested clip's texture - return nests.last()->fbo[0]->texture(); - } + if (!nests.isEmpty() && nests.last()->fbo != nullptr) { + // returns nested clip's texture + return nests.last()->fbo[0]->texture(); + } - return 0; + return 0; } void compose_audio(Viewer* viewer, Sequence* seq, bool render_audio, int playback_speed) { - QVector nests; - bool texture_failed; - compose_sequence(viewer, nullptr, seq, nests, false, render_audio, nullptr, texture_failed, audio_rendering, playback_speed); + QVector nests; + bool texture_failed; + compose_sequence(viewer, nullptr, seq, nests, false, render_audio, nullptr, texture_failed, audio_rendering, playback_speed); } From e54304c46e6cbb4ac1f595566f9c26ba998c3e61 Mon Sep 17 00:00:00 2001 From: Mathis Dubrul Date: Mon, 18 Feb 2019 07:45:38 +0100 Subject: [PATCH 3/6] Add french translation --- ts/olive_fr.ts | 1293 ++++++++++++++++++++++++------------------------ 1 file changed, 658 insertions(+), 635 deletions(-) diff --git a/ts/olive_fr.ts b/ts/olive_fr.ts index 699ac8de4..0e61d9c5a 100644 --- a/ts/olive_fr.ts +++ b/ts/olive_fr.ts @@ -6,12 +6,12 @@ Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - + Olive est un logiciel de montage non-linéaire. Ce logiciel est libre et protégé par la licence GNU GPL. Olive Team is obliged to inform users that Olive source code is available for download from its website. - + L'équipe d'Olive vous informe que le code source d'Olive est disponible au téléchargement sur son site Web. @@ -19,7 +19,7 @@ Search for action... - + Rechercher une action… @@ -27,12 +27,12 @@ Advanced Video Settings - + Paramètres vidéo avancés Pixel Format: - + Format de pixel : @@ -40,12 +40,12 @@ Audio - + Audio Recording - + Enregistrement audio @@ -53,12 +53,12 @@ Amount - + Quantité Mix - + Mélanger @@ -66,17 +66,17 @@ Invalid - + Invalide Mono - + Mono Stereo - + Stéréo @@ -84,7 +84,7 @@ <untitled> - + &lt;Sans titre&gt; @@ -92,7 +92,7 @@ Set Color - + Définir la couleur @@ -100,27 +100,27 @@ Top Left - + En haut à gauche Top Right - + En haut à droite Bottom Left - + En bas à gauche Bottom Right - + En bas à droite Perspective - + Perspective @@ -128,7 +128,7 @@ Debug Log - + Journal de débogage @@ -137,22 +137,22 @@ Welcome to Olive! - + Bienvenue dans Olive ! Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - + Olive est un logiciel libre et open-source distribué sous la licence GNU GPL. Si vous avez payé pour ce logiciel, vous avez été victime d'un scam. This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - + Ce logiciel est actuellement en ALPHA, ce qui signifie qu'il a de grandes chances de planter, d'avoir des bugs ou de manquer de certaines fonctions. Nous n'offrons aucune garantie, utilisez-le à vos propres risques. Merci de nous rapporter tout bug ou demande d'ajout d'une fonctionnalité à %1 Thank you for trying Olive and we hope you enjoy it! - + Merci d'utiliser Olive, nous espérons que vous l'apprécierez ! @@ -160,89 +160,89 @@ Invalid effect - + Effet invalide No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - + Aucun candidat pour l'effet '%1'. C'est effet est peut-être corrompu. Essayez de le réinstaller, ou de réinstaller Olive. Cu&t - + &Couper &Copy - + Cop&ier Move &Up - + Déplacer vers le &haut Move &Down - + Déplacer vers le &bas D&elete - + &Supprimer Load Settings From File - + Charger les paramètres Save Settings to File - + Enregistrer les paramètres Save Effect Settings - + Enregistrer les paramètres d'effet Effect XML Settings %1 - + Paramètres d'effet XML %1 Save Settings Failed - + L'enregistrement des paramètres a échoué Failed to open "%1" for writing. - + Impossible d'écrire dans "%1". Load Effect Settings - + Charger les paramètres d'effet Load Settings Failed - + Le chargement des paramètres a échoué Failed to open "%1" for reading. - + Impossible de lire "%1". This settings file doesn't match this effect. - + Ce fichier de paramètre ne correspond pas à cet effet. @@ -250,47 +250,47 @@ Effects: - + Effets : &Paste - + C&oller Add Video Effect - + Ajouter un effet vidéo VIDEO EFFECTS - + EFFETS VIDÉO Add Video Transition - + Ajouter une transition vidéo Add Audio Effect - + Ajouter un effet audio AUDIO EFFECTS - + EFFETS AUDIO Add Audio Transition - + Ajouter une transition audio (Multiple clips selected) - + (Clips multiples sélectionnés) @@ -298,12 +298,12 @@ Disable Keyframes - + Désactiver les images-clés Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - + Désactiver les images-clés supprimera toutes les images-clés courantes. Êtes-vous sûr⋅e de vouloir cela ? @@ -311,7 +311,7 @@ File: - + Fichier : @@ -319,93 +319,93 @@ Export "%1" - + Exporter "%1" Unknown codec name %1 - + Nom de codec inconnu %1 Export Failed - + L'export a échoué Export failed - %1 - + Export échoué - %1 Invalid dimensions - + Dimensions invalides Export width and height must both be even numbers/divisible by 2. - + La largeur et la hauteur d'export doivent être des nombres pairs/divisibles par 2. Invalid codec - + Codec invalide Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - + Impossible de déterminer les paramètres de sortie pour le codec sélectionné. Ceci est un bug, merci de contacter les développeurs. Invalid format - + Format invalide Couldn't determine output format. This is a bug, please contact the developers. - + Impossible de déterminer le format de sortie. Ceci est un bug, merci de contacter les développeurs. Export Media - + Exporter le média Quality-based (Constant Rate Factor) - + Qualitatif (Constant Rate Factor) Constant Bitrate - + Débit binaire constant Invalid Codec - + Codec invalide Failed to find a suitable encoder for this codec. Export will likely fail. - + Impossible de trouver un encodeur approprié pour ce codec. L'export risque de planter. Failed to find pixel format for this encoder. Export will likely fail. - + Impossible de trouver un format de pixel pour cet encodeur. L'export risque de planter. Bitrate (Mbps): - + Débit binaire (Mbps) : Quality (CRF): - + Qualité (CRF) : @@ -415,78 +415,83 @@ 17-18 = visually lossless (compressed, but unnoticeable) 23 = high quality 51 = lowest quality possible - + Facteur de qualité : + +0 = sans perte +17-18 = visuellement sans perte (compressé, mais imperceptible) +23 = haute qualité +51 = qualité la plus basse Target File Size (MB): - + Taille du fichier cible (Mo) : Format: - + Format : Range: - + Plage : Entire Sequence - + Séquence entière In to Out - + Du point d'entrée au point de sortie Video - + Vidéo Codec: - + Codec : Width: - + Largeur : Height: - + Hauteur : Frame Rate: - + Images par seconde : Compression Type: - + Type de compression : Advanced - + Avancé Sampling Rate: - + Taux d'échantillonnage : Bitrate (Kbps/CBR): - + Débit binaire (Kbps/CBR) : @@ -494,87 +499,87 @@ failed to send frame to encoder (%1) - + Échec de l'envoi d'une image vers l'encodeur (%1) failed to receive packet from encoder (%1) - + Échec de la réception d'un paquet depuis l'encodeur (%1) could not video encoder for %1 - + Impossible d'encoder la vidéo pour %1 could not allocate video stream - + impossible d'allouer le flux vidéo could not allocate video encoding context - + impossible d'allouer le contexte d'encodage vidéo could not open output video encoder (%1) - + impossible d'ouvrir l'encodeur vidéo de sortie (%1) could not copy video encoder parameters to output stream (%1) - + impossible de copier les paramètres d'encodage vidéo vers le flux de sortie (%1) could not audio encoder for %1 - + impossible d'encoder l'audio pour %1 could not allocate audio stream - + impossible d'allouer le flux audio could not allocate audio encoding context - + impossible d'allouer le contexte d'encodage audio could not open output audio encoder (%1) - + impossible d'ouvrir l'encodeur audio de sortie (%1) could not copy audio encoder parameters to output stream (%1) - + impossible de copier les paramètres d'encodage audio vers le flux de sortie (%1) could not allocate audio buffer (%1) - + impossible d'allouer le buffer audio (%1) could not create output format context - + impossible de créer le contexte du format de sortie could not open output file (%1) - + impossible d'ouvrir le fichier de sortie (%1) could not write output file header (%1) - + impossible d'écrire l'en-tête du fichier de sortie (%1) could not write output file trailer (%1) - + impossible d'écrire le trailer du fichier (%1) @@ -582,17 +587,17 @@ Type - + Type Fill Left with Right - + Remplir la gauche avec la droite Fill Right with Left - + Remplir la droite avec la gauche @@ -600,22 +605,22 @@ Failed to load Frei0r plugin "%1": %2 - + Impossible de charger le plugin Frei0r "%1": %2 NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - + NOTE : Vous ne pouvez pas charger de plugin Frei0r 32-bit dans la version 64-bit d'Olive. Essayez de trouver une version 64-bit de ce plugin ou basculez vers Olive 32-bit. NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - + NOTE : Vous ne pouvez pas charger de plugin Frei0r 64-bit dans la version 32-bit d'Olive. Essayez de trouver une version 32-bit de ce plugin ou basculez vers Olive 64-bit. Error loading Frei0r plugin - + Erreur durant le chargement du plugin Frei0r @@ -623,22 +628,22 @@ Graph Editor - + Éditeur de graphes Linear - + Linéaire Bezier - + Bézier Hold - + Maintenir @@ -646,17 +651,17 @@ Zoom to Selection - + Zoomer sur la sélection Zoom to Show All - + Zoomer pour tout montrer Reset View - + Réinitialiser la vue @@ -664,22 +669,22 @@ None (Progressive) - + Aucun (Progressif) Top Field First - + Trame supérieure en premier Bottom Field First - + Trame inférieure en premier Invalid - + Invalide @@ -687,7 +692,7 @@ Enable Keyframes - + Activer les images-clés @@ -695,17 +700,17 @@ Linear - + Linéaire Bezier - + Bézier Hold - + Maintenir @@ -714,13 +719,13 @@ Set Value - + Définir la valeur New value: - + Nouvelle valeur : @@ -728,17 +733,17 @@ Loading... - + Cargement… Loading '%1'... - + Chargement '%1'… Cancel - + Annuler @@ -746,52 +751,52 @@ Version Mismatch - + Incompatibilité de version This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? - + Ce projet a été enregistré avec une version différente d'Olive et peut ne pas être totalement compatible avec celle-ci. Voulez-vous essayer de l'ouvrir malgré tout ? Invalid Clip Link - + Lien du clip invalide This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - + Ce projet contient un lien de clip invalide. Il peut être corrompu. Voulez-vous l'ouvrir malgré tout ? %1 - Line: %2 Col: %3 - + %1 - Ligne : %2 Col. : %3 User aborted loading - + L'utilisateur a abandonné le chargement XML Parsing Error - + Erreur de parsage XML Couldn't load '%1'. %2 - + Impossible de charger '%1'. %2 Project Load Error - + Erreur dans le chargement du projet Error loading project: %1 - + Erreur lors du chargement du projet : %1 @@ -799,677 +804,679 @@ Auto-recovery - + Récupération automatique Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - + Olive ne s'est pas fermé convenablement et un fichier de récupépration a été détecté. Souhaitez-vous l'ouvrir ? &Project - + &Projet &Sequence - + &Séquence &Folder - + &Dossier Set In Point - + Définir le point d'entrée Set Out Point - + Définir le point de sortie Welcome to %1 - + Bienvenue à %1 Reset In Point - + Réinitialiser le point d'entrée Reset Out Point - + Réinitialiser le point de sortie Clear In/Out Point - + Effacer le point d'entrée/de sortie No active sequence - + Pas de séquence active Please open the sequence you wish to export. - + Veuillez ouvrir la séquence que vous souhaitez exporter. Save Project As... - + Enregistrer sous… Unsaved Project - + Projet non-sauvegardé This project has changed since it was last saved. Would you like to save it before closing? - + Ce projet a été modifié depuis la dernière sauvegarde. Souhaitez-vous l'enregistrer avant de fermer ? &File - + &Fichier &New - + &Nouveau &Open Project - + &Ouvrir un projet Clear Recent List - + Nettoyer la liste des projets récents Open Recent - + Ouvrir un projet récent &Save Project - + &Enregistrer le projet Save Project &As - + Enregistrer le projet &sous &Import... - + &Importer… &Export... - + &Exporter… E&xit - + &Quitter &Edit - + &Édition &Undo - + &Annuler Redo - + Rétablir Cu&t - + &Couper Cop&y - + Cop&ier &Paste - + C&oller Paste Insert - + Coller et Insérer Duplicate - + Dupliquer Delete - + Supprimer Ripple Delete - + Supprimer et raccorder Split - + Séparer Select &All - + Sélectionner &tout Deselect All - + Tout désélectionner Add Default Transition - + Ajouter la transition par défaut Link/Unlink - + Lier/Délier Enable/Disable - + Activer/Désactiver Nest - + Imbriquer Ripple to In Point - + Not literal, but it says what it is + Propager au point d'entrée Ripple to Out Point - + Not literal, but it says what it is + Propager au point de sortie Edit to In Point - + Éditer comme point d'entrée Edit to Out Point - + Éditer comme point de sortie Delete In/Out Point - + Supprimer les points d'entrée/de sortie Ripple Delete In/Out Point - + Supprimer et raccorder au point d'entrée/de sortie Set/Edit Marker - + Définir/Éditer un marqueur &View - + &Affichage Zoom In - + Zommer Zoom Out - + Dézoomer Increase Track Height - + Augmenter la hauteur de piste Decrease Track Height - + Diminuer la hauteur de piste Toggle Show All - + Vue d'ensemble Track Lines - + Contours des pistes Rectified Waveforms - + Formes d'onde ajustées Frames - + Images Drop Frame - + Drop Frame Non-Drop Frame - + Non-Drop Frame Milliseconds - + Millisecondes Title/Action Safe Area - + Zone sûre de titre/d'action Off - + Désactivée Default - + Par défaut 4:3 - + 4:3 16:9 - + 16:9 Custom - + Personnalisée Full Screen - + Plein-écran Full Screen Viewer - + Lecteur en plein écran &Playback - + &Lecture Go to Start - + Aller au début Previous Frame - + Image précédente Play/Pause - + Lire/Pause Play In to Out - + Lire entre les points d'entrée et de sortie Next Frame - + Image suivante Go to End - + Aller à la fin Go to Previous Cut - + Aller au point d'édition précédent Go to Next Cut - + Aller au point d'édition suivant Go to In Point - + Aller au point d'entrée Go to Out Point - + Aller au point de sortie Shuttle Left - + Jouer vers la gauche Shuttle Stop - + Arrêter Shuttle Right - + Jouer vers la droite Loop - + Boucle &Window - + &Fenêtre Project - + Projet Effect Controls - + Propriétés des effets Timeline - + Ligne du temps Graph Editor - + Éditeur de graphes Media Viewer - + Lecteur de média Sequence Viewer - + Lecteur de séquence Maximize Panel - + Agrandir le panneau Reset to Default Layout - + Restaurer la disposition par défaut &Tools - + &Outils Pointer Tool - + Curseur Edit Tool - + Éditer Ripple Tool - + Propagation Razor Tool - + Cutter Slip Tool - + Déplacer dessous Slide Tool - + Déplacer dessus Hand Tool - + Main Transition Tool - + Transition Enable Snapping - + Autoriser le magnétisme Selecting Also Seeks - + Sélectionner déplace la tête de lecture Edit Tool Also Seeks - + Éditer déplace la tête de lecture Edit Tool Selects Links - + Éditer sélectionne les liens Seek Also Selects - + Sélectionner avec la tête de lecture Seek to the End of Pastes - + Placer la tête de lecture après le collage Scroll Wheel Zooms - + Zoomer avec la molette Enable Drag Files to Timeline - + Autoriser le dépôt de fichier sur la ligne de temps Auto-Scale By Default - + Échelle automatique par défaut Enable Seek to Import - + Déplacer la tête de lecture à l'import Audio Scrubbing - + Lire l'audio au déplacement de la tête de lecture Enable Drop on Media to Replace - + Déposer sur un média pour le remplacer Enable Hover Focus - + Activer le focus au survol Ask For Name When Setting Marker - + Demander un nom à la création d'un marqueur No Auto-Scroll - + Pas de défilement automatique Page Auto-Scroll - + Défilement paginé Smooth Auto-Scroll - + Défilement doux Preferences - + Préférences Clear Undo - + Nettoyer la pile d'annulation &Help - + &Aide A&ction Search - + Chercher une a&ction Debug Log - + Journal de débogage &About... - + &À propos… <untitled> - + &lt;Sans titre&gt; Open Project... - + Ouvrir un projet… Missing recent project - + Projet récent manquant The project '%1' no longer exists. Would you like to remove it from the recent projects list? - + Le projet '%1' n'existe plus. Voulez-vous le retirer de la liste des projets récents ? Invalid aspect ratio - + Ratio d'image invalide The aspect ratio '%1' is invalid. Please try again. - + Le ratio d'image '%1' est invalide. Merci de réessayer à nouveau. Enter custom aspect ratio - + Entrez un ratio d'image personnalisé Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - + Entrez le ratio de la zone sûre de titre/d'action (ex: 16:9) : Nested Sequence - + Séquence imbriquée @@ -1477,17 +1484,17 @@ Set Marker - + Définir un marqueur Set clip marker name: - + Définir le nom du marqueur de clip : Set sequence marker name: - + Définir le nom du marqueur de séquence : @@ -1495,47 +1502,47 @@ New Folder - + Nouveau dossier Name: - + Nom : Filename: - + Nom de fichier : Video Dimensions: - + Dimensions de la vidéo : Frame Rate: - + Images par seconde : %1 field(s) (%2 frame(s)) - + %1 trame(s) (%2 image(s)) Interlacing: - + Entrelacement : Audio Frequency: - + Fréquence audio : Audio Channels: - + Canaux audio : @@ -1544,22 +1551,26 @@ Video Dimensions: %2x%3 Frame Rate: %4 Audio Frequency: %5 Audio Layout: %6 - + Nom : %1 +Dimensions vidéo : %2x%3 +Images par seconde : %4 +Fréquence audio: %5 +Canaux audio : %6 Name - + Nom Duration - + Durée Rate - + Images par seconde @@ -1567,55 +1578,55 @@ Audio Layout: %6 "%1" Properties - + "%1" Propriétés Tracks: - + Pistes : Video %1: %2x%3 %4FPS - + Vidéo %1 : %2×%3 %4 i/s Audio %1: %2Hz %3 - + Audio %1 : %2 Hz %3 %n channel(s) - - - + + %n canal + %n canaux Conform to Frame Rate: - + Conformer aux images par seconde : Alpha is Premultiplied - + Le canal alpha est prémultiplié Auto (%1) - + Auto (%1) Interlacing: - + Entrelacement : Name: - + Nom : @@ -1623,127 +1634,127 @@ Audio Layout: %6 Editing "%1" - + Édition "%1" New Sequence - + Nouvelle séquence Preset: - + Préréglage : Film 4K - + Film 4K TV 4K (Ultra HD/2160p) - + TV 4K (Ultra HD/2160p) 1080p - + 1080p 720p - + 720p 480p - + 480p 360p - + 360p 240p - + 240p 144p - + 144p NTSC (480i) - + NTSC (480i) PAL (576i) - + PAL (576i) Custom - + Personnalisé Video - + Vidéo Width: - + Largeur : Height: - + Hauteur : Frame Rate: - + Images par seconde : Pixel Aspect Ratio: - + Ratio des pixels : Square Pixels (1.0) - + Pixels carré (1,0) Interlacing: - + Entrelacement : None (Progressive) - + Aucun (Progressif) Audio - + Audio Sample Rate: - + Taux d'échantillonnage : Name: - + Nom : @@ -1751,7 +1762,7 @@ Audio Layout: %6 Pan - + Panoramique @@ -1759,7 +1770,7 @@ Audio Layout: %6 Generating Proxy: %1% - + Génération du proxy : %1% @@ -1767,283 +1778,285 @@ Audio Layout: %6 Preferences - + Préférences Invalid CSS File - + Fichier CSS invalide CSS file '%1' does not exist. - + Le fichier CSS '%1' n'existe pas. Warning - + Avertissement Some changed settings will require restarting Olive to take effect - + Certains paramètres modifiés nécessitent le redémarrage d'Olive pour prendre effet Confirm Reset All Shortcuts - + Confirmez la réinitialisation de tous les raccourcis clavier Are you sure you wish to reset all keyboard shortcuts to their defaults? - + Êtes-vous sûr⋅e de vouloir réinitialiser tous les raccourcis clavier à leur valeur par défaut ? Import Keyboard Shortcuts - + Importer les raccourcis clavier Error saving shortcuts - + Erreur dans l'enregistrement des raccourcis Failed to open file for reading - + Échec de l'ouverture du fichier Export Keyboard Shortcuts - + Exporter les raccourcis clavier Export Shortcuts - + Exporter les raccourcis Shortcuts exported successfully - + Les raccourcis ont été exporté avec succès Failed to open file for writing - + Échec de l'ouverture du fichier Browse for CSS file - + Choisir un fichier CSS Delete All Previews - + Supprimer toutes les prévisualisations Are you sure you want to delete all previews? - + Êtes-vous sûr⋅e de vouloir supprimer toutes les prévisualisations ? Previews Deleted - + Prévisualisations supprimées All previews deleted succesfully. You may have to re-open your current project for changes to take effect. - + Toutes les prévisualisations ont été supprimées avec succès. Il est possible que vous deviez ré-ouvrir le projet actuel pour que les changements prennent effet. Language: - + Langue : Custom CSS: - + CSS personnalisé : Browse - + Parcourir Image sequence formats: - + Formats de séquence d'image : Audio Recording: - + Enregistrement audio : Mono - + Mono Stereo - + Stéréo Effect Textbox Lines: - + Lignes des boîtes de texte d'effet : Thumbnail Resolution: - + Résolution des miniatures : Waveform Resolution: - + Résolution des formes d'onde : Delete Previews - + Supprimer les prévisualisations Use Software Fallbacks When Possible - + Utiliser les solutions de repli logicielles quand cela est possible General - + Général Behavior - + Comportement Seeking - + Tête de lecture Accurate Seeking Always show the correct frame (visual may pause briefly as correct frame is retrieved) - + Recherche fidèle +Tojours montrer l'image exacte (la prévisualisation peut se mettre en pause brièvement quand la bonne image est en cours de récupération) Fast Seeking Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) - + Recherhe rapide +Montrer rapidement (la prévisualition peut montrer brièvement des images imprécises lors du déplacement de la tête de lecture − cela n'affecte pas la lecture et l'export) Memory Usage - + Utilisation de la mémoire Upcoming Frame Queue: - + File d'image à venir : frames - + images seconds - + secondes Previous Frame Queue: - + File d'image précédentes : Playback - + Lecture Output Device: - + Système de sortie : Default - + Défaut Input Device: - + Système d'entrée : Sample Rate: - + Taux d'échantillonnage : Audio - + Audio Search for action or shortcut - + Rechercher une action ou un raccourci Action - + Action Shortcut - + Raccourci Import - + Importer Export - + Exporter Reset Selected - + Réinitialiser la sélection Reset All - + Tout réinitialiser Keyboard - + Clavier @@ -2051,12 +2064,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Could not open file - %1 - + Impossible d'ouvrir le fichier - %1 Could not find stream information - %1 - + Impossible de trouver les informations de flux - %1 @@ -2064,94 +2077,94 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Search media, markers, etc. - + Rechercher des médias, marqueurs, etc. Project - + Projet Sequence - + Séquence Replace '%1' - + Remplacer '%1' All Files - + Tous les fichiers No active sequence - + Pas de séquence active No sequence is active, please open the sequence you want to replace clips from. - + Pas de séquence active, veuillez ouvrir la séquence dont vous souhaitez modifier les clips. Active sequence selected - + Séquence active sélectionnée You cannot insert a sequence into itself, so no clips of this media would be in this sequence. - + Vous ne pouvez pas insérer une séquence à l'intérieur d'elle-même, donc aucun clip de ce média ne peut être dans cette séquence. Rename '%1' - + Renommer '%1' Enter new name: - + Entrez le nouveau nom : Delete media in use? - + Supprimer un média en cours d'utilisation ? The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? - + Le média '%1' est actuellement utilisé dans '%2', le supprimer effacera toutes les instances dans la séquence. Êtes-vous sûr⋅e de vouloir cela ? Skip - + Passer Image sequence detected - + Séquence d'image détectée The file '%1' appears to be part of an image sequence. Would you like to import it as such? - + Le fichier '%1' semble faire partie d'une séquence d'image. Voulez-vous l'importer comme tel ? Import media... - + Importer un média… No sequence is active, please open the sequence you want to delete clips from. - + Aucune séquence n'est active, veuillez sélectionner la séquence dont vous souhaitez supprimer les clips. @@ -2159,77 +2172,77 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Create Proxy - + Créer un proxy Proxy - + Proxy Dimensions: - + Dimensions : Same Size as Source - + Même taille que la source Half Resolution (1/2) - + Moitié de la résolution (1/2) Quarter Resolution (1/4) - + Quart de la résolution (1/4) Eighth Resolution (1/8) - + Huitième de la résolution (1/8) Sixteenth Resolution (1/16) - + Seizième de la résolution (1/16) Format: - + Format : ProRes HQ - + ProRes HQ Location: - + Chemin : Same as Source (in "%1" folder) - + Comme la source (dans le dossier "%1") Proxy file exists - + Un fichier de proxy existe The file "%1" already exists. Do you wish to replace it? - + Le fichier "%1" existe déjà. Voulez-vous le remplacer ? Custom Location - + Chemin personnalisé @@ -2237,7 +2250,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Finished generating proxy for "%1" - + Génération du proxy pour "%1" terminée @@ -2245,67 +2258,67 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Replace clips using "%1" - + Remplacer les clips par "%1" Select which media you want to replace this media's clips with: - + Sélectionnez quel média vous souhaitez utiliser pour remplacer les clips de ce média : Keep the same media in-points - + Garder les mêmes points d'entrée du média Replace - + Remplacer Cancel - + Annuler No media selected - + Aucun média sélectionné Please select a media to replace with or click 'Cancel'. - + Veuillez sélectionner un média avec lequel remplacer ou choisir 'Annuler'. Same media selected - + Même média sélectionné You selected the same media that you're replacing. Please select a different one or click 'Cancel'. - + Vous avez sélectionné le même média que celui que vous souhaitez remplacer. Veuillez sélectionner un autre média ou cliquer sur 'Annuler'. Folder selected - + Dossier sélectionné You cannot replace footage with a folder. - + Vous ne pouvez pas remplacer un média par un dossier. Active sequence selected - + Séquence active sélectionnée You cannot insert a sequence into itself. - + Vous ne pouvez pas insérer une séquence dans elle-même. @@ -2313,7 +2326,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff %1 (copy) - + %1 (copy) @@ -2321,17 +2334,17 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Intensity - + Intensité Rotation - + Rotation Frequency - + Fréquence @@ -2339,37 +2352,37 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Type - + Type Solid Color - + Couleur unie SMPTE Bars - + Barres SMPTE Checkerboard - + Damier Opacity - + Opacité Color - + Couleur Checkerboard Size - + Taille du damier @@ -2377,137 +2390,137 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Import... - + Importer… New - + Nouveau View - + Affichage Tree View - + Vue arborescente Icon View - + Vue par icônes Show Toolbar - + Afficher la barre d'outils Show Sequences - + Afficher les séquences Replace/Relink Media - + Remplacer/Relier le média Reveal in Explorer - + Montrer dans l'explorateur Reveal in Finder - + Montrer dans le Finder Reveal in File Manager - + Montrer dans le gestionnaire de fichiers Replace Clips Using This Media - + Remplacer les clips utilisant ce média Create Sequence With This Media - + Créer une séquence à partir de ce média Duplicate - + Dupliquer Delete All Clips Using This Media - + Supprimer tous les clips utilisant ce média Proxy - + Proxy Generating proxy: %1% complete - + Génération du proxy: %1% achevée Create/Modify Proxy - + Créer/Modifier le proxy Create Proxy - + Créer le proxy Modify Proxy - + Modifier le proxy Restore Original - + Restaurer l'original Delete - + Supprimer Properties... - + Propriétés… Replace Media - + Remplacer le média You dropped a file onto '%1'. Would you like to replace it with the dropped file? - + Vous avez déposé un fichier sur '%1'. Souhaitez-vous le remplacer par le fichier déposé ? Delete proxy - + Supprimer le proxy Would you like to delete the proxy file "%1" as well? - + Souhaitez-vous aussi supprimer le fichier de proxy "%1" ? @@ -2515,37 +2528,37 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Speed/Duration - + Vitesse/Durée Speed: - + Vitesse : Frame Rate: - + Images par seconde : Duration: - + Durée : Reverse - + Inverser Maintain Audio Pitch - + Maintenir la hauteur audio Ripple Changes - + Propager les changements @@ -2553,7 +2566,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Edit Text - + Éditer le texte @@ -2561,113 +2574,113 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Text - + Texte Font - + Police Size - + Taille Color - + Couleur Alignment - + Allignement Left - + À gauche Center - + Centrer Right - + À droite Justify - + Justifié Top - + En haut Bottom - + En bas Word Wrap - + Retour automatique Outline - + Contour Outline Color - + Couleur du contour Outline Width - + Épaisseur du contour Shadow - + Ombre Shadow Color - + Couleur de l'ombre Shadow Distance - + Distance de l'ombre Shadow Softness - + Douceur de l'ombre Shadow Opacity - + Opacité de l'ombre Sample Text - + Texte d'exemple &Edit Text - + &Modifier le texte @@ -2675,47 +2688,47 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Timecode - + Code temporel Sequence - + Séquence Media - + Média Scale - + Échelle Color - + Couleur Background Color - + Couleur d'arrière-plan Background Opacity - + Opacité de l'arrière-plan Offset - + Écart Prepend - + Préfixe @@ -2723,147 +2736,147 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Timeline: - + Ligne du temps : <none> - + <aucun> Effect already exists - + L'effet existe déjà Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - + Le clip '%1' contient déjà un effet '%2'. SOuhaitez-vous le remplacer par l'effet du presse-papier ou ajouter celui comme un effet distinct ? Add - + Ajouter Replace - + Remplacer Skip - + Passer Do this for all conflicts found - + Faire ceci pour tous les conflits Title... - + Titre… Solid Color... - + Couleur unie… Bars... - + Barres… Tone... - + Ton… Noise... - + Bruit… Unsaved Project - + Projet non-sauvegardé You must save this project before you can record audio in it. - + Vous devez sauvegarder ce projet avant d'effectuer un enregistrement audio à l'intérieur. Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - + Cliquez sur la ligne du temps là où vous souhaitez commencer l'enregistrement (tirez pour limiter l'enregistrement jusqu'à une certaine image) Pointer Tool - + Curseur Edit Tool - + Éditer Ripple Tool - + Propagation Razor Tool - + Cutter Slip Tool - + Déplacer dessous Slide Tool - + Déplacer dessus Hand Tool - + Main Transition Tool - + Transition Snapping - + Magnétisme Zoom In - + Zoomer Zoom Out - + Dézoomer Record audio - + Enregistrement audio Add title, solid, bars, etc. - + Ajouter un titre, une couleur unie, des barres, etc. @@ -2871,7 +2884,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Center Timecodes - + Centrer les codes temporels @@ -2879,72 +2892,72 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff &Undo - + Ann&uler &Redo - + &Rétablir C&ut - + &Couper Cop&y - + Cop&ier &Paste - + C&oller R&ipple Delete - + Supprimer et r&accorder Sequence Settings - + Paramètres de la séquence &Speed/Duration - + &Vitesse/Durée Auto-s&cale - + Échelle automati&que Enable/Disable - + Activer/Désactiver Link/Unlink - + Lier/Délier &Nest - + Im&briquer &Reveal in Project - + &Révéler dans le projet R&ename - + R&enommer @@ -2952,62 +2965,65 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Start: %2 End: %3 Duration: %4 - + %1 +Début : %2 +Fin : %3 +Durée : %4 Rename '%1' - + Renommer '%1' Rename multiple clips - + Renommer plusieurs clips Enter a new name for this clip: - + Entrez un nouveau nom pour ce clip : Error - + Erreur Couldn't locate media wrapper for sequence. - + Impossible de localiser le conteneurdu média de cette séquence. Title - + Titre Solid Color - + Couleur unie Bars - + Barres Tone - + Ton Noise - + Bruit Duration: - + Durée : @@ -3015,22 +3031,22 @@ Duration: %4 Type - + Type Frequency - + Fréquence Amount - + Quantité Mix - + Mélange @@ -3038,157 +3054,164 @@ Duration: %4 Position - + Position Scale - + Échelle Uniform Scale - + Échelle uniforme Rotation - + Rotation Anchor Point - + Point d'ancrage Opacity - + Opacité Blend Mode - + Mode de fusion Normal - + Normal Darken - + Assombrir Multiply - + Multiplier Color Burn - + Not literal but same translation as Adobe + Densité couleur + Linear Burn - + Not literal but same translation as Adobe + Densité linéaire + Lighten - + Éclaircir Screen - + Not literal but same translation as Adobe + Superposition Color Dodge - + Not literal but same translation as Adobe + Densité couleur - Linear Dodge (Add) - + Not literal but same translation as Adobe + Densité linéaire - Overlay - + Incrustation Soft Light - + Not literal but same translation as Adobe + Lumière tamisée Hard Light - + Lumière crue Vivid Light - + Lumière vive Linear Light - + Lumière linéaire Pin Light - + Not literal but same translation as Adobe + Lumière ponctuelle Hard Mix - + Mélange maximal Difference - + Différence Exclusion - + Exclusion Reflect - + Réflexion Substract - + Soustraction Average - + Moyenne Glow - + Lueur Negation - + Négation Phoenix - + Phénix @@ -3196,7 +3219,7 @@ Duration: %4 Length - + Longueur @@ -3206,62 +3229,62 @@ Duration: %4 Error loading VST plugin - + Erreur lors du chargement du plugin VST Failed to create VST reference - + Impossible de créer la référence VST Failed to load VST plugin "%1": %2 - + Impossible de charger le plugin VST "%1": %2 NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - + NOTE : Vous ne pouvez pas charger de plugin VST 32-bit avec la version 64-bit d'Olive. Essayez de trouver une version 64-bit de ce plugin ou basculez sur la version 32-bit d'Olive. NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - + NOTE : Vous ne pouvez pas charger de plugin VST 64-bit avec la version 32-bit d'Olive. Essayez de trouver une version 32-bit de ce plugin ou basculez sur la version 64-bit d'Olive. Failed to locate entry point for dynamic library. - + Impossible de localiser le point d'entrée de la bibliothèque dynamique. VST Error - + Erreur VST Plugin's magic number is invalid - + Le nombre magique du plugin est invalide Plugin - + Plugin Interface - + Interface Show - + Montrer VST Plugin - + Plugin VST @@ -3269,17 +3292,17 @@ Duration: %4 Sequence Viewer - + Lecteur de séquence Media Viewer - + Lecteur de média (none) - + (aucun) @@ -3287,57 +3310,57 @@ Duration: %4 Save Frame as Image... - + Enregistrer l'image… Show Fullscreen - + Montrer en plein écran Disable - + Désactiver Screen %1: %2x%3 - + Écran %1: %2x%3 Zoom - + Zoom Fit - + Ajuster Custom - + Personnalisé Close Media - + Fermer le média Save Frame - + Enregistrer l'image Viewer Zoom - + Zoom du lecteur Set Custom Zoom Value: - + Définir une valeur de zoom personnalisée : @@ -3345,7 +3368,7 @@ Duration: %4 Exit Fullscreen - + Quitter le mode plein-écran @@ -3353,12 +3376,12 @@ Duration: %4 (unknown) - + (inconnu) Missing Effect - + Effet manquant @@ -3366,7 +3389,7 @@ Duration: %4 Volume - + Volume @@ -3374,12 +3397,12 @@ Duration: %4 Invalid transition - + Transition invalide No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. - + Aucun candidat pour la transition '%1'. Cette transition est peut-être corrompue. Essayez de la réinstaller, ou de réinstaller Olive. From 69272a808640875cd876c6a2b9086fe24fc8232b Mon Sep 17 00:00:00 2001 From: Alexandre Prokoudine Date: Mon, 18 Feb 2019 16:50:10 +0300 Subject: [PATCH 4/6] Mark user-visible message for translation --- dialogs/exportdialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dialogs/exportdialog.cpp b/dialogs/exportdialog.cpp index 7328e4b23..677306e08 100644 --- a/dialogs/exportdialog.cpp +++ b/dialogs/exportdialog.cpp @@ -694,7 +694,7 @@ void ExportDialog::setup_ui() { verticalLayout->addWidget(videoGroupbox); audioGroupbox = new QGroupBox(this); - audioGroupbox->setTitle("Audio"); + audioGroupbox->setTitle(tr("Audio")); audioGroupbox->setCheckable(true); QGridLayout* audioGridLayout = new QGridLayout(audioGroupbox); From e3f79a44dc15a04365b9d4d305d33163b3dcd207 Mon Sep 17 00:00:00 2001 From: Alexandre Prokoudine Date: Mon, 18 Feb 2019 16:55:12 +0300 Subject: [PATCH 5/6] Update Russian translation --- ts/olive_ru.ts | 1701 +++++++++++++++++++++++------------------------- 1 file changed, 829 insertions(+), 872 deletions(-) diff --git a/ts/olive_ru.ts b/ts/olive_ru.ts index e3b8ad0be..24144e6a7 100644 --- a/ts/olive_ru.ts +++ b/ts/olive_ru.ts @@ -4,12 +4,12 @@ AboutDialog - + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. Olive — нелинейный видеоредактор. Эта программа является свободной и защищена GNU GPL. - + Olive Team is obliged to inform users that Olive source code is available for download from its website. Исходный код Olive доступен для скачивания на сайте программы. @@ -17,7 +17,7 @@ ActionSearch - + Search for action... Найти действие… @@ -25,12 +25,12 @@ AdvancedVideoDialog - + Advanced Video Settings Дополнительные параметры видео - + Pixel Format: Формат пикселей: @@ -38,25 +38,25 @@ Audio - - Audio - Звук + + %1 Audio + - - Recording - Запись + + Recording %1 + Запись %1 AudioNoiseEffect - + Amount Количество - + Mix Смешивание @@ -64,17 +64,17 @@ ChannelLayoutName - + Invalid Некорректный - + Mono Моно - + Stereo Стерео @@ -82,7 +82,7 @@ CollapsibleWidget - + <untitled> <без названия> @@ -90,7 +90,7 @@ ColorButton - + Set Color Установить цвет @@ -98,27 +98,27 @@ CornerPinEffect - + Top Left Вверху слева - + Top Right Вверху справа - + Bottom Left Внизу слева - + Bottom Right Внизу справа - + Perspective Перспектива @@ -126,7 +126,7 @@ DebugDialog - + Debug Log Журнал отладки @@ -134,23 +134,23 @@ DemoNotice - - + + Welcome to Olive! Приветствуем в Olive! - + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. Это свободный нелинейный видеоредактор с открытым исходным кодом под лицензией GNU GPL. Если вы заплатили за эту программу, скорее всего вас обманули. - + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 На текущий момент программа находится на стадии альфы, т.е. она нестабильна, может часто падать и не иметь нужных вам функций. Мы не даём никаких гарантий, используйте на свой страх и риск. Сообщения об ошибках и запросы на новые функции мы принимаем здесь: %1 - + Thank you for trying Olive and we hope you enjoy it! Спасибо за интерес к Olive. Надеемся, что программа вам понравится! @@ -158,89 +158,89 @@ Effect - + Invalid effect Некорректный эффект - + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - + Cu&t В&ырезать - + &Copy &Скопировать - + Move &Up &Поднять - + Move &Down &Опустить - + D&elete &Удалить - + Load Settings From File Загрузить параметры из файла - + Save Settings to File Сохранить параметры в файл - + Save Effect Settings Сохранить параметры эффекта - - + + Effect XML Settings %1 Файлы с параметрами эффектов %1 - + Save Settings Failed Не удалось сохранить параметры - + Failed to open "%1" for writing. Не удалось открыть "%1" для записи. - + Load Effect Settings Загрузить параметры эффекта - - + + Load Settings Failed Не удалось загрузить параметры - + Failed to open "%1" for reading. Не удалось открыть "%1" для чтения. - + This settings file doesn't match this effect. Это файлс параметрами совсем другого эффекта. @@ -248,47 +248,47 @@ EffectControls - + Effects: Эффекты: - + &Paste &Вставить - + Add Video Effect Добавить видеоэффект - + VIDEO EFFECTS ВИДЕОЭФФЕКТЫ - + Add Video Transition Добавить видеопереход - + Add Audio Effect Добавить аудиоэффект - + AUDIO EFFECTS АУДИОЭФФЕКТЫ - + Add Audio Transition Добавить аудиопереход - + (Multiple clips selected) (Выделено больше одного клипа) @@ -296,12 +296,12 @@ EffectRow - + Disable Keyframes Отключить ключевые кадры - + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? Отключение приведёт к удалению всех текущих ключевых кадров. Вы уверены? @@ -309,7 +309,7 @@ EmbeddedFileChooser - + File: Файл: @@ -317,98 +317,98 @@ ExportDialog - + Export "%1" Экспортировать "%1" - + Unknown codec name %1 - + Export Failed Не удалось экспортировать - + Export failed - %1 Не удалось экспортировать — %1 - + Invalid dimensions Некорректный размер кадра - + Export width and height must both be even numbers/divisible by 2. Ширина и высота кадра при экспорте должны делиться на 2 без остатка. - + Invalid codec Некорректный кодек - + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - + Invalid format Некорректный формат - + Couldn't determine output format. This is a bug, please contact the developers. - + Export Media Экспортировать проект - + Quality-based (Constant Rate Factor) Качество (Constant Rate Factor) - + Constant Bitrate Постоянная скорость потока - - + + Invalid Codec Некорректный кодек - + Failed to find a suitable encoder for this codec. Export will likely fail. Не удалось найти подходящий кодировщик для этого кодека. Экспорт не гарантирован. - + Failed to find pixel format for this encoder. Export will likely fail. - + Bitrate (Mbps): Скорость потока (Мбит/с): - + Quality (CRF): Качество (CRF): - + Quality Factor: 0 = lossless @@ -423,73 +423,78 @@ 51 = самое низкое качество - + Target File Size (MB): Конечный размер файла (Мб): - + Format: Формат: - + Range: Диапазон: - + Entire Sequence Вся последовательность - + In to Out От входа от выхода - + Video Видео - - + + Codec: Кодек: - + Width: Ширина: - + Height: Высота: - + Frame Rate: Частота кадров: - + Compression Type: Тип сжатия: - + Advanced Дополнительно - + + Audio + Звук + + + Sampling Rate: Частота дискретизации: - + Bitrate (Kbps/CBR): Скорость потока (Кбит/с / CBR): @@ -497,87 +502,87 @@ ExportThread - + failed to send frame to encoder (%1) - + failed to receive packet from encoder (%1) - + could not video encoder for %1 - + could not allocate video stream - + could not allocate video encoding context - + could not open output video encoder (%1) - + could not copy video encoder parameters to output stream (%1) - + could not audio encoder for %1 - + could not allocate audio stream - + could not allocate audio encoding context - + could not open output audio encoder (%1) - + could not copy audio encoder parameters to output stream (%1) - + could not allocate audio buffer (%1) - + could not create output format context - + could not open output file (%1) - + could not write output file header (%1) - + could not write output file trailer (%1) @@ -585,40 +590,40 @@ FillLeftRightEffect - + Type Тип - + Fill Left with Right - + Заполнить левый канал правым - + Fill Right with Left - + Заполнить правый канал левым Frei0rEffect - + Failed to load Frei0r plugin "%1": %2 Не удалось загрузить плагшин Frei0r "%1": %2 - + NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. Вы не можете загружать 32-разрядные плагины Frei0r в 64-разрядный Olive. Найдите 64-разрядную версию этого плагина или установите 32-разрядную сборку Olive. - + NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. Вы не можете загружать 64-разрядные плагины Frei0r в 32-разрядный Olive. Найдите 32-разрядную версию этого плагина или установите 64-разрядную сборку Olive. - + Error loading Frei0r plugin Ошибка при загрузке плагина Frei0r @@ -626,22 +631,22 @@ GraphEditor - + Graph Editor Редактор графов - + Linear Линейный - + Bezier Безье - + Hold Константа @@ -649,17 +654,17 @@ GraphView - + Zoom to Selection Масштабировать в выделение - + Zoom to Show All Масштабировать и показать всё - + Reset View Сбросить масштаб @@ -667,30 +672,30 @@ InterlacingName - + None (Progressive) - Нет (прогрессивно) + Нет (прогрессивно) - + Top Field First - + Bottom Field First - + Invalid - Некорректный + Некорректно KeyframeNavigator - + Enable Keyframes Включить ключевые кадры @@ -698,17 +703,17 @@ KeyframeView - + Linear Линейный - + Bezier Безье - + Hold Константа @@ -716,14 +721,14 @@ LabelSlider - - + + Set Value Установить значение - - + + New value: Новое значение: @@ -731,17 +736,17 @@ LoadDialog - + Loading... Загрузка… - + Loading '%1'... Загружается '%1'... - + Cancel Отмена @@ -749,52 +754,52 @@ LoadThread - + Version Mismatch Несовпадение версий - + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? Этот проект был сохранён в другой версии Olive, которая неполностью совместима с установленной у вас. Всё-таки попробовать загрузить? - + Invalid Clip Link Некорректная связь клипов - + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? В проекте обнаружена некорректная связь клипов. Всё-таки попробовать загрузить её? - + %1 - Line: %2 Col: %3 - + User aborted loading Пользователь прервал загрузку - + XML Parsing Error Ошибка разбора XML - + Couldn't load '%1'. %2 Не удалось загрузить '%1'. %2 - + Project Load Error Ошибка при загрузке проекта - + Error loading project: %1 Ошибка при загрузке проекта: %1 @@ -802,711 +807,520 @@ MainWindow - + Welcome to %1 Приветствуем в %1 - - Auto-recovery - Автовосстановление - - - - Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - Olive аварийно завершил работу, обнаружен файл автовосстановления. Открыть его? - - - - &Project - &Проект - - - - &Sequence - П&оследовательность - - - - &Folder - П&апка - - - - Set In Point - Установить точку входа - - - - Set Out Point - Установить точку выхода - - - Enable/Disable In/Out Point - Переключить точку входа/выхода - - - - Reset In Point - Сбросить точку входа - - - - Reset Out Point - Сбросить точку выхода - - - - Clear In/Out Point - Очистить точку входа/выхода - - - - No active sequence - Нет активных последовательностей - - - - Please open the sequence you wish to export. - Откройте последовательность, которую хотите экспортировать - - - - Save Project As... - Сохранить проект как… - - - - Unsaved Project - Несохранённый проект - - - - This project has changed since it was last saved. Would you like to save it before closing? - Проект был изменён с момента последнего сохранения. Хотите сохранить его перед закрытием? - - - + &File &Файл - + &New &Создать - + &Open Project &Открыть проект - + Clear Recent List Очистить список - + Open Recent Открыть недавний - + &Save Project Со&хранить проект - + Save Project &As Сохранить проект &как - + &Import... &Импортировать… - + &Export... &Экспортировать…. - + E&xit В&ыход - + &Edit &Правка - + &Undo &Отменить - + Redo Вернуть - - Cu&t - В&ырезать - - - - Cop&y - С&копировать - - - - &Paste - &Вставить - - - - Paste Insert - - - - - Duplicate - Сделать копию - - - - Delete - Удалить - - - - Ripple Delete - Удалить со сдвигом - - - - Split - Разделить - - - + Select &All Выд&елить всё - + Deselect All Снять выделение - - Add Default Transition - Добавить переход по умолчанию - - - - Link/Unlink - Связать/Убрать связь - - - - Enable/Disable - Включить/Отключить - - - - Nest - Вложить - - - + Ripple to In Point Сдвиг до точки входа - + Ripple to Out Point Сдвиг до точки выхода - + Edit to In Point Правка до точки входа - + Edit to Out Point Правка до точки выхода - + Delete In/Out Point Удалить точку входа/выхода - + Ripple Delete In/Out Point Удалить со сдвигом точку входа/выхода - + Set/Edit Marker Установить/Изменить маркер - + &View &Вид - + Zoom In Приблизить - + Zoom Out Отдалить - + Increase Track Height Увеличить высоту дорожки - + Decrease Track Height Уменьшить высоту дорожки - + Toggle Show All Показывать весь проект - + Track Lines Линии дорожек - + Rectified Waveforms Волновая форма от низа - + Frames Кадры - + Drop Frame С пропуском кадров - + Non-Drop Frame Без пропуска кадров - + Milliseconds Миллисекунды - + Title/Action Safe Area Безопасная область - + Off Выкл. - + Default По умолчанию - + 4:3 4:3 - + 16:9 16:9 - + Custom Другая - + Full Screen Полноэкранный режим - + Full Screen Viewer - Монитор в полноэкранном режиме + Просмотр в полноэкранном режиме - + &Playback Вос&произведение - + Go to Start К началу - + Previous Frame К предыдущему кадру - + Play/Pause Воспроизведение/Пауза - + Play In to Out Проиграть от входа до выхода - + Next Frame К следующему кадру - + Go to End В конец - + Go to Previous Cut - + Go to Next Cut - + Go to In Point К точке входа - + Go to Out Point К точке выхода - + Shuttle Left Уменьшить скорость - + Shuttle Stop Пауза - + Shuttle Right Увеличить скорость - Decrease Speed - Уменьшить скорость - - - Pause - Пауза - - - Increase Speed - Увеличить скорость - - - + Loop Петля - + &Window &Окно - + Project Проект - + Effect Controls Управление эффектами - + Timeline - Таймлайн + Монтажный стол - + Graph Editor Редактор графов - + Media Viewer - Монитор проекта + Просмотр проекта - + Sequence Viewer - Монитор последовательностей + Просмотр последовательностей - + Maximize Panel Развернуть панель - + Reset to Default Layout Вернуть исходный вид панелей - + &Tools &Инструменты - + Pointer Tool Указатель - + Edit Tool Выделение - + Ripple Tool Монтаж со сдвигом - + Razor Tool Подрезка - + Slip Tool Прокрутка с совмещением - + Slide Tool Прокрутка - + Hand Tool Навигация - + Transition Tool Переход - + Enable Snapping Включить прилипание - + Selecting Also Seeks Выделение с перемоткой - + Edit Tool Also Seeks Выделение с перемоткой - + Edit Tool Selects Links Выделение выбирает связи - + Seek Also Selects Перемотка с выделением - + Seek to the End of Pastes Перемотка до конца вставок - + Scroll Wheel Zooms - Колесо мыши масштабирует таймлайн + Колесо мыши масштабирует монтажный стол - + Enable Drag Files to Timeline - Разрешить перетаскивание на таймлайн извне + Разрешить перетаскивание на монтажный стол извне - + Auto-Scale By Default Автоматически масштабировать по умолчанию - + Enable Seek to Import - + Audio Scrubbing Воспроизводить звук при прокрутке - + Enable Drop on Media to Replace - + Enable Hover Focus Включить фокус наводкой - + Ask For Name When Setting Marker Спрашивать имя маркера при добавлении - + No Auto-Scroll Без автопрокрутки - + Page Auto-Scroll Прокручивать перелистыванием - + Smooth Auto-Scroll Прокручивать плавно - + Preferences Параметры - + Clear Undo Очистить историю изменений - + &Help &Справка - + A&ction Search &Найти команду - + Debug Log Журнал отладки - + &About... &О программе… - + <untitled> <без названия> - - - Open Project... - Открыть проект… - - - - Missing recent project - Отсутствует недавний проект - - - - The project '%1' no longer exists. Would you like to remove it from the recent projects list? - Проект '%1' больше не существует. Удалить его из списка недавних? - - - - Invalid aspect ratio - Некорректное соотношение сторон - - - - The aspect ratio '%1' is invalid. Please try again. - - - - - Enter custom aspect ratio - Введите другое соотношение сторон - - - - Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - - - - - Nested Sequence - Вложенная последовательность - Marker - + Set Marker Установить маркер - + Set clip marker name: Название маркера клипа: - + Set sequence marker name: Название маркера последовательности: @@ -1514,56 +1328,52 @@ Media - + New Folder Новая папка - + Name: Название: - + Filename: Имя файла: - + Video Dimensions: Размер кадров: - + Frame Rate: Частота кадров: - %1 fields (%2 frames) - полей: %1 (кадров: %2) - - - + %1 field(s) (%2 frame(s)) полей: %1 (кадров: %2) - + Interlacing: Чересстрочность: - + Audio Frequency: Частота звука: - + Audio Channels: Звуковых каналов: - + Name: %1 Video Dimensions: %2x%3 Frame Rate: %4 @@ -1576,17 +1386,17 @@ Audio Layout: %6 Звуковые каналы: %6 - + Name Название - + Duration Длительность - + Rate Частота @@ -1594,31 +1404,27 @@ Audio Layout: %6 MediaPropertiesDialog - + "%1" Properties Свойства "%1" - + Tracks: Дорожек: - + Video %1: %2x%3 %4FPS Видео %1: %2x%3 %4к/с - Audio %1: %2Hz %3 channels - Звук %1: %2Гц %3 каналов - - - + Audio %1: %2Hz %3 - + %n channel(s) %n канал @@ -1627,163 +1433,354 @@ Audio Layout: %6 - + Conform to Frame Rate: - + Alpha is Premultiplied - + Auto (%1) Авто (%1) - + Interlacing: Чересстрочность: - + Name: Название: + + MenuHelper + + + &Project + &Проект + + + + &Sequence + П&оследовательность + + + + &Folder + П&апка + + + + Set In Point + Установить точку входа + + + + Set Out Point + Установить точку выхода + + + + Reset In Point + Сбросить точку входа + + + + Reset Out Point + Сбросить точку выхода + + + + Clear In/Out Point + Очистить точку входа/выхода + + + + Add Default Transition + Добавить переход по умолчанию + + + + Link/Unlink + Связать/Убрать связь + + + + Enable/Disable + Включить/Отключить + + + + Nest + Вложить + + + + Cu&t + В&ырезать + + + + Cop&y + С&копировать + + + + &Paste + &Вставить + + + + Paste Insert + + + + + Duplicate + Сделать копию + + + + Delete + Удалить + + + + Ripple Delete + Удалить со сдвигом + + + + Split + Разделить + + + + Invalid aspect ratio + Некорректное соотношение сторон + + + + The aspect ratio '%1' is invalid. Please try again. + + + + + Enter custom aspect ratio + Введите другое соотношение сторон + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + + + NewSequenceDialog - + Editing "%1" Правка "%1" - + New Sequence Новая последовательность - + Preset: Предстановка: - + Film 4K Кино 4К - + TV 4K (Ultra HD/2160p) TV 4K (Ultra HD/2160p) - + 1080p 1080p - + 720p 720p - + 480p 480p - + 360p 360p - + 240p 240p - + 144p 144p - + NTSC (480i) NTSC (480i) - + PAL (576i) PAL (576i) - + Custom Другое - + Video Видео - + Width: Ширина: - + Height: Высота: - + Frame Rate: Частота кадров: - + Pixel Aspect Ratio: Соотношение сторон пикселя: - + Square Pixels (1.0) Квадратные пиксели (1.0) - + Interlacing: Чересстрочность: - + None (Progressive) Нет (прогрессивно) - + Audio Звук - + Sample Rate: Частота дискретизации: - + Name: Название: + + OliveGlobal + + + Olive Project %1 + Проект Olive %1 + + + + Auto-recovery + Автовосстановление + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + Olive аварийно завершил работу, обнаружен файл автовосстановления. Открыть его? + + + + Open Project... + Открыть проект… + + + + Missing recent project + Отсутствует недавний проект + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + Проект '%1' больше не существует. Удалить его из списка недавних? + + + + Save Project As... + Сохранить проект как… + + + + Unsaved Project + Несохранённый проект + + + + This project has changed since it was last saved. Would you like to save it before closing? + Проект был изменён с момента последнего сохранения. Хотите сохранить его перед закрытием? + + + + No active sequence + Нет активных последовательностей + + + + Please open the sequence you wish to export. + Откройте последовательность, которую хотите экспортировать + + + + Missing Project File + Отсутствует проектный файл + + + + Specified project '%1' does not exist. + Указанный проект '%1' не существует. + + PanEffect - + Pan Панорама @@ -1791,7 +1788,7 @@ Audio Layout: %6 Playback - + Generating Proxy: %1% Создаётся прокси: %1% @@ -1799,289 +1796,275 @@ Audio Layout: %6 PreferencesDialog - + Preferences Параметры - + Invalid CSS File Некорректный файл CSS - + CSS file '%1' does not exist. Файл CSS '%1' не существует. - - Warning - Предупреждение - - - - Some changed settings will require restarting Olive to take effect - Некоторые изменения параметров вступят в силу только при следующем запуске Olive - - - + Confirm Reset All Shortcuts Подтвердите действие - + Are you sure you wish to reset all keyboard shortcuts to their defaults? Вы действительно хотите сбросить все клавиатурные комбинации к исходным значениям? - + Import Keyboard Shortcuts Импортировать клавиатурные комбинации - - + + Error saving shortcuts Ошибка при сохранении клавиатурных комбинаций - + Failed to open file for reading Не удалось открыть файл для чтения - + Export Keyboard Shortcuts Экспортировать клавиатурные комбинации - + Export Shortcuts Экспортировать клавиатурные комбинации - + Shortcuts exported successfully Комбинации успешно экспортированы - + Failed to open file for writing Не удалось открыть файл для записи - + Browse for CSS file Указать файл CSS - + Delete All Previews Удалить все миниатюры - + Are you sure you want to delete all previews? Действительно удалить все миниатюры? - + Previews Deleted Миниатюры удалены - + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. Все миниатюры успешно удалены. Возможно, понадобится заново открыть проект, чтобы изменения вступили в силу. - + Language: Язык: - + Custom CSS: Свой CSS: - + Browse Просмотр - + Image sequence formats: Форматы изображений: - + Audio Recording: Запись звука: - + Mono Моно - + Stereo Стерео - + Effect Textbox Lines: Строк в редакторе титров: - + Thumbnail Resolution: Разрешение миниатюр: - + Waveform Resolution: Разрешение волновой формы: - + Delete Previews Удалить миниатюры - + Use Software Fallbacks When Possible По возможности использовать программную реализацию вместо аппаратной - + General Общие - + Behavior Поведение - Disable Multithreading on Images - Отключить многопоточность для изображений - - - + Seeking Позиционирование - + Accurate Seeking Always show the correct frame (visual may pause briefly as correct frame is retrieved) Точное позиционирование Всегда показывать правильный кадр; на его получение может уходить немного времени - + Fast Seeking Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) Быстрое позиционирование -Переходы без пауз, возможен кратковременный показ неправильного кадра в мониторе +Переходы без пауз, возможен кратковременный показ неправильного кадра в просмотре - + Memory Usage Использование памяти - + Upcoming Frame Queue: Очередь последующих кадров: - - + + frames кадров - - + + seconds секунд - + Previous Frame Queue: Очередь предыдущих кадров: - + Playback Воспроизведение - + Output Device: Устройство выхода: - - + + Default По умолчанию - + Input Device: Устройство входа: - + Sample Rate: Частота дискретизации: - + Audio Звук - + Search for action or shortcut Искать действие или комбинацию клавиш - + Action Действие - + Shortcut Комбинация - + Import Импортировать - + Export Экспортировать - + Reset Selected Сбросить выбранное - + Reset All Сбросить все - + Keyboard Клавиатурные комбинации @@ -2089,12 +2072,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff PreviewGenerator - + Could not open file - %1 Не удалось открыть файл — %1 - + Could not find stream information - %1 Не удалось найти информацию потока — %1 @@ -2102,94 +2085,94 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Project - + Search media, markers, etc. Искать файлы, маркеры и т.д. - + Project Проект - + Sequence Последовательность - + Replace '%1' Заменить '%1' - - + + All Files Все файлы - - + + No active sequence Нет активных последовательностей - + No sequence is active, please open the sequence you want to replace clips from. Нет активных последовательностей. Откройте последовательность, в которой хотите заменить клипы. - + Active sequence selected Выбрана активная последовательность - + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. Вы не можете вставить последовательность в саму себя, так что клипы из этих файлов не могут попасть в эту последовательность. - + Rename '%1' Переименовать '%1' - + Enter new name: Введите новое название: - + Delete media in use? Удалить используемые в проекте файлы? - + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? Файл '%1' уже используется в '%2'. Его удаление приведет к удалению всех его копий в выбранной последовательности. Вы точно этого хотите? - + Skip Пропустить - + Image sequence detected Обнаружена последовательность изображений - + The file '%1' appears to be part of an image sequence. Would you like to import it as such? Похоже, что файл '%1' яавляется частью последовательности изображений. Загрузить его как таковой? - + Import media... Импортировать медиафайлы… - + No sequence is active, please open the sequence you want to delete clips from. Нет активных последовательностей. Откройте последовательность, из которой хотите удалить клипы. @@ -2197,77 +2180,77 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff ProxyDialog - + Create Proxy Создать прокси - + Proxy Прокси - + Dimensions: Размер: - + Same Size as Source В размере оригинала - + Half Resolution (1/2) Половина оригинала (1/2) - + Quarter Resolution (1/4) Четверть оригинала (1/4) - + Eighth Resolution (1/8) Восьмая оригинала (1/8) - + Sixteenth Resolution (1/16) Шестнадцатая оригинала (1/16) - + Format: Формат: - + ProRes HQ ProRes HQ - + Location: Размещение: - + Same as Source (in "%1" folder) Как в исходнике (в папке «%1») - + Proxy file exists Прокси-файл уже существует - + The file "%1" already exists. Do you wish to replace it? Файл «%1» уже существует. Заменить его? - + Custom Location Другое размещение @@ -2275,7 +2258,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff ProxyGenerator - + Finished generating proxy for "%1" Завершено создание прокси для "%1" @@ -2283,67 +2266,67 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff ReplaceClipMediaDialog - + Replace clips using "%1" Заменить клипы данными "%1" - + Select which media you want to replace this media's clips with: Выберите файлы, которые хотите заменить клипы с этими файлами: - + Keep the same media in-points Сохранить существующие точки входа - + Replace Заменить - + Cancel Отмена - + No media selected Файлы не выбраны - + Please select a media to replace with or click 'Cancel'. - Выборите файлы для замены или нажмите кнопку «Отмена». + Выберите файлы для замены или нажмите кнопку «Отмена». - + Same media selected Выбраны те же самые файлы - + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. Вы выбрали те же файлы, которые хотите заменить. Выберите что-то другое или нажмите кнопку «Отмена». - + Folder selected Папка выбрана - + You cannot replace footage with a folder. Вы не можете заменить видеосъёмку папкой. - + Active sequence selected Выбрана активная последовательность - + You cannot insert a sequence into itself. Вы не можете вставить последовательность в саму себя. @@ -2351,7 +2334,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Sequence - + %1 (copy) %1 (копия) @@ -2359,17 +2342,17 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff ShakeEffect - + Intensity Интенсивность - + Rotation Вращение - + Frequency Частота @@ -2377,37 +2360,37 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff SolidEffect - + Type Тип - + Solid Color Сплошная заливка - + SMPTE Bars Таблица SMPTE - + Checkerboard Шахматная доска - + Opacity Непрозрачность - + Color Цвет - + Checkerboard Size Размер клеток @@ -2415,137 +2398,137 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff SourcesCommon - + Import... Импортировать… - + New Создать - + View Вид - + Tree View В виде таблицы - + Icon View В виде миниатюр - + Show Toolbar Показывать панель - + Show Sequences Показывать последовательности - + Replace/Relink Media Заменить/пересвязать файлы - + Reveal in Explorer Открыть в Проводнике - + Reveal in Finder Открыть в Finder - + Reveal in File Manager Открыть в файловом менеджере - + Replace Clips Using This Media Заменить клипы с этими файлами - + Create Sequence With This Media Создать последовательность с этими файлами - + Duplicate Создать копию - + Delete All Clips Using This Media Удалить все клипы с этим файлом - + Proxy Прокси - + Generating proxy: %1% complete Создание прокси: завершено на %1% - + Create/Modify Proxy Создать/Изменить прокси - + Create Proxy Создать прокси - + Modify Proxy Изменить прокси - + Restore Original Восстановить оригинал - + Delete Удалить - + Properties... Свойства… - + Replace Media Заменить файлы - + You dropped a file onto '%1'. Would you like to replace it with the dropped file? - + Delete proxy Удалить прокси - + Would you like to delete the proxy file "%1" as well? Заодно удалить прокси-файл "%1"? @@ -2553,37 +2536,37 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff SpeedDialog - + Speed/Duration Скорость/длительность - + Speed: Скорость: - + Frame Rate: Частота кадров: - + Duration: Длительность: - + Reverse Реверс - + Maintain Audio Pitch Сохранять высоту тона - + Ripple Changes Изменять со сдвигом @@ -2591,7 +2574,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TextEditDialog - + Edit Text Изменить текст @@ -2599,113 +2582,113 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TextEffect - + Text Текст - + Font Шрифт - + Size Кегль - + Color Цвет - + Alignment Выравнивание - + Left Слева - - + + Center По центру - + Right Справа - + Justify По ширине - + Top Сверху - + Bottom Снизу - + Word Wrap Перенос строки - + Outline Обводка - + Outline Color Цвет обводки - + Outline Width Толщина обводки - + Shadow Тень - + Shadow Color Цвет тени - + Shadow Distance Длина тени - + Shadow Softness Мягкость тени - + Shadow Opacity Непрозрачность тени - + Sample Text Образец текста - + &Edit Text &Изменить текст @@ -2713,47 +2696,47 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TimecodeEffect - + Timecode Тайм-код - + Sequence Последовательность - + Media Файл - + Scale Масштаб - + Color Цвет - + Background Color Цвет фона - + Background Opacity Непрозрачность фона - + Offset Смещение - + Prepend Префикс @@ -2761,159 +2744,152 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Timeline - + Timeline: - Таймлайн: + Монтажный стол: - + <none> <нет> - + Effect already exists Эффект уже добавлен - + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? Клип '%1' уже содержит эффект '%2'. Хотите заменить его на вставляемый эффект или добавить вставляемый эффект как отдельный? - + Add Добавить - + Replace Заменить - + Skip Пропустить - + Do this for all conflicts found Применить для всех конфликтов - Set Marker - Установить маркер + + Nested Sequence + Вложенная последовательность - Set clip marker name: - Установить название маркера клипа: - - - Set sequence marker name: - Установить название маркера последовательности: - - - + Title... Титры… - + Solid Color... Цветная заливка… - + Bars... Испытательная таблица… - + Tone... Звуковой сигнал… - + Noise... Шум… - + Unsaved Project Несохранённый проект - + You must save this project before you can record audio in it. Перед записью звука необходимо сохранить проект. - + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - Щелкните на таймлайне в точке, от которой хотите начать запись звука. Перетащите курсор после щелчка, чтобы сразу задать длительность записи. + Щелкните на монтажном столе в точке, от которой хотите начать запись звука. Перетащите курсор после щелчка, чтобы сразу задать длительность записи. - + Pointer Tool Указатель - + Edit Tool Выделение - + Ripple Tool Монтаж со сдвигом - + Razor Tool Подрезка - + Slip Tool Прокрутка с совмещением - + Slide Tool Прокрутка - + Hand Tool Навигация - + Transition Tool Переход - + Snapping Прилипание - + Zoom In Приблизить - + Zoom Out Отдалить - + Record audio Записать звук - + Add title, solid, bars, etc. Добавить титры, заливку цветом, испытательную таблицу и т.д. @@ -2921,7 +2897,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TimelineHeader - + Center Timecodes Центрировать тайм-код @@ -2929,77 +2905,62 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TimelineWidget - + &Undo &Отменить - + &Redo В&ернуть - + C&ut В&ырезать - + Cop&y С&копировать - + &Paste &Вставить - + R&ipple Delete Уда&лить со сдвигом - + Sequence Settings Параметры последовательности - + &Speed/Duration С&корость/Длительность - + Auto-s&cale Авто&масштабирование - - Enable/Disable - Включить/Отключить - - - - Link/Unlink - Связать/Убрать связь - - - - &Nest - Вло&жить - - - + &Reveal in Project &Показать в проекте - + R&ename Пере&именовать - + %1 Start: %2 End: %3 @@ -3010,57 +2971,57 @@ Duration: %4 Длительность: %4 - + Rename '%1' Переименовать '%1' - + Rename multiple clips Переименовать клипы - + Enter a new name for this clip: Новое название этого клипа: - + Error Ошибка - + Couldn't locate media wrapper for sequence. - + Title Титры - + Solid Color Цветная заливка - + Bars Испытательная таблица - + Tone Звуковой сигнал - + Noise Шум - + Duration: Длительность: @@ -3068,22 +3029,22 @@ Duration: %4 ToneEffect - + Type Тип - + Frequency Частота - + Amount Количество - + Mix Смешать @@ -3091,157 +3052,157 @@ Duration: %4 TransformEffect - + Position Позиция - + Scale Масштаб - + Uniform Scale Сохранять пропорции - + Rotation Вращение - + Anchor Point Точка привязки - + Opacity Непрозрачность - + Blend Mode Режим смешивания - + Normal Обычный - + Darken Замена темным - + Multiply Умножение - + Color Burn Затемнение основы - + Linear Burn Линейное затемнение - + Lighten Замена светлым - + Screen Экран - + Color Dodge Осветление основы - + Linear Dodge (Add) Линейное осветление (+) - + Overlay Перекрытие - + Soft Light Рассеянный свет - + Hard Light Направленный свет - + Vivid Light Яркий свет - + Linear Light Линейный свет - + Pin Light Точечный свет - + Hard Mix Жесткое смешение - + Difference Разница - + Exclusion Исключение - + Reflect Отражение - + Substract Вычитание - + Average Среднее - + Glow Свечение - + Negation Отрицание - + Phoenix Феникс @@ -3249,11 +3210,7 @@ Duration: %4 Transition - Length: - Длительность: - - - + Length Длительность @@ -3261,64 +3218,64 @@ Duration: %4 VSTHost - - - + + + Error loading VST plugin Ошибка при загрузке плагина VST - + Failed to create VST reference - + Failed to load VST plugin "%1": %2 - + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - + Failed to locate entry point for dynamic library. - + VST Error - + Ошибка VST - + Plugin's magic number is invalid - + Plugin Плагин - + Interface Интерфейс - + Show Показать - + VST Plugin Плагин VST @@ -3326,17 +3283,17 @@ Duration: %4 Viewer - + Sequence Viewer - Монитор последовательностей + Просмотр последовательностей - + Media Viewer - Монитор проекта + Просмотр проекта - + (none) (нет) @@ -3344,57 +3301,57 @@ Duration: %4 ViewerWidget - + Save Frame as Image... Сохранить кадр как изображение… - + Show Fullscreen Полноэкранный режим - + Disable Отключить - + Screen %1: %2x%3 Экран %1: %2×%3 - + Zoom Масштаб - + Fit Уместить - + Custom Другой - + Close Media Закрыть файл - + Save Frame Сохранить кадр - + Viewer Zoom Масштаб просмотра - + Set Custom Zoom Value: Другое значение масштаба: @@ -3402,7 +3359,7 @@ Duration: %4 ViewerWindow - + Exit Fullscreen Выйти из полноэкранного режима @@ -3410,12 +3367,12 @@ Duration: %4 VoidEffect - + (unknown) (неизвестно) - + Missing Effect Отсутствующий эффект @@ -3423,7 +3380,7 @@ Duration: %4 VolumeEffect - + Volume Громкость @@ -3431,12 +3388,12 @@ Duration: %4 transition - + Invalid transition Некорректный переход - + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. From 23a43aba3e45a71a95950c318ab164f5f8dd4a2f Mon Sep 17 00:00:00 2001 From: Jonathan Noble Date: Sat, 16 Feb 2019 22:27:28 +0000 Subject: [PATCH 6/6] Removed 5 duplicated blocks of code. https://sonarcloud.io/project/issues?id=jonno85uk_olive&issues=AWjXpEv0EzgCzR11xzeI&open=AWjXpEv0EzgCzR11xzeI (cherry picked from commit 64bb2e7cdfac36a69e380a3c0ad5c25b97b4402f) # Conflicts: # app/debug.cpp --- debug.cpp | 115 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 64 insertions(+), 51 deletions(-) diff --git a/debug.cpp b/debug.cpp index 70b605938..58e6f04ec 100644 --- a/debug.cpp +++ b/debug.cpp @@ -34,63 +34,76 @@ QFile debug_file; QTextStream debug_stream; void open_debug_file() { - QDir debug_dir = QStandardPaths::writableLocation(QStandardPaths::CacheLocation); - debug_dir.mkpath("."); - if (debug_dir.exists()) { - debug_file.setFileName(debug_dir.path() + "/debug_log"); - if (debug_file.open(QFile::WriteOnly)) { - debug_stream.setDevice(&debug_file); - } else { - qWarning() << "Couldn't open debug log file, debug log will not be saved"; - } - } + QDir debug_dir = QStandardPaths::writableLocation(QStandardPaths::CacheLocation); + debug_dir.mkpath("."); + if (debug_dir.exists()) { + debug_file.setFileName(debug_dir.path() + "/debug_log"); + if (debug_file.open(QFile::WriteOnly)) { + debug_stream.setDevice(&debug_file); + } else { + qWarning() << "Couldn't open debug log file, debug log will not be saved"; + } + } } -void close_debug_file() { - if (debug_file.isOpen()) debug_file.close(); +void close_debug_file() +{ + if (debug_file.isOpen()) { + debug_file.close(); + } } -void debug_message_handler(QtMsgType type, const QMessageLogContext &context, const QString &msg) { - debug_mutex.lock(); - QByteArray localMsg = msg.toLocal8Bit(); - switch (type) { - case QtDebugMsg: - fprintf(stderr, "[DEBUG] %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); - if (debug_file.isOpen()) debug_stream << QString("[DEBUG] %1 (%2:%3, %4)\n").arg(localMsg.constData(), context.file, QString::number(context.line), context.function); - debug_info.append(QString("[DEBUG] %1 (%2:%3, %4)
").arg(localMsg.constData(), context.file, QString::number(context.line), context.function)); - fflush(stderr); - break; - case QtInfoMsg: - fprintf(stderr, "[INFO] %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); - if (debug_file.isOpen()) debug_stream << QString("[INFO] %1 (%2:%3, %4)\n").arg(localMsg.constData(), context.file, QString::number(context.line), context.function); - debug_info.append(QString("[INFO] %1 (%2:%3, %4)
").arg(localMsg.constData(), context.file, QString::number(context.line), context.function)); - fflush(stderr); - break; - case QtWarningMsg: - fprintf(stderr, "[WARNING] %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); - if (debug_file.isOpen()) debug_stream << QString("[WARNING] %1 (%2:%3, %4)\n").arg(localMsg.constData(), context.file, QString::number(context.line), context.function); - debug_info.append(QString("[WARNING] %1 (%2:%3, %4)
").arg(localMsg.constData(), context.file, QString::number(context.line), context.function)); - fflush(stderr); - break; - case QtCriticalMsg: - fprintf(stderr, "[ERROR] %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); - if (debug_file.isOpen()) debug_stream << QString("[ERROR] %1 (%2:%3, %4)\n").arg(localMsg.constData(), context.file, QString::number(context.line), context.function); - debug_info.append(QString("[ERROR] %1 (%2:%3, %4)
").arg(localMsg.constData(), context.file, QString::number(context.line), context.function)); - fflush(stderr); - break; - case QtFatalMsg: - fprintf(stderr, "[FATAL] %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); - if (debug_file.isOpen()) debug_stream << QString("[FATAL] %1 (%2:%3, %4)\n").arg(localMsg.constData(), context.file, QString::number(context.line), context.function); - debug_info.append(QString("[FATAL] %1 (%2:%3, %4)
").arg(localMsg.constData(), context.file, QString::number(context.line), context.function)); - fflush(stderr); -// abort(); - } +void debug_message_handler(QtMsgType type, const QMessageLogContext &context, const QString &msg) +{ + debug_mutex.lock(); + const QByteArray localMsg = msg.toLocal8Bit(); + const QDateTime now = QDateTime::currentDateTime(); + const QByteArray timeRepr(now.toString(Qt::ISODate).toLocal8Bit()); + QString msgTag; + QString fontColor; + switch (type) { + case QtDebugMsg: + msgTag = "DEBUG"; + fontColor = "grey"; + break; + case QtInfoMsg: + msgTag = "INFO"; + fontColor = "blue"; + break; + case QtWarningMsg: + msgTag = "WARNING"; + fontColor = "yellow"; + break; + case QtCriticalMsg: + msgTag = "ERROR"; + fontColor = "red"; + break; + case QtFatalMsg: + msgTag = "FATAL"; + fontColor = "red"; + break; + default: + fprintf(stderr, "Unknown debug msg type"); + fflush(stderr); + break; + }//switch + + fprintf(stderr, "%s [%s] %s (%s:%u, %s)\n", timeRepr.data(), msgTag.toLocal8Bit().constData(), localMsg.data(), + context.file, context.line, context.function); + if (debug_file.isOpen()) { + debug_stream << QString("[%1] %2 (%3:%4, %5)\n") + .arg(msgTag, localMsg, context.file, QString::number(context.line), context.function); + } + debug_info.prepend(QString("[%2] %3 (%4:%5, %6)
") + .arg(fontColor, msgTag, localMsg, context.file, QString::number(context.line), context.function)); + fflush(stderr); if (Olive::DebugDialog != nullptr && Olive::DebugDialog->isVisible()) { QMetaObject::invokeMethod(Olive::DebugDialog, "update_log", Qt::QueuedConnection); - } - debug_mutex.unlock(); + } + debug_mutex.unlock(); } -const QString &get_debug_str() { - return debug_info; +const QString &get_debug_str() +{ + return debug_info; }