diff --git a/NEWS.md b/NEWS.md index aeceb7b..165f8c7 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,19 @@ +Version 2.3: +- Added support for slideshow mode. +- Improved support for image file formats, including MPO. +- Added new capabilities to `--vr-screen` for easy configuration of two-screen + stereo setups. +- Made `--opengles` the default on ARM platforms. +- Lowered minimum Qt version to 6.4. +- Lowered minimum OpenGL ES requirements. + +Version 2.2: +- Added support for capturing windows and screens. +- Added support for HighDPI output. +- Added support for 3D HDMI frame-pack output mode. +- Improved performance in multi-host/multi-GPU Virtual Reality setups. +- Improved compatibility for various OpenGL implementations. + Version 2.1: - Added support for loading/saving/editing play lists, with loop modes off/one/all. diff --git a/doc/bino-manual.md b/doc/bino-manual.md index 7fec9d5..43b35d1 100644 --- a/doc/bino-manual.md +++ b/doc/bino-manual.md @@ -131,6 +131,18 @@ Bino is a video player with a focus on 3D and Virtual Reality: Choose subtitle track via its index. Can be empty. +- `-p`, `--playlist` *file* + + Load playlist. + +- `-l`, `--loop` *mode* + + Set loop mode (off, one, all). + +- `-w`, `--wait` *mode* + + Set wait mode (off, on). + - `-i`, `--input` *mode* Set input mode (mono, top-bottom, top-bottom-half, bottom-top, @@ -180,6 +192,29 @@ Most output modes should be self explanatory, but there are some exceptions: - `even-odd-rows`, `even-odd-columns` and `checkerboard` are for (older) 3D TVs. +# File Name Conventions + +Bino currently cannot detect the stereoscopic layout or the surround video mode +from metadata because Qt does not provide that information. It therefore has to +guess. + +Bino recognizes the following hints at the last part of the file name, just +before the file name extension (.ext): + +- `*-tb.ext`, `*-ab.ext`: Input mode `top-bottom` +- `*-tbh.ext`, `*-abq.ext`: Input mode `top-bottom-half` +- `*-bt.ext`, `*-ba.ext`: Input mode `bottom-top` +- `*-bth.ext`, `*-baq.ext`: Input mode `bottom-top-half` +- `*-lr.ext`: Input mode `left-right` +- `*-lrh.ext`, `*-lrq.ext`: Input mode `left-right-half` +- `*-rl.ext`: Input mode `right-left` +- `*-rlh.ext`, `*-rlq.ext`: Input mode `right-left-half` +- `*-2d.ext`: Input mode `mono` + +Additionally, if the number `180` or `360` is part of the file name and separated +by neighboring digits or letters by other characters, then the corresponding surround +mode is assumed. + # Scripting Bino can read commands from a script file and execute them via the option @@ -216,6 +251,10 @@ The following commands are supported: Stop playing. +- `playlist-load` *playlist.m3u* + + Load the playlist. + - `playlist-next` Switch to next playlist entry. @@ -224,6 +263,10 @@ The following commands are supported: Switch to previous playlist entry. +- `playlist-wait` *mode* + + Set wait mode (off, on). + - `playlist-loop` *mode* Set loop mode (off, one, all). @@ -280,28 +323,31 @@ The following commands are supported: Toggle fullscreen mode. -# File Name Conventions - -Bino currently cannot detect the stereoscopic layout or the surround video mode -from metadata because Qt does not provide that information. It therefore has to -guess. - -Bino recognizes the following hints at the last part of the file name, just -before the file name extension (.ext): - -- `*-tb.ext`, `*-ab.ext`: Input mode `top-bottom` -- `*-tbh.ext`, `*-abq.ext`: Input mode `top-bottom-half` -- `*-bt.ext`, `*-ba.ext`: Input mode `bottom-top` -- `*-bth.ext`, `*-baq.ext`: Input mode `bottom-top-half` -- `*-lr.ext`: Input mode `left-right` -- `*-lrh.ext`, `*-lrq.ext`: Input mode `left-right-half` -- `*-rl.ext`: Input mode `right-left` -- `*-rlh.ext`, `*-rlq.ext`: Input mode `right-left-half` -- `*-2d.ext`: Input mode `mono` - -Additionally, if the number `180` or `360` is part of the file name and separated -by neighboring digits or letters by other characters, then the corresponding surround -mode is assumed. +# Slideshows + +You can play slideshows of images (or videos) simply by making a playlist and +switching on its *wait* status. This is the default whenever one or more of the +files you open are images instead of videos; this works from the command line +as well as from the GUI. + +With *wait* enabled, the next media in the playlist will only be displayed after +you press the N key, or choose Playlist/Next from the menu. + +For automatic media switching based on predefined presentation times, use the +scripting mode as in the following example: +``` +set-fullscreen on +playlist-load my-slideshow.m3u +playlist-loop on +playlist-wait on +playlist-next +wait 4 +playlist-next +wait 7 +playlist-next +wait 5 +quit +``` # Virtual Reality diff --git a/i18n/bino_de.ts b/i18n/bino_de.ts index b417e86..725598f 100644 --- a/i18n/bino_de.ts +++ b/i18n/bino_de.ts @@ -4,7 +4,7 @@ Bino - + Media player error: %1 Medienwiedergabefehler: %1 @@ -12,49 +12,50 @@ CommandInterpreter - + Cannot open %1: %2 Cannot open %1: %2) Kann %1 nicht öffnen: %2 - - + + Cannot read command from %1 Kann kein Kommando von %1 lesen - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - + + + + + + Invalid argument in %1 line %2 Ungültiges Argument in %1 Zeile %2 - + %1: %2 %1: %2 - + Invalid command %1 line %2 Invalid command %1 Ungültiges Kommando in %1 Zeile %2 @@ -63,7 +64,7 @@ Gui - + &File &Datei @@ -72,7 +73,7 @@ Datei &öffnen... - + Open &URL... &URL öffnen... @@ -81,47 +82,47 @@ &Kamera öffnen... - + &Quit &Beenden - + &Tracks &Spuren - + &Playlist &Wiedergabeliste - + &Load... &Laden... - + &Save... &Speichern... - + &Edit... &Editieren... - + &Next &Nächster Eintrag - + &Previous &Vorheriger Eintrag - + &3D Modes &3D Modi @@ -130,7 +131,7 @@ 360° Modus - + Input 2D Eingabe 2D @@ -259,178 +260,182 @@ Ausgabe Schachbrettmuster - &Open File... - Datei &öffnen... + Datei &öffnen... - + + &Open File(s)... + Datei(en) &amp;öffnen... + + + Open &Capture Device... &Aufnahmegerät öffnen... - + Input 3D above-below Eingabe 3D übereinander - + Input 3D side-by-side Eingabe 3D nebeneinander - + Input 3D alternating Eingabe 3D abwechselnd - + Output 3D side-by-side Ausgabe 3D nebeneinander - + Output 3D above-below Ausgabe 3D übereinander - + Output 3D interleaved Ausgabe 3D verwoben - + Output 3D anaglyph Ausgabe 3D Anaglyph - + &Media &Medium - + Mute audio Ton stumm - + Increase audio volume Ton lauter - + Decrease audio volume Ton leiser - + Pause Pause - + Seek forward 1 second Vorwärts spulen 1 Sekunde - + Seek backwards 1 second Rückwärts spulen 1 Sekunde - + Seek forward 10 seconds Vorwärts spulen 10 Sekunden - + Seek backwards 10 seconds Rückwärts spulen 10 Sekunden - + Seek forward 1 minute Vorwärts spulen 1 Minute - + Seek backwards 1 minute Rückwärts spulen 1 Minute - + Seek forward 10 minutes Vorwärts spulen 10 Minuten - + Seek backwards 10 minutes Rückwärts spulen 10 Minuten - + &View &Ansicht - + &Fullscreen &Vollbild - + &Swap eyes &Augen tauschen - + &Help &Hilfe - + &About... &Über... - - - - - + + + + + Error Fehler - + Open URL Öffne URL - + URL: URL: - - + + Cancel Abbrechen - - + + OK OK - + Open Capture Device Aufnahmegerät öffnen - + Camera Input: Kamera Eingabe: @@ -443,81 +448,81 @@ Video Eingabe: - - + + Default Standard - + Screen Input: Bildschirm Eingabe: - + Window Input: Fenster Eingabe: - + Audio Input: Ton Eingabe: - - + + None Keine - - + + Playlists (*.m3u) Wiedergabelisten (*.m3u) - + About Bino Über Bino - + Bino version %1 Bino Version %1 - + Copyright (C) %1 Martin Lambers Copyright (C) %1 Martin Lambers - + This is free software. You may redistribute copies of it under the terms of the <a href="http://www.gnu.org/licenses/gpl.html">GNU General Public License</a>. There is NO WARRANTY, to the extent permitted by law. Dieses Programm ist freie Software. Sie dürfen Kopien davon weitergeben gemäß der <a href="http://www.gnu.org/licenses/gpl.html">GNU General Public License</a>.Es gibt KEINERLEI GARANTIE, so weit das Gesetz es erlaubt. - + Video track %1 Videospur %1 - - + + (%1) (%1) - + Audio track %1 Tonspur %1 - + No subtitles Keine Untertitel - + Subtitle track %1 Untertitelspur %1 @@ -777,6 +782,16 @@ Loop all Wiederholung alle + + + Wait off + Warten aus + + + + Wait on + Warten an + PlaylistEditor @@ -953,44 +968,43 @@ QCommandLineParser - + 3D video player -- see https://bino3d.org 3D Videoplayer -- siehe https://bino3d.org - + Media to play. Medium zum Abspielen. - + Set log level (%1). Setze Logstufe (%1). - + Set log file. Setze Logdatei. - + Use OpenGL ES instead of Desktop OpenGL. Nutze OpenGL ES statt Desktop OpenGL. - + Use OpenGL quad-buffered stereo in GUI mode. Nutze OpenGL Stereo in der Benutzeroberfläche. - + Start in VR mode instead of GUI mode. Starte im VR Modus statt mit der Benutzerobefläche. - Set VR screen geometry, either as a comma-separated list of nine values representing three 3D coordinates that define a planar screen (bottom left, bottom right, top left) or as a name of an OBJ file that contains the screen geometry with texture coordinates. - Setze die VR Bildschirmgeometrie, entweder als Liste aus neun mit Kommas abgegrenzten Werten die drei 3D Koordinaten repräsentieren welche einen flachen Bildschirm definieren (unten links, unten rechts, oben links) oder als Name einer OBJ Datei die die Bildschirmgeometrie und Texturkoordinaten enthält. + Setze die VR Bildschirmgeometrie, entweder als Liste aus neun mit Kommas abgegrenzten Werten die drei 3D Koordinaten repräsentieren welche einen flachen Bildschirm definieren (unten links, unten rechts, oben links) oder als Name einer OBJ Datei die die Bildschirmgeometrie und Texturkoordinaten enthält. Capture video/audio input from camera and microphone. @@ -998,67 +1012,67 @@ Nehme Bild und Ton von Kamera und Mikrofon auf. - + List audio outputs. Liste die Tonausgabegeräte. - + List audio inputs. Liste die Toneingabegeräte. - + List video inputs. Liste die Bildeingabegeräte. - + Choose audio output via its index. Wähle eine Tonausgabe mit ihrem Index. - + Choose audio input via its index. Can be empty. Wähle eine Toneingabe mit ihrem Index. Kann leer sein. - + Choose video input via its index. Wähle eine Bildeingabe mit ihrem Index. - + Set preferred audio track language (en, de, fr, ...). Setze bevorzugte Tonspursprache (en, de, fr, ...). - + Set preferred subtitle track language (en, de, fr, ...). Can be empty. Setze bevorzugte Untertitelsprache (en, de, fr, ...). Kann leer sein. - + List all video, audio and subtitle tracks in the media. Liste alle Bild-, Ton- und Untertitelspuren im Medium. - + Choose video track via its index. Wähle eine Bildspur mit ihrem Index. - + Choose audio track via its index. Wähle eine Tonspur mit ihrem Index. - + Choose subtitle track via its index. Can be empty. Wähle eine Untertitelspur mit ihrem Index. Kann leer sein. - + Swap left/right eye. Tausche linkes/rechtes Auge. @@ -1067,18 +1081,18 @@ Tausche Augen. - + Start in fullscreen mode. fullscreen Starte im Vollbildmodus. - + Set input mode (%1). Setze Eingabemodus (%1). - + Set output mode (%1). Setze Ausgabemodus (%1). @@ -1087,169 +1101,184 @@ Setze 360° Modus (%1). - + Read commands from a script file. Lese Kommandos aus einer Skriptdatei. - + + Set VR screen geometry, either as the special values 'united' or 'intersected', or as a comma-separated list of nine values representing three 3D coordinates that define a planar screen (bottom left, bottom right, top left), or as a an aspect ratio followed by the name of an OBJ file that contains the screen geometry with texture coordinates (example: '16:9,myscreen.obj'). + Setze die VR Bildschirmgeometrie, entweder als spezielle Werte 'united' oder 'intersected', oder als Liste aus neun mit Kommas abgegrenzten Werten die drei 3D Koordinaten repräsentieren welche einen flachen Bildschirm definieren (unten links, unten rechts, oben links), oder als Seitenverhätlnis gefolgt vom Namen einer OBJ Datei die die Bildschirmgeometrie und Texturkoordinaten enthält (Beispiel: '16:9,meinschirm.obj'). + + + Capture audio/video input from microphone and camera/screen/window. Hole Audio/Video von Mikrofon und Kamera/Bildschirm/Fenster. - + List screen inputs. Liste die Bildschirm-Eingabegeräte. - + List window inputs. Liste die Fenster-Eingabegeräte. - + Choose screen input via its index. Wähle eine Bildschirmeingabe mit ihrem Index. - + Choose window input via its index. Wähle eine Fenstereingabe mit ihrem Index. - + Load playlist. Lade Wiedergabeliste. - + Set loop mode (%1). Setze Wiederholungsmodus (%1). - + + Set wait mode (%1). + Setze Wartemodus + + + Set surround mode (%1). Setze Surroundmodus (%1). - - - - - - - - + + + + + + - - - - - - - - - + + + + + + + + + + + + + + Invalid argument for option %1 Ungültiges Argument für Option %1 - + VR mode unavailable - recompile Bino with QVR support! VR Modus nicht verfügbar - rekompiliere Bino mit QVR Unterstützung! - + No audio outputs available. Keine Tonausgaben verfügbar. - + Audio output %1: %2 Tonausgabe %1: %2 - + No audio inputs available. Keine Toneingaben verfügbar. - + Audio input %1: %2 Toneingabe %1: %2 - + No video inputs available. Keine Bildeingaben verfügbar. - + Video input %1: %2 Bildeingabe %1: %2 - + + No screen inputs available. Keine Bildschirmeingabegeräte vorhanden. - + Screen input %1: %2 Bildschirmeingabe %1: %2 - + + No window inputs available. Keine Fenstereingabegeräte vorhanden. - + Window input %1: %2 Fenstereingabe %1: %2 - + File does not exist: %1 Datei existiert nicht: %1 - + %1: %2 %1: %2 - + Cannot capture and play URL at the same time. Kann nicht gleichzeitig aufnehmen und URL wiedergeben. - + video Bild - + audio Ton - + subtitle Untertitel - + no %1 tracks Keine %1spuren - + %1 track %2 %1spur %2 - + Cannot initialize QVR manager Kann QVR Manager nicht initialisieren @@ -1283,7 +1312,7 @@ VideoFrame - + Pixel format %1 is not hardware accelerated! Pixelformat %1 ist nicht hardwarebeschleunigt! @@ -1291,21 +1320,21 @@ Widget - - + + Insufficient OpenGL capabilities. Insufficient OpenGL capabilities Unzureichende OpenGL Fähigkeiten. - - + + Error Fehler - - + + OpenGL stereo mode is not available on this system. OpenGL stereo mode is not available on this system OpenGL Stereo Modus ist nicht verfügbar auf diesem System. diff --git a/i18n/bino_ka.ts b/i18n/bino_ka.ts index d36f042..d1131ff 100644 --- a/i18n/bino_ka.ts +++ b/i18n/bino_ka.ts @@ -4,6 +4,7 @@ Bino + Media player error: %1 მედია დამკვრელის შეცდომა @@ -11,18 +12,49 @@ CommandInterpreter + Cannot open %1: %2 გახსნის შეცდომა: %1: %2 + + Cannot read command from %1 %1-დან ბრძანების წაკითხვის შეცდომა + + + + + + + + + + + + + + + + + + + + + + Invalid argument in %1 line %2 არასწორი არგუმენტი %1-ში %2-ე ხაზზე + + %1: %2 + + + + Invalid command %1 line %2 არასწორი ბრძანება %1 ხაზზე %2 @@ -30,310 +62,461 @@ Gui + &File &ფაილი &Open file... - &ფაილის გახსნა... + &ფაილის გახსნა... + Open &URL... &URL-ის გახსნა... Open &Camera... - &კამერის გახსნა... + &კამერის გახსნა... + &Quit &გასვლა + &Tracks &აუდიობილიკები + &3D Modes &3D რეჟიმები 360° mode - 360° რეჟიმი + 360° რეჟიმი + Input 2D შეყვანა 2D Input top/bottom - შეყვანა ზედა/ქვედა + შეყვანა ზედა/ქვედა Input top/bottom half height - შეყვანა ზედა/ქვედა ნახევარ სიმაღლეზე + შეყვანა ზედა/ქვედა ნახევარ სიმაღლეზე Input bottom/top - შეყვანა ქვედა/ზედა + შეყვანა ქვედა/ზედა Input bottom/top half height - შეყვანა ქვედა/ზედა ნახევარ სიმაღლეზე + შეყვანა ქვედა/ზედა ნახევარ სიმაღლეზე Input left/right - შეყვანა მარცხენა/მარჯვენა + შეყვანა მარცხენა/მარჯვენა Input left/right half width - შეყვანა მარცხენა/მარჯვენა ნახევარ სიმაღლეზე + შეყვანა მარცხენა/მარჯვენა ნახევარ სიმაღლეზე Input right/left - შეყვანა მარჯვენა/მარცხენა + შეყვანა მარჯვენა/მარცხენა Input right/left half width - შეყვანა მარჯვენა/მარცხენა ნახევარ სიმაღლეზე + შეყვანა მარჯვენა/მარცხენა ნახევარ სიმაღლეზე Input alternating left/right - შეყვანა ცვლადი მარცხენა/მარჯვენა + შეყვანა ცვლადი მარცხენა/მარჯვენა Input alternating right/left - შეყვანა ცვლადი მარჯვენა/მარცხენა + შეყვანა ცვლადი მარჯვენა/მარცხენა Output left - მარცხენა გამოტანა + მარცხენა გამოტანა Output right - მარჯვენა გამოტანა + მარჯვენა გამოტანა Output OpenGL Stereo - OpenGL სტერეოს გამოტანა + OpenGL სტერეოს გამოტანა Output alternating - ცვლადის გამოტანა + ცვლადის გამოტანა Output red/cyan high quality - წითელი/ცისფერი მაღალი ხარისხის გამოტანა + წითელი/ცისფერი მაღალი ხარისხის გამოტანა Output red/cyan full color - წითელი/ცისფერი სრული ფერების გამოტანა + წითელი/ცისფერი სრული ფერების გამოტანა Output red/cyan half color - წითელი/ცისფერი ნახევარი ფერების გამოტანა + წითელი/ცისფერი ნახევარი ფერების გამოტანა Output red/cyan monochrome - წითელი/ცისფერი შავთეთრის გამოტანა + წითელი/ცისფერი შავთეთრის გამოტანა Output green/magenta high quality - მწვანე/ალისფერი მაღალი ხარისხის გამოტანა + მწვანე/ალისფერი მაღალი ხარისხის გამოტანა Output green/magenta full color - მწვანე/ალისფერი სრული ფერის გამოტანა + მწვანე/ალისფერი სრული ფერის გამოტანა Output green/magenta half color - მწვანე/ალისფერი ნახევარი ფერის გამოტანა + მწვანე/ალისფერი ნახევარი ფერის გამოტანა Output green/magenta monochrome - მწვანე/ალისფერი შავთეთრის გამოტანა + მწვანე/ალისფერი შავთეთრის გამოტანა Output amber/blue high quality - ყვითელი/ლურჯი მაღალი ხარისხის გამოტანა + ყვითელი/ლურჯი მაღალი ხარისხის გამოტანა Output amber/blue full color - ყვითელი/ლურჯი სრული ფერის გამოტანა + ყვითელი/ლურჯი სრული ფერის გამოტანა Output amber/blue half color - ყვითელი/ლურჯი ნახევარი ფერის გამოტანა + ყვითელი/ლურჯი ნახევარი ფერის გამოტანა Output amber/blue monochrome - ყვითელი/ლურჯი შავთეთრის გამოტანა + ყვითელი/ლურჯი შავთეთრის გამოტანა Output red/green monochrome - წითელი/მწვანე შავთეთრის გამოტანა + წითელი/მწვანე შავთეთრის გამოტანა Output red/blue monochrome - წითელი/ლურჯი შავთეთრის გამოტანა + წითელი/ლურჯი შავთეთრის გამოტანა Output even/odd rows - ლუწი/კენტი მწკრივების გამოტანა + ლუწი/კენტი მწკრივების გამოტანა Output even/odd columns - ლუწი/კენტი სვეტების გამოტანა + ლუწი/კენტი სვეტების გამოტანა Output checkerboard - ჭადრაკული დაფის გამოტანა + ჭადრაკული დაფის გამოტანა + + + + &Open File(s)... + + + + + Open &Capture Device... + + + + + &Playlist + + + + + &Load... + + + + + &Save... + + + + + &Edit... + + + + + &Next + + + + + &Previous + + + Input 3D above-below + + + + + Input 3D side-by-side + + + + + Input 3D alternating + + + + + Output 3D side-by-side + + + + + Output 3D above-below + + + + + Output 3D interleaved + + + + + Output 3D anaglyph + + + + &Media &მედია + Mute audio ხმის დადუმება + Increase audio volume ხმის გაზრდა + Decrease audio volume ხმის დაწევა + Pause გაჩერება + Seek forward 1 second წინ გადახვევა 1 წამით + Seek backwards 1 second 1 წამით უკან გადახვევა + Seek forward 10 seconds 10 წამით წინ გადახვევა + Seek backwards 10 seconds 10 წამით უკან გადახვევა + Seek forward 1 minute ერთი წუთით წინ გადახვევა + Seek backwards 1 minute ერთი წუთით უკან გადახვევა + Seek forward 10 minutes 10 წუთით წინ გადახვევა + Seek backwards 10 minutes 10 წუთით უკან გადახვევა + &View _ხედი + &Fullscreen &მთელ ეკრანზე + &Swap eyes &თვალების ადგილის გაცვლა + &Help &დახმარება + &About... &შესახებ... + + + + + Error შეცდომა + Open URL URL-ის გახსნა + URL: URL: + + Cancel _გაუქმება + + OK დიახ + + + Open Capture Device + + + + + Camera Input: + + Open Camera - კამერის გახსნა + კამერის გახსნა Video Input: - ვიდეოს შეყვანა: + ვიდეოს შეყვანა: + + Default ნაგულისხმები + + Screen Input: + + + + + Window Input: + + + + Audio Input: აუდიოს შეტანა: + + None არაფერი + + + Playlists (*.m3u) + + + + About Bino Bino-ის შესახებ + Bino version %1 Bino-ის ვერსია: %1 + Copyright (C) %1 Martin Lambers (C) %1 Martin Lambers, ყველა უფლება დაცულია + This is free software. You may redistribute copies of it under the terms of the <a href="http://www.gnu.org/licenses/gpl.html">GNU General Public License</a>. There is NO WARRANTY, to the extent permitted by law. ეს უფასო პროგრამაა. შეგიძლიათ, გაავრცელოთ ის<a href="http://www.gnu.org/licenses/gpl.html">GNU General Public License</a> ლიცენზიით. არანაირი გარანტია, კანონით დაშვებულ ფარგლებამდე, ამ პროგრამას არ გააჩნია. + Video track %1 ვიდეო ტრეკი %1 + + (%1) (%1) + Audio track %1 აუდიო ტრეკი %1 + No subtitles სუბტიტრების გარეშე + Subtitle track %1 სუბტიტრების ტრეკი %1 @@ -341,185 +524,749 @@ MetaData + Cannot get meta data from %1: %2 %1-დან მეტამონაცემების მიღების შეცდომა: %2 + + Mode + + + Input autodetection + + + + + Input 2D + შეყვანა 2D + + + + Input top/bottom + შეყვანა ზედა/ქვედა + + + + Input top/bottom half height + შეყვანა ზედა/ქვედა ნახევარ სიმაღლეზე + + + + Input bottom/top + შეყვანა ქვედა/ზედა + + + + Input bottom/top half height + შეყვანა ქვედა/ზედა ნახევარ სიმაღლეზე + + + + Input left/right + შეყვანა მარცხენა/მარჯვენა + + + + Input left/right half width + შეყვანა მარცხენა/მარჯვენა ნახევარ სიმაღლეზე + + + + Input right/left + შეყვანა მარჯვენა/მარცხენა + + + + Input right/left half width + შეყვანა მარჯვენა/მარცხენა ნახევარ სიმაღლეზე + + + + Input alternating left/right + შეყვანა ცვლადი მარცხენა/მარჯვენა + + + + Input alternating right/left + შეყვანა ცვლადი მარჯვენა/მარცხენა + + + + Surround autodetection + + + + + Surround off + + + + + Surround 180° + + + + + Surround 360° + + + + + Output 2D left + + + + + Output 2D right + + + + + Output 3D OpenGL Stereo + + + + + Output 3D alternating + + + + + Output HDMI frame pack + + + + + Output left/right + + + + + Output left/right half width + + + + + Output right/left + + + + + Output right/left half width + + + + + Output top/bottom + + + + + Output top/bottom half height + + + + + Output bottom/top + + + + + Output bottom/top half height + + + + + Output even/odd rows + ლუწი/კენტი მწკრივების გამოტანა + + + + Output even/odd columns + ლუწი/კენტი სვეტების გამოტანა + + + + Output checkerboard + ჭადრაკული დაფის გამოტანა + + + + Output red/cyan high quality + წითელი/ცისფერი მაღალი ხარისხის გამოტანა + + + + Output red/cyan full color + წითელი/ცისფერი სრული ფერების გამოტანა + + + + Output red/cyan half color + წითელი/ცისფერი ნახევარი ფერების გამოტანა + + + + Output red/cyan monochrome + წითელი/ცისფერი შავთეთრის გამოტანა + + + + Output green/magenta high quality + მწვანე/ალისფერი მაღალი ხარისხის გამოტანა + + + + Output green/magenta full color + მწვანე/ალისფერი სრული ფერის გამოტანა + + + + Output green/magenta half color + მწვანე/ალისფერი ნახევარი ფერის გამოტანა + + + + Output green/magenta monochrome + მწვანე/ალისფერი შავთეთრის გამოტანა + + + + Output amber/blue high quality + ყვითელი/ლურჯი მაღალი ხარისხის გამოტანა + + + + Output amber/blue full color + ყვითელი/ლურჯი სრული ფერის გამოტანა + + + + Output amber/blue half color + ყვითელი/ლურჯი ნახევარი ფერის გამოტანა + + + + Output amber/blue monochrome + ყვითელი/ლურჯი შავთეთრის გამოტანა + + + + Output red/green monochrome + წითელი/მწვანე შავთეთრის გამოტანა + + + + Output red/blue monochrome + წითელი/ლურჯი შავთეთრის გამოტანა + + + + Loop off + + + + + Loop one + + + + + Loop all + + + + + Wait off + + + + + Wait on + + + + + PlaylistEditor + + + Edit Playlist + + + + + URL + + + + + Input Mode + + + + + Surround Mode + + + + + Video Track + + + + + Audio Track + + + + + Subtitle Track + + + + + Move up + + + + + Move down + + + + + Add... + + + + + Remove + + + + + Edit... + + + + + Done + + + + + + + default + + + + + none + + + + + PlaylistEntryEditor + + + Edit Playlist Entry + + + + + + URL: + URL: + + + + Set File... + + + + + Set URL... + + + + + Input Mode: + + + + + Surround Mode: + + + + + Video Track: + + + + + Audio Track: + + + + + Subtitle Track: + + + + + Done + + + + + Open URL + URL-ის გახსნა + + + + Cancel + _გაუქმება + + + + OK + დიახ + + + + + + default + + + + + none + + + + + + + (%1) + (%1) + + QCommandLineParser + 3D video player -- see https://bino3d.org 3D ვიდეო დამკვრელი -- იხილეთ https://bino3d.org + Media to play. დასაკრავი მედია. + Set log level (%1). ჟურნალის ფაილის დაყენება (%1). + Set log file. ჟურნალის ფაილის დაყენება. + Use OpenGL ES instead of Desktop OpenGL. Desktop OpenGL-ის მაგიერ OpenGL ES-ის გამოყენება. + Use OpenGL quad-buffered stereo in GUI mode. GUI რეჟიმში ოთხმაგად-ბუფერირებული OpenGL-ის გამოყენება. + Start in VR mode instead of GUI mode. GUI რეჟიმის მაგიერ VR რეჟიმში გაშვება. Set VR screen geometry, either as a comma-separated list of nine values representing three 3D coordinates that define a planar screen (bottom left, bottom right, top left) or as a name of an OBJ file that contains the screen geometry with texture coordinates. - დააყენეთ VR ეკრანის გეომეტრია ან მძიმით გამოყოფილი 9 მნიშვნელობით, რომლებიც ბრტყელი ეკრანისსამ 3D კოორდინატს აღწერენ (ქვედა მარცხენა, ქვედა მარჯვენა, ზედა მარცხენა) ან OBJ ფაილის სახელი, რომელიც ეკრანის გეომეტრიას ტექსტურების კოორდინატებით შეიცავს. + დააყენეთ VR ეკრანის გეომეტრია ან მძიმით გამოყოფილი 9 მნიშვნელობით, რომლებიც ბრტყელი ეკრანისსამ 3D კოორდინატს აღწერენ (ქვედა მარცხენა, ქვედა მარჯვენა, ზედა მარცხენა) ან OBJ ფაილის სახელი, რომელიც ეკრანის გეომეტრიას ტექსტურების კოორდინატებით შეიცავს. Capture video/audio input from camera and microphone. - ვიდეო/აუდიოს ჩაწერა კამერიდან და მიკროფონიდან. + ვიდეო/აუდიოს ჩაწერა კამერიდან და მიკროფონიდან. + List audio outputs. აუდიო გამოტანის სია. + List audio inputs. აუდიო შეყვანის სია. + List video inputs. ვიდეო შეყვანის სია. + Choose audio output via its index. აირჩიეთ აუდიოს გამოტანა მისი ინდექსით. + Choose audio input via its index. Can be empty. აირჩიეთ აუდიოს შეყვანა მისი ინდექსით.არ შეიძლება, ცარიელი იყოს. + Choose video input via its index. აირჩიეთ ვიდეოს შეყვანა მისი ინდექსით. + Set preferred audio track language (en, de, fr, ...). აირჩიეთ აუდიო ტრეკის სასურველიენა (en, de, fr, …). + Set preferred subtitle track language (en, de, fr, ...). Can be empty. აირჩიეთ სუბტიტრებისთვის სასურველი ენა (en, de, fr, …) შეიძლება, იყოს ცარიელი. + List all video, audio and subtitle tracks in the media. მედიაში ყველა ვიდეოს, აუდიოს და სუბტიტრების ჩამონათვალი. + Choose video track via its index. აირჩიეთ ვიდეო ტრეკი მისი ინდექსით. + Choose audio track via its index. აირჩიეთ აუდიო ტრეკი მისი ინდექსით. + Choose subtitle track via its index. Can be empty. აირჩიეთ სუბტიტრების ტრეკი მისი ინდექსით. შეიძლება, ცარიელი იყოს. + Swap left/right eye. მარჯვენა/მარცხენა თვალების მიმოცვლა. swap-eyes - თვალების-ადგილების-მიმოცვლა + თვალების-ადგილების-მიმოცვლა + Start in fullscreen mode. მთელ ეკრანზე გაშვება. + Set input mode (%1). შეყვანის რეჟიმის დაყენება (%1). + Set output mode (%1). გამოტანის რეჟიმის დაყენება (%1). Set 360° mode (%1). - 360° რეჟიმის დაყენება (%1). + 360° რეჟიმის დაყენება (%1). + Read commands from a script file. ბრძანებების სკრიპტის ფაილიდან წაკითხვა. + + Set VR screen geometry, either as the special values 'united' or 'intersected', or as a comma-separated list of nine values representing three 3D coordinates that define a planar screen (bottom left, bottom right, top left), or as a an aspect ratio followed by the name of an OBJ file that contains the screen geometry with texture coordinates (example: '16:9,myscreen.obj'). + + + + + Capture audio/video input from microphone and camera/screen/window. + + + + + List screen inputs. + + + + + List window inputs. + + + + + Choose screen input via its index. + + + + + Choose window input via its index. + + + + + Load playlist. + + + + + Set loop mode (%1). + + + + + Set wait mode (%1). + + + + + Set surround mode (%1). + + + + + + + + + + + + + + + + + + + + + + + + Invalid argument for option %1 არასწორი არგუმენტი პარამეტრისთვის %1 + VR mode unavailable - recompile Bino with QVR support! VR რეჟიმი ხელმიუწვდომელია. თავიდან ააგეთ Bino, QVR-ის მხარდაჭერით! + No audio outputs available. აუდიოს გამოტანა ხელმიუწვდომელია. + Audio output %1: %2 აუდიოს გამოტანა %1: %2 + No audio inputs available. აუდიოს შეყვანა ხელმიუწვდომელია. + Audio input %1: %2 აუდიოს შეყვანა %1: %2 + No video inputs available. ვიდეოს შეყვანა ხელმიუწვდომელია. + Video input %1: %2 ვიდეოს შეყვანა %1: %2 + + + No screen inputs available. + + + + + Screen input %1: %2 + + + + + + No window inputs available. + + + + + Window input %1: %2 + + + + File does not exist: %1 ფაილი არ არსებობს: %1 + + %1: %2 + + + + Cannot capture and play URL at the same time. URL-დან ჩაწერა და დაკვრა ერთდროულად შეუძლებელია. + video ვიდეო + audio აუდიო + subtitle ქვესათაური + no %1 tracks %1 ტრეკი არ არსებობს + %1 track %2 %1 ტრეკი %2 + Cannot initialize QVR manager QVR მმართველის ინიციალიზაციის შეცდომა @@ -527,18 +1274,22 @@ Screen + Loading screen from %1 %1-დან ეკრანის ჩატვირთვა + Warning: %1 გაფრთხილება: %1 + Error: %1 შეცდომა: %1 + Unknown error უცნობი შეცდომა @@ -546,6 +1297,7 @@ VideoFrame + Pixel format %1 is not hardware accelerated! პიქსელის ფორმატი %1 აპარატურულად არ ჩქარდება! @@ -553,14 +1305,20 @@ Widget + + Insufficient OpenGL capabilities. OpenGL-ის არასაკმარისი შესაძლებლობები. + + Error შეცდომა + + OpenGL stereo mode is not available on this system. OpenGL-ის სტერეო რეჟიმი ამ სისტემაზე ხელმიუწვდომელია. diff --git a/i18n/bino_zh.ts b/i18n/bino_zh.ts index 65f3f52..fe62f45 100644 --- a/i18n/bino_zh.ts +++ b/i18n/bino_zh.ts @@ -4,7 +4,7 @@ Bino - + Media player error: %1 媒体播放器错误: %1 @@ -12,47 +12,50 @@ CommandInterpreter - + Cannot open %1: %2 Cannot open %1: %2) 未能打开 %1: %2 - - + + Cannot read command from %1 未能从 %1 中读取指令 - - - - - - - - - - - - - - - - + + + + + + + + + + + + + - - + + + + + + + + Invalid argument in %1 line %2 参数无效 %1 中第 %2 行 - + %1: %2 %1: %2 - + Invalid command %1 line %2 Invalid command %1 指令无效: %1 中第 %2 行 @@ -61,67 +64,65 @@ Gui - + &File &文件 - &Open file... - &打开文件... + &打开文件... - + Open &URL... &打开URL... - Open &Camera... - &打开摄像头... + &打开摄像头... - + &Quit &退出 - + &Tracks &轨道 - + &Playlist &播放列表 - + &Load... &加载... - + &Save... &保存... - + &Edit... &编辑... - + &Next &下一个 - + &Previous &上一个 - + &3D Modes &3D模式 @@ -130,7 +131,7 @@ 360°模式 - + Input 2D 输入2D @@ -259,237 +260,265 @@ 输出棋盘图案 - + + &Open File(s)... + + + + + Open &Capture Device... + + + + Input 3D above-below 输入上下3D - + Input 3D side-by-side 输入左右3D - + Input 3D alternating 输入交替3D - + Output 3D side-by-side 输出左右3D - + Output 3D above-below 输出上下3D - + Output 3D interleaved 输出交替3D - + Output 3D anaglyph 输出补色3D - + &Media &多媒体 - + Mute audio 静音 - + Increase audio volume 增大音量 - + Decrease audio volume 减低音量 - + Pause 暂停 - + Seek forward 1 second 前进1秒 - + Seek backwards 1 second 后退一秒 - + Seek forward 10 seconds 前进10秒 - + Seek backwards 10 seconds 后退10秒 - + Seek forward 1 minute 前进1分钟 - + Seek backwards 1 minute 后退1分钟 - + Seek forward 10 minutes 前进10分钟 - + Seek backwards 10 minutes 后退10分钟 - + &View &查看 - + &Fullscreen &全屏 - + &Swap eyes &交换眼睛 - + &Help &帮助 - + &About... &关于... - - - - - + + + + + Error 错误 - + Open URL 打开URL - + URL: URL: - - + + Cancel 取消 - - + + OK 确定 - + + Open Capture Device + + + + + Camera Input: + + + Open Camera - 打开摄像头 + 打开摄像头 - Video Input: - 视频输入: + 视频输入: - - + + Default 默认 - + + Screen Input: + + + + + Window Input: + + + + Audio Input: 音频输入: - - + + None - - + + Playlists (*.m3u) 播放列表 (*.m3u) - + About Bino 关于Bino - + Bino version %1 Bino版本 %1 - + Copyright (C) %1 Martin Lambers Copyright (C) %1 Martin Lambers - + This is free software. You may redistribute copies of it under the terms of the <a href="http://www.gnu.org/licenses/gpl.html">GNU General Public License</a>. There is NO WARRANTY, to the extent permitted by law. 这是免费软件。您可以根据 <a href="http://www.gnu.org/licenses/gpl.html">GNU通用公共许可证</a>在法律允许的范围内复制和使用,作者无任何保证及不承担任何责任。 - + Video track %1 视频轨道 %1 - - + + (%1) (%1) - + Audio track %1 音频轨道 %1 - + No subtitles 无字幕 - + Subtitle track %1 字幕轨道 %1 @@ -585,170 +614,180 @@ 环绕360° - + Output 2D left 输出2D左 - + Output 2D right 输出2D右 - + Output 3D OpenGL Stereo 输出OpenGL立体3D - - + + Output HDMI frame pack 输出HDMI帧包 - + Output 3D alternating 输出交替3D - + Output left/right 输出左/右 - + Output left/right half width 输出半宽左/右 - + Output right/left 输出右/左 - + Output right/left half width 输出半宽右/左 - + Output top/bottom 输出上/下 - + Output top/bottom half height 输出半高上/下 - + Output bottom/top 输出下/上 - + Output bottom/top half height 输出半高下/上 - + Output even/odd rows 输出偶/奇行 - + Output even/odd columns 输出偶/奇列 - + Output checkerboard 输出棋盘图案 - + Output red/cyan high quality 输出高品质红/青 - + Output red/cyan full color 输出全色红/青 - + Output red/cyan half color 输出半色调红/青 - + Output red/cyan monochrome 输出高单色红/青 - + Output green/magenta high quality 输出高品质绿/品红 - + Output green/magenta full color 输出全色绿/品红 - + Output green/magenta half color 输出半色调绿/品红 - + Output green/magenta monochrome 输出单色绿/品红 - + Output amber/blue high quality 输出高品质琥珀/蓝 - + Output amber/blue full color 输出全色琥珀/蓝 - + Output amber/blue half color 输出半色调琥珀/蓝 - + Output amber/blue monochrome 输出单色琥珀/蓝 - + Output red/green monochrome 输出单色红/绿 - + Output red/blue monochrome 输出单色红/蓝 - + Loop off 关闭循环 - + Loop one 循环单个 - + Loop all 循环所有 + + + Wait off + + + + + Wait on + + PlaylistEditor @@ -925,113 +964,111 @@ QCommandLineParser - + 3D video player -- see https://bino3d.org 3D视频播放器 -- 前往https://bino3d.org - + Media to play. 播放的媒体 - + Set log level (%1). 设置日志等级 (%1)。 - + Set log file. 设置日志文件。 - + Use OpenGL ES instead of Desktop OpenGL. 使用OpenGL ES而不是桌面OpenGL。 - + Use OpenGL quad-buffered stereo in GUI mode. 在GUI模式下使用OpenGL四重缓冲立体。 - + Start in VR mode instead of GUI mode. 以VR模式而不是GUI模式启动。 - Set VR screen geometry, either as a comma-separated list of nine values representing three 3D coordinates that define a planar screen (bottom left, bottom right, top left) or as a name of an OBJ file that contains the screen geometry with texture coordinates. - 设置VR屏幕几何形状,可以是用逗号分隔的九个值,表示定义平面屏幕(左下角、右下角、左上角)的三个3D坐标,也可以是一个OBJ文件的名称,该文件包含了屏幕几何形状和纹理坐标。 + 设置VR屏幕几何形状,可以是用逗号分隔的九个值,表示定义平面屏幕(左下角、右下角、左上角)的三个3D坐标,也可以是一个OBJ文件的名称,该文件包含了屏幕几何形状和纹理坐标。 - Capture video/audio input from camera and microphone. Capture audio/video input from camera and microphone. - 从照相机和麦克风捕获音视频输入。 + 从照相机和麦克风捕获音视频输入。 - + List audio outputs. 列出音频输出。 - + List audio inputs. 列出音频输入。 - + List video inputs. 列出视频输入。 - + Choose audio output via its index. 通过索引选择音频输出。 - + Choose audio input via its index. Can be empty. 通过索引选择音频输出,可以为空。 - + Choose video input via its index. 通过索引选择视频输入。 - + Set preferred audio track language (en, de, fr, ...). 设置偏好的音频轨道语言 (英语, 德语, 法语等)。 - + Set preferred subtitle track language (en, de, fr, ...). Can be empty. 设置偏好的字幕轨道语言 (英语, 德语, 法语等),可以为空。 - + List all video, audio and subtitle tracks in the media. 列出媒体中的所有视频、音频和字幕轨道。 - + Choose video track via its index. 通过索引选择视频轨道。 - + Choose audio track via its index. 通过索引选择音频轨道。 - + Choose subtitle track via its index. Can be empty. 通过索引选择字幕轨道,可以为空。 - + Swap left/right eye. 切换左右眼。 @@ -1040,18 +1077,18 @@ 切换眼睛 - + Start in fullscreen mode. fullscreen 进入全屏 - + Set input mode (%1). 设置输入模式 (%1)。 - + Set output mode (%1). 设置输出模式 (%1)。 @@ -1060,122 +1097,184 @@ 设置360°模式 (%1)。 - + Read commands from a script file. 从脚本文件中读取指令。 + + + Set VR screen geometry, either as the special values 'united' or 'intersected', or as a comma-separated list of nine values representing three 3D coordinates that define a planar screen (bottom left, bottom right, top left), or as a an aspect ratio followed by the name of an OBJ file that contains the screen geometry with texture coordinates (example: '16:9,myscreen.obj'). + + + + + Capture audio/video input from microphone and camera/screen/window. + + + + + List screen inputs. + + + + + List window inputs. + + + + + Choose screen input via its index. + + + Choose window input via its index. + + + + Load playlist. 加载播放列表。 - + Set loop mode (%1). 设置循环模式 (%1)。 - + + Set wait mode (%1). + + + + Set surround mode (%1). 设置环绕模式 (%1)。 - - - - - - - - - - - - + + + + + + + - - - + + + + + + + + + + + + + Invalid argument for option %1 %1 选项中的参数无效 - + VR mode unavailable - recompile Bino with QVR support! VR模式不可用-使用QVR支持重新编译Bino! - + No audio outputs available. 无有效音频输出。 - + Audio output %1: %2 音频输出 %1: %2 - + No audio inputs available. 无有效音频输入。 - + Audio input %1: %2 音频输出 %1: %2 - + No video inputs available. 无有效视频出入。 - + Video input %1: %2 视频输入 %1: %2 - + + + No screen inputs available. + + + + + Screen input %1: %2 + + + + + + No window inputs available. + + + + + Window input %1: %2 + + + + File does not exist: %1 文件不存在: %1 - + %1: %2 %1: %2 - + Cannot capture and play URL at the same time. 无法同时获取和播放URL。 - + video 视频 - + audio 音频 - + subtitle 字幕 - + no %1 tracks 没有 %1 轨道 - + %1 track %2 %1 轨道 %2 - + Cannot initialize QVR manager 无法初始化QVR管理器 @@ -1209,7 +1308,7 @@ VideoFrame - + Pixel format %1 is not hardware accelerated! 像素格式 %1 没有硬件加速 @@ -1217,21 +1316,21 @@ Widget - - + + Insufficient OpenGL capabilities. Insufficient OpenGL capabilities OpenGL功能不足 + - Error 错误 - - + + OpenGL stereo mode is not available on this system. OpenGL stereo mode is not available on this system OpenGL立体模式在此系统上不可用 diff --git a/src/bino.cpp b/src/bino.cpp index 659a42f..6eb914d 100644 --- a/src/bino.cpp +++ b/src/bino.cpp @@ -1395,7 +1395,7 @@ void Bino::keyPressEvent(QKeyEvent* event) Playlist::instance()->next(); } else if (event->key() == Qt::Key_P) { Playlist::instance()->prev(); - } else if (event->matches(QKeySequence::FullScreen) || event->key() == Qt::Key_F) { + } else if (event->matches(QKeySequence::FullScreen) || event->key() == Qt::Key_F || event->key() == Qt::Key_F11) { emit toggleFullscreen(); } else if (event->key() == Qt::Key_E || event->key() == Qt::Key_F7) { toggleSwapEyes(); diff --git a/src/commandinterpreter.cpp b/src/commandinterpreter.cpp index f8ef490..e1c5185 100644 --- a/src/commandinterpreter.cpp +++ b/src/commandinterpreter.cpp @@ -328,6 +328,14 @@ void CommandInterpreter::processNextCommand() Playlist::instance()->next(); } else if (cmd == "playlist-prev") { Playlist::instance()->prev(); + } else if (cmd.startsWith("playlist-wait ")) { + bool ok; + WaitMode waitMode = waitModeFromString(cmd.mid(14), &ok); + if (!ok) { + LOG_FATAL("%s", qPrintable(tr("Invalid argument in %1 line %2").arg(_file.fileName()).arg(_lineIndex))); + } else { + Playlist::instance()->setWaitMode(waitMode); + } } else if (cmd.startsWith("playlist-loop ")) { bool ok; LoopMode loopMode = loopModeFromString(cmd.mid(14), &ok); diff --git a/src/digestiblemedia.cpp b/src/digestiblemedia.cpp index baf1ac0..f7cb5c7 100644 --- a/src/digestiblemedia.cpp +++ b/src/digestiblemedia.cpp @@ -25,6 +25,7 @@ #include #include "urlloader.hpp" +#include "tools.hpp" #include "log.hpp" #include "digestiblemedia.hpp" @@ -50,10 +51,8 @@ QUrl digestibleMediaUrl(const QUrl& url) static QMap> cache; // check if we need conversion - bool needsConversion = url.fileName().endsWith(".jpg", Qt::CaseInsensitive) - || url.fileName().endsWith(".jpeg", Qt::CaseInsensitive) - || url.fileName().endsWith(".jps", Qt::CaseInsensitive) - || url.fileName().endsWith(".mpo", Qt::CaseInsensitive); + QString extension = getExtension(url); + bool needsConversion = (extension == "jpg" || extension == "jpeg" || extension == "jps" || extension == "mpo"); if (!needsConversion) { LOG_DEBUG("%s", qPrintable(QString("digestibleMediaUrl: %1 needs no conversion").arg(url.toString()))); return url; diff --git a/src/gui.cpp b/src/gui.cpp index 91df9a6..3b1b806 100644 --- a/src/gui.cpp +++ b/src/gui.cpp @@ -74,7 +74,7 @@ Gui::Gui(OutputMode outputMode, bool fullscreen) : setWindowIcon(QIcon(icon)); QMenu* fileMenu = addBinoMenu(tr("&File")); - QAction* fileOpenAction = new QAction(tr("&Open File..."), this); + QAction* fileOpenAction = new QAction(tr("&Open File(s)..."), this); fileOpenAction->setShortcuts({ QKeySequence::Open }); connect(fileOpenAction, SIGNAL(triggered()), this, SLOT(fileOpen())); addBinoAction(fileOpenAction, fileMenu); @@ -131,6 +131,18 @@ Gui::Gui(OutputMode outputMode, bool fullscreen) : _playlistLoopActionGroup->addAction(playlistLoopAll)->setData(int(Loop_All)); connect(playlistLoopAll, SIGNAL(triggered()), this, SLOT(playlistLoop())); addBinoAction(playlistLoopAll, playlistMenu); + playlistMenu->addSeparator(); + _playlistWaitActionGroup = new QActionGroup(this); + QAction* playlistWaitOff = new QAction(waitModeToStringUI(Wait_Off), this); + playlistWaitOff->setCheckable(true); + _playlistWaitActionGroup->addAction(playlistWaitOff)->setData(int(Wait_Off)); + connect(playlistWaitOff, SIGNAL(triggered()), this, SLOT(playlistWait())); + addBinoAction(playlistWaitOff, playlistMenu); + QAction* playlistWaitOn = new QAction(waitModeToStringUI(Wait_On), this); + playlistWaitOn->setCheckable(true); + _playlistWaitActionGroup->addAction(playlistWaitOn)->setData(int(Wait_On)); + connect(playlistWaitOn, SIGNAL(triggered()), this, SLOT(playlistWait())); + addBinoAction(playlistWaitOn, playlistMenu); QMenu* threeDMenu = addBinoMenu(tr("&3D Modes")); _3dSurroundActionGroup = new QActionGroup(this); @@ -421,7 +433,7 @@ Gui::Gui(OutputMode outputMode, bool fullscreen) : QMenu* viewMenu = addBinoMenu(tr("&View")); _viewToggleFullscreenAction = new QAction(tr("&Fullscreen"), this); - _viewToggleFullscreenAction->setShortcuts({ Qt::Key_F, QKeySequence::FullScreen }); + _viewToggleFullscreenAction->setShortcuts({ Qt::Key_F11, Qt::Key_F, QKeySequence::FullScreen }); _viewToggleFullscreenAction->setCheckable(true); connect(_viewToggleFullscreenAction, SIGNAL(triggered()), this, SLOT(viewToggleFullscreen())); addBinoAction(_viewToggleFullscreenAction, viewMenu); @@ -465,19 +477,23 @@ Gui* Gui::instance() void Gui::fileOpen() { - QString name = QFileDialog::getOpenFileName(this); - if (!name.isEmpty()) { - QUrl url = QUrl::fromLocalFile(name); - MetaData metaData; - QString errMsg; - if (metaData.detectCached(url, &errMsg)) { - Bino::instance()->startPlaylistMode(); - Playlist::instance()->clear(); - Playlist::instance()->append(url); - Playlist::instance()->start(); - } else { - QMessageBox::critical(this, tr("Error"), errMsg); + QStringList names = QFileDialog::getOpenFileNames(this); + if (!names.isEmpty()) { + bool playlistWasEmpty = Playlist::instance()->length() == 0; + Bino::instance()->startPlaylistMode(); + for (int i = 0; i < names.size(); i++) { + QUrl url = QUrl::fromLocalFile(names[i]); + MetaData metaData; + QString errMsg; + if (metaData.detectCached(url, &errMsg)) { + Playlist::instance()->append(url); + } else { + QMessageBox::critical(this, tr("Error"), errMsg); + } } + Playlist::instance()->setWaitModeAuto(); + if (playlistWasEmpty) + Playlist::instance()->next(); } } @@ -710,6 +726,13 @@ void Gui::playlistLoop() Playlist::instance()->setLoopMode(static_cast(a->data().toInt())); } +void Gui::playlistWait() +{ + QAction* a = _playlistWaitActionGroup->checkedAction(); + if (a) + Playlist::instance()->setWaitMode(static_cast(a->data().toInt())); +} + void Gui::threeDSurround() { QAction* a = _3dSurroundActionGroup->checkedAction(); @@ -908,6 +931,12 @@ void Gui::updateActions() a->setChecked(a->data().toInt() == int(loopMode)); } + WaitMode waitMode = Playlist::instance()->waitMode(); + for (int i = 0; i < _playlistWaitActionGroup->actions().size(); i++) { + QAction* a = _playlistWaitActionGroup->actions()[i]; + a->setChecked(a->data().toInt() == int(waitMode)); + } + SurroundMode surroundMode = Bino::instance()->assumeSurroundMode(); for (int i = 0; i < _3dSurroundActionGroup->actions().size(); i++) { QAction* a = _3dSurroundActionGroup->actions()[i]; diff --git a/src/gui.hpp b/src/gui.hpp index 424d13b..fbcd6a5 100644 --- a/src/gui.hpp +++ b/src/gui.hpp @@ -1,7 +1,7 @@ /* * This file is part of Bino, a 3D video player. * - * Copyright (C) 2022, 2023 + * Copyright (C) 2022, 2023, 2024 * Martin Lambers * * This program is free software; you can redistribute it and/or modify @@ -36,6 +36,7 @@ Q_OBJECT QMenu* _contextMenu; QActionGroup* _playlistLoopActionGroup; + QActionGroup* _playlistWaitActionGroup; QMenu* _trackMenu; QActionGroup* _trackVideoActionGroup; QActionGroup* _trackAudioActionGroup; @@ -75,6 +76,7 @@ public slots: void playlistNext(); void playlistPrevious(); void playlistLoop(); + void playlistWait(); void threeDSurround(); void threeDInput(); void threeDOutput(); diff --git a/src/main.cpp b/src/main.cpp index b9b3b64..6737edb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -192,6 +192,9 @@ int main(int argc, char* argv[]) parser.addOption({ { "l", "loop" }, QCommandLineParser::tr("Set loop mode (%1).").arg("off, one, all"), "mode" }); + parser.addOption({ { "w", "wait" }, + QCommandLineParser::tr("Set wait mode (%1).").arg("off, on"), + "mode" }); parser.addOption({ { "i", "input" }, QCommandLineParser::tr("Set input mode (%1).").arg("mono, " "top-bottom, top-bottom-half, bottom-top, bottom-top-half, " @@ -466,6 +469,15 @@ int main(int argc, char* argv[]) } playlist.setLoopMode(loopMode); } + if (parser.isSet("wait")) { + bool ok; + WaitMode waitMode = waitModeFromString(parser.value("wait"), &ok); + if (!ok) { + LOG_FATAL("%s", qPrintable(QCommandLineParser::tr("Invalid argument for option %1").arg("--wait"))); + return 1; + } + playlist.setWaitMode(waitMode); + } int videoTrack = PlaylistEntry::DefaultTrack; int audioTrack = PlaylistEntry::DefaultTrack; int subtitleTrack = PlaylistEntry::DefaultTrack; @@ -529,6 +541,9 @@ int main(int argc, char* argv[]) return 1; } } + if (!parser.isSet("wait")) { + playlist.setWaitModeAuto(); + } if (parser.isSet("capture") && playlist.length() > 0) { LOG_FATAL("%s", qPrintable(QCommandLineParser::tr("Cannot capture and play URL at the same time."))); return 1; diff --git a/src/modes.cpp b/src/modes.cpp index 3af1595..b4fb1e5 100644 --- a/src/modes.cpp +++ b/src/modes.cpp @@ -1,7 +1,7 @@ /* * This file is part of Bino, a 3D video player. * - * Copyright (C) 2022, 2023 + * Copyright (C) 2022, 2023, 2024 * Martin Lambers * * This program is free software; you can redistribute it and/or modify @@ -511,3 +511,45 @@ LoopMode loopModeFromString(const QString& s, bool* ok) *ok = r; return mode; } + +const char* waitModeToString(WaitMode mode) +{ + switch (mode) { + case Wait_Off: + return "off"; + break; + case Wait_On: + return "on"; + break; + } + return nullptr; + +} + +QString waitModeToStringUI(WaitMode mode) +{ + switch (mode) { + case Wait_Off: + return QCoreApplication::translate("Mode", "Wait off"); + break; + case Wait_On: + return QCoreApplication::translate("Mode", "Wait on"); + break; + } + return QString(); +} + +WaitMode waitModeFromString(const QString& s, bool* ok) +{ + WaitMode mode = Wait_Off; + bool r = true; + if (s == "off") + mode = Wait_Off; + else if (s == "on") + mode = Wait_On; + else + r = false; + if (ok) + *ok = r; + return mode; +} diff --git a/src/modes.hpp b/src/modes.hpp index ad9e40b..0a04f35 100644 --- a/src/modes.hpp +++ b/src/modes.hpp @@ -1,7 +1,7 @@ /* * This file is part of Bino, a 3D video player. * - * Copyright (C) 2022, 2023 + * Copyright (C) 2022, 2023, 2024 * Martin Lambers * * This program is free software; you can redistribute it and/or modify @@ -108,3 +108,15 @@ enum LoopMode const char* loopModeToString(LoopMode mode); QString loopModeToStringUI(LoopMode mode); LoopMode loopModeFromString(const QString& s, bool* ok = nullptr); + +/* Wait mode for the playlist */ + +enum WaitMode +{ + Wait_Off, + Wait_On +}; + +const char* waitModeToString(WaitMode mode); +QString waitModeToStringUI(WaitMode mode); +WaitMode waitModeFromString(const QString& s, bool* ok = nullptr); diff --git a/src/playlist.cpp b/src/playlist.cpp index f042b13..f540bd8 100644 --- a/src/playlist.cpp +++ b/src/playlist.cpp @@ -1,7 +1,7 @@ /* * This file is part of Bino, a 3D video player. * - * Copyright (C) 2022, 2023 + * Copyright (C) 2022, 2023, 2024 * Martin Lambers * * This program is free software; you can redistribute it and/or modify @@ -23,6 +23,7 @@ #include #include "playlist.hpp" +#include "tools.hpp" #include "log.hpp" @@ -57,15 +58,15 @@ QString PlaylistEntry::optionsToString() const s.append(" --surround="); s.append(surroundModeToString(surroundMode)); } - if (videoTrack != PlaylistEntry::DefaultTrack) { + if (videoTrack >= 0) { s.append(" --video-track="); s.append(QString::number(videoTrack)); } - if (audioTrack != PlaylistEntry::DefaultTrack) { + if (audioTrack >= 0) { s.append(" --audio-track="); s.append(QString::number(audioTrack)); } - if (subtitleTrack != PlaylistEntry::DefaultTrack) { + if (subtitleTrack >= 0) { s.append(" --subtitle-track="); s.append(QString::number(subtitleTrack)); } @@ -130,6 +131,7 @@ Playlist::Playlist() : _preferredSubtitle(QLocale::system().language()), _wantSubtitle(false), _loopMode(Loop_Off), + _waitMode(Wait_Off), _currentIndex(-1) { Q_ASSERT(!playlistSingleton); @@ -242,20 +244,44 @@ void Playlist::stop() void Playlist::next() { if (length() > 0) { - if (_currentIndex == length() - 1) - setCurrentIndex(0); - else - setCurrentIndex(_currentIndex + 1); + switch (loopMode()) { + case Loop_Off: + if (_currentIndex < length() - 1) + setCurrentIndex(_currentIndex + 1); + break; + case Loop_One: + // keep current index but play again + emitMediaChanged(); + break; + case Loop_All: + if (_currentIndex == length() - 1) + setCurrentIndex(0); + else + setCurrentIndex(_currentIndex + 1); + break; + } } } void Playlist::prev() { if (length() > 0) { - if (_currentIndex == 0) - setCurrentIndex(length() - 1); - else - setCurrentIndex(_currentIndex - 1); + switch (loopMode()) { + case Loop_Off: + if (_currentIndex > 0) + setCurrentIndex(_currentIndex - 1); + break; + case Loop_One: + // keep current index but play again + emitMediaChanged(); + break; + case Loop_All: + if (_currentIndex == 0) + setCurrentIndex(length() - 1); + else + setCurrentIndex(_currentIndex - 1); + break; + } } } @@ -286,22 +312,41 @@ LoopMode Playlist::loopMode() const return _loopMode; } +WaitMode Playlist::waitMode() const +{ + return _waitMode; +} + void Playlist::setLoopMode(LoopMode loopMode) { _loopMode = loopMode; } +void Playlist::setWaitMode(WaitMode waitMode) +{ + _waitMode = waitMode; +} + +void Playlist::setWaitModeAuto() +{ + WaitMode waitMode = Wait_Off; + for (int i = 0; i < length(); i++) { + QString extension = getExtension(entries()[i].url); + if (extension == "jpg" || extension == "jpeg" + || extension == "png" + || extension == "jps" + || extension == "mpo") { + waitMode = Wait_On; + break; + } + } + _waitMode = waitMode; +} + void Playlist::mediaEnded() { - if (loopMode() == Loop_One) { - // keep current index but play again - emitMediaChanged(); - } else if (_currentIndex == length() - 1 && loopMode() == Loop_All) { - // start with first index - setCurrentIndex(0); - } else if (_currentIndex < length() - 1) { - // start with next index - setCurrentIndex(_currentIndex + 1); + if (waitMode() == Wait_Off) { + next(); } } diff --git a/src/playlist.hpp b/src/playlist.hpp index fe99b41..3a4189b 100644 --- a/src/playlist.hpp +++ b/src/playlist.hpp @@ -1,7 +1,7 @@ /* * This file is part of Bino, a 3D video player. * - * Copyright (C) 2022, 2023 + * Copyright (C) 2022, 2023, 2024 * Martin Lambers * * This program is free software; you can redistribute it and/or modify @@ -62,6 +62,7 @@ Q_OBJECT QLocale::Language _preferredSubtitle; bool _wantSubtitle; LoopMode _loopMode; + WaitMode _waitMode; QList _entries; int _currentIndex; @@ -88,6 +89,7 @@ Q_OBJECT void clear(); LoopMode loopMode() const; + WaitMode waitMode() const; bool save(const QString& fileName, QString& errStr) const; bool load(const QString& fileName, QString& errStr); @@ -99,6 +101,8 @@ public slots: void prev(); void setCurrentIndex(int index); void setLoopMode(LoopMode loopMode); + void setWaitMode(WaitMode waitMode); + void setWaitModeAuto(); void mediaEnded(); diff --git a/src/tools.cpp b/src/tools.cpp index a3f887e..fc645d5 100644 --- a/src/tools.cpp +++ b/src/tools.cpp @@ -51,3 +51,17 @@ const char* getOpenGLString(QOpenGLExtraFunctions* gl, GLenum p) { return reinterpret_cast(gl->glGetString(p)); } + +QString getExtension(const QString& fileName) +{ + QString extension; + int lastDot = fileName.lastIndexOf('.'); + if (lastDot > 0) + extension = (fileName.right(fileName.length() - lastDot - 1)).toLower(); + return extension; +} + +QString getExtension(const QUrl& url) +{ + return getExtension(url.fileName()); +} diff --git a/src/tools.hpp b/src/tools.hpp index 865096b..641eb4a 100644 --- a/src/tools.hpp +++ b/src/tools.hpp @@ -20,8 +20,10 @@ #pragma once +#include #include #include +#include // Global boolean variable that tells if the OpenGL flavor is OpenGL ES or desktop GL extern bool IsOpenGLES; @@ -57,3 +59,7 @@ bool checkTextureAnisotropicFilterAvailability(); // Shortcut to get a string from OpenGL const char* getOpenGLString(QOpenGLExtraFunctions* gl, GLenum p); + +// Shortcut to get an extension from a file name +QString getExtension(const QString& fileName); +QString getExtension(const QUrl& url); diff --git a/src/videosink.cpp b/src/videosink.cpp index 65d6eaa..bad6940 100644 --- a/src/videosink.cpp +++ b/src/videosink.cpp @@ -21,6 +21,7 @@ #include #include "videosink.hpp" +#include "tools.hpp" #include "log.hpp" @@ -51,14 +52,10 @@ void VideoSink::newUrl(const QUrl& url, InputMode im, SurroundMode sm) } if (inputMode == Input_Unknown) { /* Try to guess from the file name extension */ - QString fileName = url.fileName(); - QString extension; - if (fileName.lastIndexOf('.') > 0) - extension = fileName.right(fileName.length() - fileName.lastIndexOf('.')); - extension = extension.toLower(); - if (extension == ".jps" || extension == ".pns") { + QString extension = getExtension(url); + if (extension == "jps" || extension == "pns") { inputMode = Input_Right_Left; - } else if (extension == ".mpo") { + } else if (extension == "mpo") { inputMode = Input_Top_Bottom; // this was converted; see digestiblemedia } if (inputMode != Input_Unknown) @@ -123,7 +120,7 @@ void VideoSink::processNewFrame(const QVideoFrame& frame) return; } if (frame.isValid()) { - LOG_DEBUG("video sink gets a valid frame"); + LOG_FIREHOSE("video sink gets a valid frame"); lastFrameWasValid = true; }