From 2f4597678cee569ffe811d8a36249aa43cbdbe7e Mon Sep 17 00:00:00 2001 From: Alexandre Prokoudine Date: Tue, 26 Mar 2019 15:49:42 +0300 Subject: [PATCH 1/9] Update Russian translation --- ts/olive_ru.ts | 1895 ++++++++++++++++++++++++++---------------------- 1 file changed, 1015 insertions(+), 880 deletions(-) diff --git a/ts/olive_ru.ts b/ts/olive_ru.ts index 6681c8106..c9662aaef 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... Найти действие… @@ -43,12 +43,12 @@ Audio - + %1 Audio - + Recording %1 Запись %1 @@ -61,11 +61,48 @@ Количество - + Mix Смешивание + + AutoCutSilenceDialog + + + Cut Silence + Вырезать тишину + + + + Attack Threshold: + Порог атаки: + + + + Attack Time: + Время атаки: + + + + Release Threshold: + Порог восстановления: + + + + Release Time: + Время восстановления: + + + + Cacher + + + + Could not open %1 - %2 + Не удалось открыть %1 - %2 + + ChannelLayoutName @@ -115,7 +152,7 @@ CollapsibleWidget - + <untitled> <без названия> @@ -123,7 +160,7 @@ ColorButton - + Set Color Установить цвет @@ -131,27 +168,27 @@ CornerPinEffect - + Top Left Вверху слева - + Top Right Вверху справа - + Bottom Left Внизу слева - + Bottom Right Внизу справа - + Perspective Перспектива @@ -191,89 +228,54 @@ 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. Это файлс параметрами совсем другого эффекта. @@ -281,73 +283,116 @@ EffectControls - + Effects: Эффекты: - - &Paste - &Вставить - - - + (none) (нет) - + Add Video Effect Добавить видеоэффект - + VIDEO EFFECTS ВИДЕОЭФФЕКТЫ - + Add Video Transition Добавить видеопереход - + Add Audio Effect Добавить аудиоэффект - + AUDIO EFFECTS АУДИОЭФФЕКТЫ - + Add Audio Transition Добавить аудиопереход - - - (Multiple clips selected) - (Выделено больше одного клипа) - EffectRow - + Disable Keyframes Отключить ключевые кадры - + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? Отключение приведёт к удалению всех текущих ключевых кадров. Вы уверены? + + EffectUI + + + %1 (Opening) + %1 (открывается) + + + + %1 (Closing) + %1 (закрывается) + + + + %1 (multiple) + %1 (больше одного) + + + + Cu&t + В&ырезать + + + + &Copy + &Скопировать + + + + Move &Up + &Поднять + + + + Move &Down + &Опустить + + + + D&elete + &Удалить + + + + Load Settings From File + Загрузить параметры из файла + + + + Save Settings to File + Сохранить параметры в файл + + EmbeddedFileChooser - + File: Файл: @@ -355,108 +400,108 @@ 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 Экспортировать проект - + %p% (Total: %1:%2:%3) %p% (Итого: %1:%2:%3) - + %p% (ETA: %1:%2:%3) %p% (Осталось: %1:%2:%3) - + 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 @@ -471,78 +516,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): @@ -550,87 +595,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) @@ -656,22 +701,12 @@ 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 @@ -679,22 +714,22 @@ GraphEditor - + Graph Editor Редактор графов - + Linear Линейный - + Bezier Безье - + Hold Константа @@ -702,17 +737,17 @@ GraphView - + Zoom to Selection Масштабировать в выделение - + Zoom to Show All Масштабировать и показать всё - + Reset View Сбросить масштаб @@ -743,7 +778,7 @@ KeyframeNavigator - + Enable Keyframes Включить ключевые кадры @@ -751,17 +786,17 @@ KeyframeView - + Linear Линейный - + Bezier Безье - + Hold Константа @@ -779,14 +814,14 @@ С&бросить до исходного - - + + Set Value Установить значение - - + + New value: Новое значение: @@ -812,52 +847,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 %1 - Строка: %2 Столбец: %3 - + User aborted loading Пользователь прервал загрузку - + XML Parsing Error Ошибка разбора XML - + Couldn't load '%1'. %2 Не удалось загрузить '%1'. %2 - + Project Load Error Ошибка при загрузке проекта - + Error loading project: %1 Ошибка при загрузке проекта: %1 @@ -865,517 +900,447 @@ MainWindow - + Welcome to %1 Приветствуем в %1 - + &File &Файл - + &New &Создать - + &Open Project &Открыть проект - + Clear Recent List Очистить список - + Open Recent Открыть недавний - + &Save Project Со&хранить проект - + Save Project &As Сохранить проект &как - + &Import... &Импортировать… - + &Export... - &Экспортировать…. + &Экспортировать… - + E&xit В&ыход - + &Edit &Правка - + &Undo &Отменить - + Redo Вернуть - + Select &All Выд&елить всё - + Deselect All Снять выделение - + 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 Увеличить скорость - + Loop Петля - + &Window &Окно - + Project Проект - + Effect Controls Управление эффектами - + Timeline Монтажный стол - + Graph Editor Редактор графов - + Media Viewer Просмотр проекта - + Sequence Viewer Просмотр последовательностей - + Maximize Panel Развернуть панель - + Lock Panels Закрепить панели - + 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 - Выделение с перемоткой + + Auto-Cut Silence + Вырезать тишину - - Edit Tool Also Seeks - Выделение с перемоткой - - - - Edit Tool Selects Links - Выделение выбирает связи - - - - Seek Also Selects - Перемотка с выделением - - - - Seek to the End of Pastes - Перемотка до конца вставок - - - - Scroll Wheel Zooms - Колесо мыши масштабирует монтажный стол - - - - Hold CTRL to toggle this setting - - - - - Invert Timeline Scroll Axes - - - - - 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> <без названия> @@ -1383,17 +1348,17 @@ Marker - + Set Marker Установить маркер - + Set clip marker name: Название маркера клипа: - + Set sequence marker name: Название маркера последовательности: @@ -1401,52 +1366,52 @@ Media - + New Folder Новая папка - + Name: Название: - + Filename: Имя файла: - + Video Dimensions: Размер кадров: - + Frame Rate: Частота кадров: - + %1 field(s) (%2 frame(s)) полей: %1 (кадров: %2) - + Interlacing: Чересстрочность: - + Audio Frequency: Частота звука: - + Audio Channels: Звуковых каналов: - + Name: %1 Video Dimensions: %2x%3 Frame Rate: %4 @@ -1459,17 +1424,17 @@ Audio Layout: %6 Звуковые каналы: %6 - + Name Название - + Duration Длительность - + Rate Частота @@ -1477,27 +1442,27 @@ Audio Layout: %6 MediaPropertiesDialog - + "%1" Properties Свойства "%1" - + Tracks: Дорожек: - + Video %1: %2x%3 %4FPS Видео %1: %2x%3 %4к/с - + Audio %1: %2Hz %3 Звук %1: %2Гц %3 - + %n channel(s) %n канал @@ -1506,27 +1471,27 @@ Audio Layout: %6 - + Conform to Frame Rate: - + Alpha is Premultiplied Предумноженный альфа-канал - + Auto (%1) Авто (%1) - + Interlacing: Чересстрочность: - + Name: Название: @@ -1534,122 +1499,123 @@ Audio Layout: %6 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): Введите соотношение сторон для этой безопасной области (например, 16:9) @@ -1657,127 +1623,127 @@ Audio Layout: %6 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: Название: @@ -1785,67 +1751,77 @@ Audio Layout: %6 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. - Откройте последовательность, которую хотите экспортировать + + Please open the sequence to perform this action. + Откройте последовательность для выполнения этого действия. - + + No clips selected + Клипы не выделены + + + + Select the clips you wish to auto-cut + Выделите клипы, в которых надо вырезать тишину + + + Missing Project File Отсутствует проектный файл - + Specified project '%1' does not exist. Указанный проект '%1' не существует. @@ -1858,285 +1834,389 @@ Audio Layout: %6 Панорама - - Playback - - Generating Proxy: %1% - Создаётся прокси: %1% - - PreferencesDialog - + Preferences Параметры - + + Default Sequence + Последовательности по умолчанию + + + Invalid CSS File Некорректный файл CSS - + CSS file '%1' does not exist. Файл CSS '%1' не существует. - + 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: Язык: - + + Default Sequence Settings + + + + + Add Default Effects to New Clips + Добавлять эффекты по умолчанию в новые клипы + + + + Automatically Seek to the Beginning When Playing at the End of a Sequence + + + + + Selecting Also Seeks + Выделение с перемоткой + + + + Edit Tool Also Seeks + Выделение с перемоткой + + + + Edit Tool Selects Links + Выделение выбирает связи + + + + Seek Also Selects + Перемотка с выделением + + + + Seek to the End of Pastes + Перемотка до конца вставок + + + + Scroll Wheel Zooms + Колесо мыши масштабирует монтажный стол + + + + Hold CTRL to toggle this setting + + + + + Invert Timeline Scroll Axes + + + + + Enable Drag Files to Timeline + Разрешить перетаскивание на монтажный стол извне + + + + Auto-Scale By Default + Автоматически масштабировать по умолчанию + + + + Auto-Seek to Imported Clips + + + + + Audio Scrubbing + Воспроизводить звук при прокрутке + + + + Drop Files on Media to Replace + + + + + Enable Hover Focus + Включить фокус наводкой + + + + Ask For Name When Setting Marker + Спрашивать имя маркера при добавлении + + + + Appearance + Внешний вид + + + + Theme + Тема + + + + Olive Dark (Default) + Olive Dark (по умолчанию) + + + + Olive Light + Olive Light + + + + Native + Системная + + + + Native (Light Icons) + Системная со светлыми значками + + + + Use Native Menu Styling + + + + 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 Поведение - - 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 Клавиатурные комбинации @@ -2144,17 +2224,17 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff PreviewGenerator - + Failed to find any valid video/audio streams - + Could not open file - %1 Не удалось открыть файл — %1 - + Could not find stream information - %1 Не удалось найти информацию потока — %1 @@ -2162,104 +2242,144 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Project - + + New + Создать + + + + Open Project + Открыть проект + + + + Save Project + Сохранить проект + + + + Undo + Отменить + + + + Redo + Вернуть + + + + Tree View + В виде дерева + + + + Icon View + В виде миниатюр + + + + List View + В виде списка + + + 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 Пропустить - + Import a Project Импортировать проект - + "%1" is an Olive project file. It will merge with this project. Do you wish to continue? "%1" является проектом Olive и будет добавлен в этот проект. Продолжить? - + 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. Нет активных последовательностей. Откройте последовательность, из которой хотите удалить клипы. @@ -2267,77 +2387,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 Другое размещение @@ -2345,7 +2465,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff ProxyGenerator - + Finished generating proxy for "%1" Завершено создание прокси для "%1" @@ -2418,10 +2538,108 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Вы не можете вставить последовательность в саму себя. + + RichTextEffect + + + Text + Текст + + + + Padding + Отступ + + + + Position + Позиция + + + + Vertical Align: + Верт. выравнивание: + + + + Top + Сверху + + + + Center + По центру + + + + Bottom + Снизу + + + + Auto-Scroll + Автопрокрутка + + + + Off + Выкл. + + + + Up + Вверх + + + + Down + Вниз + + + + Left + Влево + + + + Right + Вправо + + + + Shadow + Тень + + + + Shadow Color + Цвет тени + + + + Shadow Angle + Угол тени + + + + Shadow Distance + Длина тени + + + + Shadow Softness + Мягкость тени + + + + Shadow Opacity + Непрозрачность тени + + Sequence - + %1 (copy) %1 (копия) @@ -2429,7 +2647,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff ShakeEffect - + Intensity Интенсивность @@ -2439,7 +2657,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Вращение - + Frequency Частота @@ -2447,7 +2665,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff SolidEffect - + Type Тип @@ -2472,12 +2690,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Непрозрачность - + Color Цвет - + Checkerboard Size Размер клеток @@ -2485,142 +2703,142 @@ 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 Удалить - + Preview in Media Viewer - + Properties... Свойства… - + Replace Media Заменить файлы - + You dropped a file onto '%1'. Would you like to replace it with the dropped file? Вы бросили файл в '%1'. Заменить на брошенное? - + Delete proxy Удалить прокси - + Would you like to delete the proxy file "%1" as well? Заодно удалить прокси-файл "%1"? @@ -2628,37 +2846,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 Изменять со сдвигом @@ -2666,20 +2884,78 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TextEditDialog - + Edit Text Изменить текст + + + Thin + + + + + Extra Light + + + + + Light + + + + + Normal + Обычный + + + + Medium + + + + + Demi Bold + + + + + Bold + + + + + Extra Bold + + + + + Black + + + + + TextEditEx + + + Edit Text + Изменить текст + + + + &Edit Text + &Изменить текст + TextEffect - + Text Текст - + Font Шрифт @@ -2689,151 +2965,156 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Кегль - + Color Цвет - + Alignment Выравнивание - + Left Слева - - + + Center По центру - + Right Справа - + Justify По ширине - + Top Сверху - + Bottom Снизу - + Word Wrap Перенос строки - + + Padding + Отступ + + + + Position + Позиция + + + Outline Обводка - + Outline Color Цвет обводки - + Outline Width Толщина обводки - + Shadow Тень - + Shadow Color Цвет тени - + Shadow Angle Угол тени - + Shadow Distance Длина тени - + Shadow Softness Мягкость тени - + Shadow Opacity Непрозрачность тени - + Sample Text Образец текста - - - &Edit Text - &Изменить текст - TimecodeEffect - + Timecode Тайм-код - + Sequence Последовательность - + Media Файл - + Scale Масштаб - + Color Цвет - + Background Color Цвет фона - + Background Opacity Непрозрачность фона - + Offset Смещение - + Prepend Префикс @@ -2841,156 +3122,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 Применить для всех конфликтов - + Nested Sequence Вложенная последовательность - + 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. Добавить титры, заливку цветом, испытательную таблицу и т.д. - + (none) (нет) @@ -2998,7 +3275,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TimelineHeader - + Center Timecodes Центрировать тайм-код @@ -3006,66 +3283,37 @@ 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 - Авто&масштабирование - - - + &Reveal in Project &Показать в проекте - + Properties Свойства - R&ename - Пере&именовать - - - + %1 Start: %2 End: %3 @@ -3076,54 +3324,57 @@ Duration: %4 Длительность: %4 - Rename '%1' - Переименовать '%1' + + R&ipple Delete Empty Space + &Удалить со сдвигом пустое пространство - Rename multiple clips - Переименовать клипы + + Auto-Cut Silence + Вырезать тишину - Enter a new name for this clip: - Новое название этого клипа: + + Auto-S&cale + Авто&масштабирование - + Error Ошибка - + Couldn't locate media wrapper for sequence. - + Title Титры - + Solid Color Цветная заливка - + Bars Испытательная таблица - + Tone Звуковой сигнал - + Noise Шум - + Duration: Длительность: @@ -3131,22 +3382,27 @@ Duration: %4 ToneEffect - + Type Тип + + + Sine + Синусоида + Frequency Частота - + Amount Количество - + Mix Смешать @@ -3159,160 +3415,45 @@ Duration: %4 Позиция - + 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 - Феникс - Transition - + Length Длительность @@ -3328,64 +3469,48 @@ 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 @@ -3393,75 +3518,85 @@ Duration: %4 Viewer - + Sequence Viewer Просмотр последовательностей - + Media Viewer Просмотр проекта - + (none) (нет) + + + Drag video only + Перетаскивать только видео + + + + Drag audio only + Перетаскивать только звук + 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: Другое значение масштаба: @@ -3469,7 +3604,7 @@ Duration: %4 ViewerWindow - + Exit Fullscreen Выйти из полноэкранного режима @@ -3477,12 +3612,12 @@ Duration: %4 VoidEffect - + (unknown) (неизвестно) - + Missing Effect Отсутствующий эффект @@ -3498,12 +3633,12 @@ Duration: %4 transition - + Invalid transition Некорректный переход - + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. From a5feb151e38b3a893f61c8e96872b7180507dba6 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 28 Mar 2019 19:47:59 +1100 Subject: [PATCH 2/9] fixed #710 --- olive.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/olive.pro b/olive.pro index 9adf6c8b9..ae945bd11 100644 --- a/olive.pro +++ b/olive.pro @@ -35,7 +35,7 @@ system("which git") { GITPATH = $$system(cygpath $$PWD) } - GITHASHVAR = $$system(git --git-dir="$$GITPATH/.git" --work-tree="$$GITPATH" log -1 --format=%h) + GITHASHVAR = $$system(git --git-dir=\"$$GITPATH/.git\" --work-tree=\"$$GITPATH\" log -1 --format=%h) # Fallback for Ubuntu/Launchpad (extracts Git hash from debian/changelog rather than Git repo) # (see https://answers.launchpad.net/launchpad/+question/678556) From be219f317dd72605a9fed3beb92c8c149cb15338 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 29 Mar 2019 01:07:05 +1100 Subject: [PATCH 3/9] some ui improvements --- debian/control | 2 +- ui/keyframenavigator.cpp | 6 ++++++ ui/sourceiconview.cpp | 2 +- ui/timelineheader.cpp | 4 ++++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/debian/control b/debian/control index c156631bf..092cc89ab 100644 --- a/debian/control +++ b/debian/control @@ -8,6 +8,6 @@ Homepage: https://olivevideoeditor.org/ Package: olive-editor Architecture: any -Depends: ${misc:Depends}, ${shlibs:Depends}, libqt5multimedia5-plugins, frei0r-plugins +Depends: ${misc:Depends}, ${shlibs:Depends}, libqt5multimedia5-plugins Description: Nonlinear video editor focused on performance and simplicity diff --git a/ui/keyframenavigator.cpp b/ui/keyframenavigator.cpp index 9a60dd4cc..ec1c1b034 100644 --- a/ui/keyframenavigator.cpp +++ b/ui/keyframenavigator.cpp @@ -39,7 +39,11 @@ KeyframeNavigator::KeyframeNavigator(QWidget *parent, bool addLeftPad) : QWidget key_controls->addStretch(); } + QSizePolicy button_size_policy; + button_size_policy.setRetainSizeWhenHidden(true); + left_key_nav = new QPushButton(this); + left_key_nav->setSizePolicy(button_size_policy); left_key_nav->setIcon(olive::icon::LeftArrow); left_key_nav->setIconSize(left_key_nav->iconSize()*0.5); left_key_nav->setVisible(false); @@ -48,6 +52,7 @@ KeyframeNavigator::KeyframeNavigator(QWidget *parent, bool addLeftPad) : QWidget connect(left_key_nav, SIGNAL(clicked(bool)), this, SIGNAL(clicked())); key_addremove = new QPushButton(this); + key_addremove->setSizePolicy(button_size_policy); key_addremove->setIcon(olive::icon::Diamond); key_addremove->setIconSize(key_addremove->iconSize()*0.5); key_addremove->setVisible(false); @@ -56,6 +61,7 @@ KeyframeNavigator::KeyframeNavigator(QWidget *parent, bool addLeftPad) : QWidget connect(key_addremove, SIGNAL(clicked(bool)), this, SIGNAL(clicked())); right_key_nav = new QPushButton(this); + right_key_nav->setSizePolicy(button_size_policy); right_key_nav->setIcon(olive::icon::RightArrow); right_key_nav->setIconSize(right_key_nav->iconSize()*0.5); right_key_nav->setVisible(false); diff --git a/ui/sourceiconview.cpp b/ui/sourceiconview.cpp index e8fbf0fbd..60bd06184 100644 --- a/ui/sourceiconview.cpp +++ b/ui/sourceiconview.cpp @@ -98,7 +98,7 @@ SourceIconDelegate::SourceIconDelegate(QObject *parent) : { } -QSize SourceIconDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const +QSize SourceIconDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &) const { if (option.decorationPosition == QStyleOptionViewItem::Top) { // Icon Mode diff --git a/ui/timelineheader.cpp b/ui/timelineheader.cpp index a1779c85d..96c07b66c 100644 --- a/ui/timelineheader.cpp +++ b/ui/timelineheader.cpp @@ -468,6 +468,10 @@ void TimelineHeader::paintEvent(QPaintEvent*) { path.lineTo(in_x+PLAYHEAD_SIZE+1, yoff); path.lineTo(start); p.fillPath(path, Qt::red); + + // Draw white line at the top for clarity + p.setPen(Qt::gray); + p.drawLine(0, 0, width(), 0); } } From 814e048e8f907218921b3f1774592ef89cbbaa48 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 29 Mar 2019 01:24:20 +1100 Subject: [PATCH 4/9] fixed audio only export crash --- rendering/exportthread.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/rendering/exportthread.cpp b/rendering/exportthread.cpp index 239f22b2b..bce22158c 100644 --- a/rendering/exportthread.cpp +++ b/rendering/exportthread.cpp @@ -60,6 +60,7 @@ ExportThread::ExportThread(const ExportParams ¶ms, audio_stream(nullptr), acodec(nullptr), audio_frame(nullptr), + sws_frame(nullptr), swr_frame(nullptr), acodec_ctx(nullptr), swr_ctx(nullptr), From 963a20af37d78f038b69591f7879c84f744c9df2 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 29 Mar 2019 01:59:12 +1100 Subject: [PATCH 5/9] fixed #712 --- panels/viewer.cpp | 19 +++++-------------- panels/viewer.h | 2 -- rendering/audio.cpp | 20 ++++++++++++++++++++ rendering/audio.h | 3 +++ rendering/cacher.cpp | 7 +++++-- rendering/exportthread.cpp | 26 ++++++++++++++++++++++++-- rendering/exportthread.h | 4 ++++ rendering/renderfunctions.cpp | 27 --------------------------- ui/viewerwidget.cpp | 2 +- 9 files changed, 62 insertions(+), 48 deletions(-) diff --git a/panels/viewer.cpp b/panels/viewer.cpp index b91c00d07..76d93f1fb 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -63,7 +63,6 @@ extern "C" { Viewer::Viewer(QWidget *parent) : Panel(parent), playing(false), - just_played_(false), media(nullptr), seq(nullptr), created_sequence(false), @@ -419,7 +418,7 @@ void Viewer::play(bool in_to_out) { playhead_start = seq->playhead; playing = true; - just_played_ = true; + SetAudioWakeObject(this); set_playpause_icon(false); start_msecs = QDateTime::currentMSecsSinceEpoch(); @@ -428,17 +427,14 @@ void Viewer::play(bool in_to_out) { } void Viewer::play_wake() { - if (just_played_) { - start_msecs = QDateTime::currentMSecsSinceEpoch(); - playback_updater.start(); - if (audio_thread != nullptr) audio_thread->notifyReceiver(); - just_played_ = false; - } + start_msecs = QDateTime::currentMSecsSinceEpoch(); + playback_updater.start(); + if (audio_thread != nullptr) audio_thread->notifyReceiver(); } void Viewer::pause() { playing = false; - just_played_ = false; + SetAudioWakeObject(nullptr); set_playpause_icon(true); playback_updater.stop(); playback_speed = 0; @@ -479,11 +475,6 @@ void Viewer::pause() { } } -bool Viewer::WaitingForPlayWake() -{ - return just_played_; -} - void Viewer::update_playhead_timecode(long p) { current_timecode_slider->SetValue(p); } diff --git a/panels/viewer.h b/panels/viewer.h index a96b2a5b6..e4c233d4e 100644 --- a/panels/viewer.h +++ b/panels/viewer.h @@ -71,7 +71,6 @@ public: void seek(long p); void play(bool in_to_out = false); void pause(); - bool WaitingForPlayWake(); bool playing; long playhead_start; qint64 start_msecs; @@ -145,7 +144,6 @@ private: double minimum_zoom; bool playing_in_to_out; long last_playhead; - bool just_played_; void set_zoom_value(double d); void set_sb_max(); void set_playback_speed(int s); diff --git a/rendering/audio.cpp b/rendering/audio.cpp index 02fdbf150..b27e73a98 100644 --- a/rendering/audio.cpp +++ b/rendering/audio.cpp @@ -401,3 +401,23 @@ void combobox_audio_sample_rates(QComboBox *combobox) { combobox->addItem("88200 Hz", 88200); combobox->addItem("96000 Hz", 96000); } + +QObject* audio_wake_object = nullptr; +QMutex audio_wake_mutex; + +QObject* GetAudioWakeObject() +{ + audio_wake_mutex.lock(); + + QObject* wake_object = audio_wake_object; + audio_wake_object = nullptr; + + audio_wake_mutex.unlock(); + + return wake_object; +} + +void SetAudioWakeObject(QObject *o) +{ + audio_wake_object = o; +} diff --git a/rendering/audio.h b/rendering/audio.h index 2a3488b53..42af7975d 100644 --- a/rendering/audio.h +++ b/rendering/audio.h @@ -65,6 +65,9 @@ extern bool audio_rendering; extern int audio_rendering_rate; void clear_audio_ibuffer(); +QObject *GetAudioWakeObject(); +void SetAudioWakeObject(QObject* o); + int current_audio_freq(); bool is_audio_device_set(); diff --git a/rendering/cacher.cpp b/rendering/cacher.cpp index ad79b7463..1b793c186 100644 --- a/rendering/cacher.cpp +++ b/rendering/cacher.cpp @@ -460,8 +460,11 @@ void Cacher::CacheAudioWorker() { } } - QMetaObject::invokeMethod(panel_footage_viewer, "play_wake", Qt::QueuedConnection); - QMetaObject::invokeMethod(panel_sequence_viewer, "play_wake", Qt::QueuedConnection); + // If there's a QObject waiting for audio to be rendered, wake it now + QObject* audio_wake_object = GetAudioWakeObject(); + if (audio_wake_object != nullptr) { + QMetaObject::invokeMethod(audio_wake_object, "play_wake", Qt::QueuedConnection); + } } bool Cacher::IsReversed() diff --git a/rendering/exportthread.cpp b/rendering/exportthread.cpp index bce22158c..abb8e837e 100644 --- a/rendering/exportthread.cpp +++ b/rendering/exportthread.cpp @@ -217,6 +217,8 @@ bool ExportThread::SetupVideo() { } bool ExportThread::SetupAudio() { + // if video is disabled, no setup necessary + if (!params_.audio_enabled) return true; // Find encoder for this codec acodec = avcodec_find_encoder(static_cast(params_.audio_codec)); @@ -375,12 +377,12 @@ void ExportThread::Export() } // If video is enabled, set it up in the container now - if (params_.video_enabled && !SetupVideo()) { + if (!SetupVideo()) { return; } // If audio is enabled, set it up in the container now - if (params_.audio_enabled && !SetupAudio()) { + if (!SetupAudio()) { return; } @@ -423,6 +425,8 @@ void ExportThread::Export() // If we're exporting audio, run compose_audio() which will write mixed audio to the internal audio buffer if (params_.audio_enabled) { + waiting_for_audio_ = true; + SetAudioWakeObject(this); olive::rendering::compose_audio(nullptr, olive::ActiveSequence.get(), 1, true); } @@ -486,6 +490,13 @@ void ExportThread::Export() // If we're exporting audio, copy audio from the buffer into an AVFrame for encoding if (params_.audio_enabled) { + if (waiting_for_audio_) { + waitCond.wait(&mutex); + } + + // Make sure nothing is writing while we're retrieving + audio_write_lock.lock(); + // Check if the count of encoded samples exceeds the current Sequence playhead, in which case we don't need to // encode any audio at this moment while (!interrupt_ && file_audio_samples <= (timecode_secs*params_.audio_sampling_rate)) { @@ -520,6 +531,9 @@ void ExportThread::Export() // Increment by the frame's number of samples file_audio_samples += swr_frame->nb_samples; } + + audio_write_lock.unlock(); + } // Generating encoding statistics (e.g. the time it took to encode this frame/estimated remaining time) @@ -674,6 +688,14 @@ void ExportThread::Interrupt() interrupt_ = true; } +void ExportThread::play_wake() +{ + mutex.lock(); + waiting_for_audio_ = false; + waitCond.wakeAll(); + mutex.unlock(); +} + void ExportThread::wake() { mutex.lock(); waitCond.wakeAll(); diff --git a/rendering/exportthread.h b/rendering/exportthread.h index 3db7288ed..328221727 100644 --- a/rendering/exportthread.h +++ b/rendering/exportthread.h @@ -82,6 +82,8 @@ signals: void ProgressChanged(int value, qint64 remaining_ms); public slots: void Interrupt(); + + void play_wake(); private: bool Encode(AVFormatContext* ofmt_ctx, AVCodecContext* codec_ctx, AVFrame* frame, AVPacket* packet, AVStream* stream); bool SetupVideo(); @@ -124,6 +126,8 @@ private: QWaitCondition waitCond; QString export_error; + + bool waiting_for_audio_; private slots: void wake(); }; diff --git a/rendering/renderfunctions.cpp b/rendering/renderfunctions.cpp index 25db7e8f9..889474e79 100644 --- a/rendering/renderfunctions.cpp +++ b/rendering/renderfunctions.cpp @@ -600,17 +600,6 @@ GLuint olive::rendering::compose_sequence(ComposeSequenceParams ¶ms) { // == END FINAL DRAW ON SEQUENCE BUFFER == } - // prepare gizmos - /* - if ((*params.gizmos) != nullptr - && params.nests.isEmpty() - && ((*params.gizmos) == first_gizmo_effect - || (*params.gizmos) == selected_effect)) { - (*params.gizmos)->gizmo_draw(timecode, coords); // set correct gizmo coords - (*params.gizmos)->gizmo_world_to_screen(); // convert gizmo coords to screen coords - } - */ - glPopMatrix(); } } else { @@ -631,22 +620,6 @@ GLuint olive::rendering::compose_sequence(ComposeSequenceParams ¶ms) { } } - - /* - // visually update all the keyframe values - if (c->sequence == params.seq) { // only if you can currently see them - double ts = (playhead - c->timeline_in(true) + c->clip_in(true))/s->frame_rate; - for (int i=0;ieffects.size();i++) { - EffectPtr 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); - } - } - } - } - */ } } else { params.texture_failed = true; diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index b00081370..fa95624cf 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -229,7 +229,7 @@ void ViewerWidget::frame_update() { } // render the audio - olive::rendering::compose_audio(viewer, viewer->seq.get(), viewer->get_playback_speed(), viewer->WaitingForPlayWake()); + olive::rendering::compose_audio(viewer, viewer->seq.get(), viewer->get_playback_speed(), false); } } From f47a7dad4da816137ce94ae3c2cd2edfd46e0999 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 29 Mar 2019 03:32:54 +1100 Subject: [PATCH 6/9] fixed #713 --- panels/panels.cpp | 4 ++++ rendering/audio.cpp | 9 +++++++++ rendering/audio.h | 1 + rendering/cacher.cpp | 5 +---- rendering/renderfunctions.cpp | 4 ++-- ui/timelineheader.cpp | 4 ++-- 6 files changed, 19 insertions(+), 8 deletions(-) diff --git a/panels/panels.cpp b/panels/panels.cpp index dbb22481a..3c4a2d057 100644 --- a/panels/panels.cpp +++ b/panels/panels.cpp @@ -113,6 +113,10 @@ void free_panels() { } void scroll_to_frame_internal(QScrollBar* bar, long frame, double zoom, int area_width) { + if (bar->value() == bar->minimum() || bar->value() == bar->maximum()) { + return; + } + int screen_point = getScreenPointFromFrame(zoom, frame) - bar->value(); int min_x = area_width*0.1; int max_x = area_width-min_x; diff --git a/rendering/audio.cpp b/rendering/audio.cpp index b27e73a98..183479683 100644 --- a/rendering/audio.cpp +++ b/rendering/audio.cpp @@ -419,5 +419,14 @@ QObject* GetAudioWakeObject() void SetAudioWakeObject(QObject *o) { + audio_wake_mutex.lock(); audio_wake_object = o; + audio_wake_mutex.unlock(); +} + +void WakeAudioWakeObject() { + QObject* audio_wake_object = GetAudioWakeObject(); + if (audio_wake_object != nullptr) { + QMetaObject::invokeMethod(audio_wake_object, "play_wake", Qt::QueuedConnection); + } } diff --git a/rendering/audio.h b/rendering/audio.h index 42af7975d..4721766cf 100644 --- a/rendering/audio.h +++ b/rendering/audio.h @@ -67,6 +67,7 @@ void clear_audio_ibuffer(); QObject *GetAudioWakeObject(); void SetAudioWakeObject(QObject* o); +void WakeAudioWakeObject(); int current_audio_freq(); diff --git a/rendering/cacher.cpp b/rendering/cacher.cpp index 1b793c186..a4df18c65 100644 --- a/rendering/cacher.cpp +++ b/rendering/cacher.cpp @@ -461,10 +461,7 @@ void Cacher::CacheAudioWorker() { } // If there's a QObject waiting for audio to be rendered, wake it now - QObject* audio_wake_object = GetAudioWakeObject(); - if (audio_wake_object != nullptr) { - QMetaObject::invokeMethod(audio_wake_object, "play_wake", Qt::QueuedConnection); - } + WakeAudioWakeObject(); } bool Cacher::IsReversed() diff --git a/rendering/renderfunctions.cpp b/rendering/renderfunctions.cpp index 889474e79..c4c45fcd2 100644 --- a/rendering/renderfunctions.cpp +++ b/rendering/renderfunctions.cpp @@ -630,8 +630,8 @@ GLuint olive::rendering::compose_sequence(ComposeSequenceParams ¶ms) { } } - if (audio_track_count == 0 && params.viewer != nullptr) { - params.viewer->play_wake(); + if (audio_track_count == 0) { + WakeAudioWakeObject(); } if (params.video) { diff --git a/ui/timelineheader.cpp b/ui/timelineheader.cpp index 96c07b66c..f39065b4f 100644 --- a/ui/timelineheader.cpp +++ b/ui/timelineheader.cpp @@ -67,9 +67,9 @@ TimelineHeader::TimelineHeader(QWidget *parent) : in_visible(0), fm(font()), dragging_markers(false), - scroll(0) + scroll(0), + height_actual(fm.height()) { - height_actual = fm.height(); setCursor(Qt::ArrowCursor); setMouseTracking(true); setFocusPolicy(Qt::ClickFocus); From ce047dd60f70b31150551e78def2bdb0e70366d4 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 29 Mar 2019 11:02:58 +1100 Subject: [PATCH 7/9] normalized debug message order --- global/debug.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global/debug.cpp b/global/debug.cpp index b64e38ecd..87d892f2c 100644 --- a/global/debug.cpp +++ b/global/debug.cpp @@ -97,7 +97,7 @@ void debug_message_handler(QtMsgType type, const QMessageLogContext &context, co 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)
") + debug_info.append(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()) { From 00e86a4eeba1e171b97be4cfbd8ce2a5829a13a4 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 29 Mar 2019 11:26:20 +1100 Subject: [PATCH 8/9] fixed #693 --- olive.pro | 8 ++++---- ui/effectui.cpp | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/olive.pro b/olive.pro index ae945bd11..f0732106f 100644 --- a/olive.pro +++ b/olive.pro @@ -48,10 +48,6 @@ system("which git") { CONFIG += c++11 -CONFIG(debug, debug|release) { - CONFIG += console -} - SOURCES += \ main.cpp \ ui/mainwindow.cpp \ @@ -324,6 +320,10 @@ TRANSLATIONS += \ ts/olive_id.ts win32 { + CONFIG(debug, debug|release) { + CONFIG += console + } + RC_FILE = packaging/windows/resources.rc LIBS += -lavutil -lavformat -lavcodec -lavfilter -lswscale -lswresample -lopengl32 -luser32 contains(DEFINES, OLIVE_OCIO) { diff --git a/ui/effectui.cpp b/ui/effectui.cpp index 53da884fc..c47f08c9f 100644 --- a/ui/effectui.cpp +++ b/ui/effectui.cpp @@ -66,6 +66,7 @@ EffectUI::EffectUI(Effect* e) : SetTitle(effect_name); QWidget* ui = new QWidget(this); + ui->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); SetContents(ui); SetExpanded(e->IsExpanded()); From a581d36bcc830bf81bcb2526596b0d0ff44e7768 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 29 Mar 2019 15:44:19 +1100 Subject: [PATCH 9/9] added user path for effects --- global/path.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/global/path.cpp b/global/path.cpp index c69d35d35..95403bb6a 100644 --- a/global/path.cpp +++ b/global/path.cpp @@ -79,6 +79,9 @@ QList get_effects_paths() { // folder in share folder - best for Linux effects_paths.append(app_dir.filePath("../share/olive-editor/effects")); + // user path - best for linux + effects_paths.append(QDir(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation)).filePath("effects")); + // Olive will also accept a manually provided folder with an environment variable QString env_path(qgetenv("OLIVE_EFFECTS_PATH")); if (!env_path.isEmpty()) effects_paths.append(env_path);