1 Commits

Author SHA1 Message Date
Rafał Dzięgiel
5e40079480 gluploader: Handle DMABufs directly 2022-05-08 20:02:32 +02:00
91 changed files with 4858 additions and 5186 deletions

4
.gitattributes vendored
View File

@@ -1,3 +1,5 @@
lib/gst/clapper/* linguist-vendored
extras/**/* linguist-vendored
lib/**/* linguist-vendored
lib/**/**/* linguist-vendored
lib/gst/clapper/gstclapper-mpris* linguist-vendored=false
lib/gst/clapper/gtk4/* linguist-vendored=false

View File

@@ -29,8 +29,8 @@ jobs:
platforms: arm64
- name: Prepare Runtime
run: |
flatpak --system install -y --noninteractive flathub org.freedesktop.Sdk.Extension.rust-nightly/${{ matrix.arch }}/22.08
flatpak --system install -y --noninteractive flathub org.freedesktop.Sdk.Extension.llvm14/${{ matrix.arch }}/22.08
flatpak --system install -y --noninteractive flathub org.freedesktop.Sdk.Extension.rust-nightly/${{ matrix.arch }}/21.08
flatpak --system install -y --noninteractive flathub org.freedesktop.Sdk.Extension.llvm13/${{ matrix.arch }}/21.08
- uses: bilelmoussaoui/flatpak-github-actions/flatpak-builder@v4
name: Build
with:

View File

@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 600
container:
image: bilelmoussaoui/flatpak-github-actions:gnome-43
image: bilelmoussaoui/flatpak-github-actions:gnome-42
options: --privileged
strategy:
matrix:

View File

@@ -9,41 +9,6 @@ scrolledwindow scrollbar.vertical slider {
min-height: 16px;
}
/* Consistent scales color */
scale trough highlight {
color: @accent_fg_color;
background-color: @accent_bg_color;
}
/* Consistent radio buttons color */
.osd radio {
color: @accent_fg_color;
background-color: transparent;
background-image: none;
}
.osd radio:hover,
.osd radio:checked {
background-image: image(rgba(255,255,255,0.1));
}
.osd radio:active {
background-image: image(rgba(255,255,255,0.3));
}
/* Adwaita OSD background color is unacceptable:
* https://gitlab.gnome.org/GNOME/libadwaita/-/issues/454 */
box.osd,
.osd popover contents,
.osd popover arrow,
.osdheaderbar button {
background-color: rgba(38,38,38,0.78);
}
.osdheaderbar button:hover,
.osdheaderbar button:checked {
background-color: rgba(63,63,63,0.78);
}
.osdheaderbar button:active {
background-color: rgba(82,82,82,0.78);
}
/* Adwaita is missing osd ListBox */
.clapperplaylist {
background: none;
@@ -94,8 +59,6 @@ popover contents {
}
.popoverseparator separator {
background-color: @insensitive_fg_color;
margin-left: 3px;
margin-right: 3px;
}
/* Rounded corners */
@@ -166,9 +129,8 @@ scale trough slider {
margin-left: 0px;
margin-right: 4px;
border: 2px solid;
min-width: 16px;
min-height: 16px;
box-shadow: none;
min-width: 17px;
min-height: 17px;
}
/* Also affects popover buttons */
@@ -298,8 +260,7 @@ scale trough slider {
min-width: 6px;
}
.overamp trough highlight {
color: @error_fg_color;
background-color: @error_bg_color;
background: @error_color;
}
/* Elapsed Popover */
@@ -362,7 +323,7 @@ scale trough slider {
border: none;
}
.controlsbox {
background: @popover_bg_color;
background: @theme_bg_color;
}
.gpufriendly {
box-shadow: -8px -8px transparent, 8px 8px transparent;

View File

@@ -6,8 +6,6 @@ Categories=GTK;GNOME;AudioVideo;Player;Video;TV;
MimeType=application/claps;application/mpeg4-iod;application/mpeg4-muxcodetable;application/mxf;application/ogg;application/ram;application/sdp;application/streamingmedia;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;application/x-extension-m4a;application/x-extension-mp4;application/x-flac;application/x-flash-video;application/x-matroska;application/x-ogg;application/x-streamingmedia;audio/3gpp;audio/3gpp2;audio/aac;audio/ac3;audio/amr;audio/amr-wb;audio/basic;audio/dv;audio/eac3;audio/flac;audio/m4a;audio/midi;audio/mp1;audio/mp2;audio/mp3;audio/mp4;audio/mpeg;audio/mpegurl;audio/mpg;audio/ogg;audio/opus;audio/scpls;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.rn-realaudio;audio/wav;audio/webm;audio/x-aac;audio/x-aiff;audio/x-ape;audio/x-flac;audio/x-gsm;audio/x-it;audio/x-m4a;audio/x-matroska;audio/x-mod;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpegurl;audio/x-mpg;audio/x-ms-asf;audio/x-ms-wma;audio/x-musepack;audio/x-pn-aiff;audio/x-pn-au;audio/x-pn-realaudio;audio/x-pn-wav;audio/x-real-audio;audio/x-realaudio;audio/x-s3m;audio/x-scpls;audio/x-shorten;audio/x-speex;audio/x-tta;audio/x-vorbis;audio/x-vorbis+ogg;audio/x-wav;audio/x-wavpack;audio/x-xm;video/3gp;video/3gpp;video/3gpp2;video/divx;video/dv;video/fli;video/flv;video/mp2t;video/mp4;video/mp4v-es;video/mpeg;video/mpeg-system;video/msvideo;video/ogg;video/quicktime;video/vnd.mpegurl;video/vnd.rn-realvideo;video/webm;video/x-avi;video/x-flc;video/x-fli;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-mpeg-system;video/x-mpeg2;video/x-ms-asf;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-msvideo;video/x-nsv;video/x-ogm+ogg;video/x-theora;video/x-theora+ogg;x-content/audio-cdda;x-content/audio-player;x-content/video-dvd;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtmp;x-scheme-handler/rtp;x-scheme-handler/rtsp;
Exec=com.github.rafostar.Clapper %U
Icon=com.github.rafostar.Clapper
DBusActivatable=true
StartupNotify=true
Terminal=false
Type=Application
# Translators: Search terms to find this application. Do NOT translate the semicolons!

View File

@@ -33,7 +33,7 @@
<summary>Unit ID to use with seeking value</summary>
</key>
<key name="resume-enabled" type="b">
<default>false</default>
<default>true</default>
<summary>Ask to resume unfinished video</summary>
</key>
<key name="resume-database" type="s">
@@ -66,6 +66,14 @@
<default>6446</default>
<summary>Listening port to use for incoming WebSocket connections</summary>
</key>
<key name="webapp-enabled" type="b">
<default>false</default>
<summary>Run built-in broadway based web application</summary>
</key>
<key name="webapp-port" type="i">
<default>8086</default>
<summary>Port for running broadwayd service</summary>
</key>
<!-- Tweaks -->
<key name="dark-theme" type="b">
@@ -91,7 +99,7 @@
<summary>Use PipeWire for audio output</summary>
</key>
<key name="play-flags" type="i">
<default>1559</default>
<default>1687</default>
<summary>Set PlayFlags for playbin</summary>
</key>

View File

@@ -48,48 +48,6 @@
</screenshot>
</screenshots>
<releases>
<release version="0.5.2" date="2022-06-24">
<description>
<p>Fixes:</p>
<ul>
<li>Fix time labels display on RTL languages</li>
<li>Improved GL/GLES context automatic selection</li>
</ul>
<p>New translations:</p>
<ul>
<li>Hebrew</li>
</ul>
</description>
</release>
<release version="0.5.1" date="2022-05-29">
<description>
<p>
A quick hotfix release. Fixes problems with new video sink on displays with non-100% scaling applied.
See 0.5.0 version release notes for full recent changelog.
</p>
</description>
</release>
<release version="0.5.0" date="2022-05-28">
<description>
<p>Changes:</p>
<ul>
<li>Includes and uses new, improved GStreamer video sink</li>
<li>All networking ported to libsoup3</li>
<li>A lot of cleanup, including removal of unfinished web application and old YT code</li>
<li>App now supports D-Bus launching (DBusActivatable)</li>
<li>Other small fixes</li>
</ul>
<p>New translations:</p>
<ul>
<li>Arabic</li>
<li>Basque</li>
<li>French</li>
<li>Japanese</li>
<li>Swedish</li>
<li>Turkish</li>
</ul>
</description>
</release>
<release version="0.4.1" date="2021-12-20">
<description>
<p>Fixes:</p>

View File

@@ -1,3 +0,0 @@
[D-BUS Service]
Name=@app_id@
Exec=@bindir@/@app_id@ --gapplication-service

View File

@@ -3,7 +3,7 @@ iconsdir = join_paths(datadir, 'icons', 'hicolor')
appstream_util = find_program('appstream-util', required: false)
if appstream_util.found()
test('Validate appstream file', appstream_util, args: [
'validate-relax', '--nonet',
'validate-relax',
join_paths(meson.current_source_dir(), 'com.github.rafostar.Clapper.metainfo.xml')
])
endif
@@ -32,15 +32,3 @@ gnome.compile_resources('com.github.rafostar.Clapper.data',
install: true,
install_dir: pkgdatadir,
)
dbus_conf = configuration_data()
dbus_conf.set('app_id', meson.project_name())
dbus_conf.set('bindir', bindir)
configure_file(
input: 'com.github.rafostar.Clapper.service.in',
output: 'com.github.rafostar.Clapper.service',
configuration: dbus_conf,
install: true,
install_dir: join_paths(datadir, 'dbus-1', 'services'),
)

View File

@@ -2189,7 +2189,7 @@ gst_clapper_subtitle_info_update (GstClapper * self,
g_object_get (G_OBJECT (self->playbin), "current-suburi", &suburi, NULL);
if (suburi) {
if (self->use_playbin3) {
if (!g_strcmp0 (self->subtitle_sid, stream_info->stream_id))
if (g_str_equal (self->subtitle_sid, stream_info->stream_id))
info->language = g_path_get_basename (suburi);
} else {
g_object_get (G_OBJECT (self->playbin), "current-text", &text_index,
@@ -2387,7 +2387,7 @@ gst_clapper_stream_info_find_from_stream_id (GstClapperMediaInfo * media_info,
list = gst_clapper_media_info_get_stream_list (media_info);
for (l = list; l != NULL; l = l->next) {
info = (GstClapperStreamInfo *) l->data;
if (!g_strcmp0 (info->stream_id, stream_id)) {
if (g_str_equal (info->stream_id, stream_id)) {
return info;
}
}
@@ -3166,16 +3166,26 @@ static void
element_setup_cb (GstElement * playbin, GstElement * element, GstClapper * self)
{
GstElementFactory *factory;
GParamSpec *prop;
if ((factory = gst_element_get_factory (element))) {
factory = gst_element_get_factory (element);
if (factory) {
gchar *plugin_name = gst_object_get_name (GST_OBJECT_CAST (factory));
if (plugin_name) {
GST_INFO_OBJECT (self, "Plugin setup: %s", plugin_name);
/* TODO: Set plugin props */
g_free (plugin_name);
}
g_free (plugin_name);
}
prop = g_object_class_find_property (G_OBJECT_GET_CLASS (element), "user-agent");
if (prop && prop->value_type == G_TYPE_STRING) {
const gchar *user_agent =
"Mozilla/5.0 (X11; Linux x86_64; rv:86.0) Gecko/20100101 Firefox/86.0";
GST_INFO_OBJECT (self, "Setting element user-agent: %s", user_agent);
g_object_set (element, "user-agent", user_agent, NULL);
}
}
@@ -3540,23 +3550,19 @@ gst_clapper_prepare_gstreamer (void)
GST_DEBUG ("Preparing GStreamer plugins");
/* Too many problems with VAAPI decodebin, meanwhile VA works
* fine and there is already a pending MR on GStreamer to enable
* it by default, so we do that a little early */
if (gst_clapper_has_plugin_with_features ("va")) {
gst_clapper_set_feature_rank ("vampeg2dec", rank);
gst_clapper_set_feature_rank ("vah264dec", rank);
gst_clapper_set_feature_rank ("vah265dec", rank);
gst_clapper_set_feature_rank ("vavp8dec", rank);
gst_clapper_set_feature_rank ("vavp9dec", rank);
gst_clapper_set_feature_rank ("vaav1dec", rank);
gst_clapper_set_feature_rank_versioned ("vah264dec", rank, 1, 19, 1);
gst_clapper_set_feature_rank_versioned ("vampeg2dec", rank, 1, 19, 1);
}
/* We do promise working HW accel out of box, so enable NVDEC too */
if (gst_clapper_has_plugin_with_features ("nvcodec")) {
gst_clapper_set_feature_rank ("nvh264dec", rank + 4);
gst_clapper_set_feature_rank ("nvh265dec", rank + 4);
gst_clapper_set_feature_rank ("nvvp8dec", rank + 4);
gst_clapper_set_feature_rank ("nvvp9dec", rank + 4);
}
if (gst_clapper_has_plugin_with_features ("v4l2codecs")) {
if (!gst_clapper_set_feature_rank_versioned ("v4l2slh264dec", rank + 10, 1, 19, 1))
gst_clapper_set_feature_rank ("v4l2slh264dec", GST_RANK_NONE);
if (!gst_clapper_set_feature_rank_versioned ("v4l2slvp8dec", rank + 10, 1, 19, 2))
gst_clapper_set_feature_rank ("v4l2slvp8dec", GST_RANK_NONE);
}
/* After setting defaults, update them from ENV */

View File

@@ -43,10 +43,6 @@ if not gtk4_dep.version().version_compare('>=4.0.0')
error('GTK4 version on this system is too old')
endif
if not gir.found()
error('Cannot build lib without GIR support')
endif
if gst_gl_have_window_x11 and (gst_gl_have_platform_egl or gst_gl_have_platform_glx)
gtk_x11_dep = dependency('gtk4-x11', required: false)
if gtk_x11_dep.found()
@@ -80,18 +76,6 @@ gstclapper_mpris_gdbus = gnome.gdbus_codegen('gstclapper-mpris-gdbus',
namespace: 'GstClapperMpris'
)
gstclapper_deps = [
gtk4_dep, glib_dep, gio_dep,
gstbase_dep, gstvideo_dep, gstaudio_dep,
gsttag_dep, gstpbutils_dep, libm
] + gtk_deps
if os_unix
gstclapper_deps += giounix_dep
else
gstclapper_deps += giowin_dep
endif
gstclapper = library('gstclapper-' + api_version,
gstclapper_sources + gstclapper_mpris_gdbus,
c_args: gstclapper_defines,
@@ -100,7 +84,9 @@ gstclapper = library('gstclapper-' + api_version,
version: libversion,
install: true,
install_dir: pkglibdir,
dependencies: gstclapper_deps,
dependencies: [gtk4_dep, glib_dep, gio_dep, giounix_dep,
gstbase_dep, gstvideo_dep, gstaudio_dep,
gsttag_dep, gstpbutils_dep, libm] + gtk_deps,
)
clapper_gir = gnome.generate_gir(gstclapper,

View File

@@ -1,86 +0,0 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "gstclappercontexthandler.h"
#define parent_class gst_clapper_context_handler_parent_class
G_DEFINE_TYPE (GstClapperContextHandler, gst_clapper_context_handler, GST_TYPE_OBJECT);
static gboolean
_default_handle_context_query (GstClapperContextHandler *self,
GstBaseSink *bsink, GstQuery *query)
{
GST_FIXME_OBJECT (self, "Need to handle context query");
return FALSE;
}
static void
gst_clapper_context_handler_init (GstClapperContextHandler *self)
{
}
static void
gst_clapper_context_handler_finalize (GObject *object)
{
GstClapperContextHandler *self = GST_CLAPPER_CONTEXT_HANDLER_CAST (object);
GST_TRACE_OBJECT (self, "Finalize");
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
}
static void
gst_clapper_context_handler_class_init (GstClapperContextHandlerClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
GstClapperContextHandlerClass *handler_class = (GstClapperContextHandlerClass *) klass;
gobject_class->finalize = gst_clapper_context_handler_finalize;
handler_class->handle_context_query = _default_handle_context_query;
}
gboolean
gst_clapper_context_handler_handle_context_query (GstClapperContextHandler *self,
GstBaseSink *bsink, GstQuery *query)
{
GstClapperContextHandlerClass *handler_class = GST_CLAPPER_CONTEXT_HANDLER_GET_CLASS (self);
return handler_class->handle_context_query (self, bsink, query);
}
GstClapperContextHandler *
gst_clapper_context_handler_obtain_with_type (GPtrArray *context_handlers, GType type)
{
guint i;
for (i = 0; i < context_handlers->len; i++) {
GstClapperContextHandler *handler = g_ptr_array_index (context_handlers, i);
if (G_TYPE_CHECK_INSTANCE_TYPE (handler, type))
return gst_object_ref (handler);
}
return NULL;
}

View File

@@ -1,62 +0,0 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once
#include <gst/gst.h>
#include <gst/base/gstbasesink.h>
G_BEGIN_DECLS
#define GST_TYPE_CLAPPER_CONTEXT_HANDLER (gst_clapper_context_handler_get_type())
#define GST_IS_CLAPPER_CONTEXT_HANDLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_CLAPPER_CONTEXT_HANDLER))
#define GST_IS_CLAPPER_CONTEXT_HANDLER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_CLAPPER_CONTEXT_HANDLER))
#define GST_CLAPPER_CONTEXT_HANDLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_CLAPPER_CONTEXT_HANDLER, GstClapperContextHandlerClass))
#define GST_CLAPPER_CONTEXT_HANDLER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_CLAPPER_CONTEXT_HANDLER, GstClapperContextHandler))
#define GST_CLAPPER_CONTEXT_HANDLER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_CLAPPER_CONTEXT_HANDLER, GstClapperContextHandlerClass))
#define GST_CLAPPER_CONTEXT_HANDLER_CAST(obj) ((GstClapperContextHandler *)(obj))
typedef struct _GstClapperContextHandler GstClapperContextHandler;
typedef struct _GstClapperContextHandlerClass GstClapperContextHandlerClass;
#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GstClapperContextHandler, gst_object_unref)
#endif
struct _GstClapperContextHandler
{
GstObject parent;
};
struct _GstClapperContextHandlerClass
{
GstObjectClass parent_class;
gboolean (* handle_context_query) (GstClapperContextHandler *handler,
GstBaseSink *bsink,
GstQuery *query);
};
GType gst_clapper_context_handler_get_type (void);
gboolean gst_clapper_context_handler_handle_context_query (GstClapperContextHandler *handler, GstBaseSink *bsink, GstQuery *query);
GstClapperContextHandler * gst_clapper_context_handler_obtain_with_type (GPtrArray *context_handlers, GType type);
G_END_DECLS

View File

@@ -89,14 +89,6 @@ _default_create_pool (GstClapperImporter *self, GstStructure **config)
return NULL;
}
static void
_default_add_allocation_metas (GstClapperImporter *importer, GstQuery *query)
{
/* Importer base class handles GstVideoOverlayCompositionMeta */
gst_query_add_allocation_meta (query, GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, NULL);
gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL);
}
static GdkTexture *
_default_generate_texture (GstClapperImporter *self,
GstBuffer *buffer, GstVideoInfo *v_info)
@@ -127,8 +119,6 @@ gst_clapper_importer_finalize (GObject *object)
GST_TRACE ("Finalize");
gst_clear_caps (&self->pending_caps);
gst_clear_buffer (&self->pending_buffer);
gst_clear_buffer (&self->buffer);
@@ -152,7 +142,6 @@ gst_clapper_importer_class_init (GstClapperImporterClass *klass)
gobject_class->finalize = gst_clapper_importer_finalize;
importer_class->create_pool = _default_create_pool;
importer_class->add_allocation_metas = _default_add_allocation_metas;
importer_class->generate_texture = _default_generate_texture;
}
@@ -257,9 +246,6 @@ gst_clapper_importer_prepare_overlays_locked (GstClapperImporter *self)
if ((v_meta = gst_buffer_get_video_meta (comp_buffer))) {
gst_video_info_set_format (&v_info, v_meta->format, v_meta->width, v_meta->height);
v_info.stride[0] = v_meta->stride[0];
if (alpha_flags & GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA)
v_info.flags |= GST_VIDEO_FLAG_PREMULTIPLIED_ALPHA;
}
if (G_UNLIKELY (!gst_video_frame_map (&comp_frame, &v_info, comp_buffer, GST_MAP_READ)))
@@ -304,13 +290,37 @@ gst_clapper_importer_prepare_overlays_locked (GstClapperImporter *self)
GST_LOG_OBJECT (self, "Prepared overlays: %u", self->pending_overlays->len);
}
gboolean
gst_clapper_importer_prepare (GstClapperImporter *self)
{
GstClapperImporterClass *importer_class = GST_CLAPPER_IMPORTER_GET_CLASS (self);
if (importer_class->prepare) {
if (!importer_class->prepare (self))
return FALSE;
}
GST_DEBUG_OBJECT (self, "Importer prepared");
return TRUE;
}
void
gst_clapper_importer_share_data (GstClapperImporter *self, GstClapperImporter *dest)
{
GstClapperImporterClass *importer_class = GST_CLAPPER_IMPORTER_GET_CLASS (self);
if (importer_class->share_data)
importer_class->share_data (self, dest);
}
void
gst_clapper_importer_set_caps (GstClapperImporter *self, GstCaps *caps)
{
GstClapperImporterClass *importer_class = GST_CLAPPER_IMPORTER_GET_CLASS (self);
GST_OBJECT_LOCK (self);
gst_caps_replace (&self->pending_caps, caps);
self->has_pending_v_info = gst_video_info_from_caps (&self->pending_v_info, caps);
GST_OBJECT_UNLOCK (self);
if (importer_class->set_caps)
@@ -320,14 +330,10 @@ gst_clapper_importer_set_caps (GstClapperImporter *self, GstCaps *caps)
void
gst_clapper_importer_set_buffer (GstClapperImporter *self, GstBuffer *buffer)
{
/* Both overlays and pending buffer must be
* set within a single importer locking */
GST_OBJECT_LOCK (self);
/* Pending v_info, buffer and overlays must be
* set within a single importer locking */
if (self->pending_caps) {
self->has_pending_v_info = gst_video_info_from_caps (&self->pending_v_info, self->pending_caps);
gst_clear_caps (&self->pending_caps);
}
gst_buffer_replace (&self->pending_buffer, buffer);
gst_clapper_importer_prepare_overlays_locked (self);
@@ -347,12 +353,25 @@ gst_clapper_importer_add_allocation_metas (GstClapperImporter *self, GstQuery *q
{
GstClapperImporterClass *importer_class = GST_CLAPPER_IMPORTER_GET_CLASS (self);
importer_class->add_allocation_metas (self, query);
if (importer_class->add_allocation_metas)
importer_class->add_allocation_metas (self, query);
}
gboolean
gst_clapper_importer_handle_context_query (GstClapperImporter *self,
GstBaseSink *bsink, GstQuery *query)
{
GstClapperImporterClass *importer_class = GST_CLAPPER_IMPORTER_GET_CLASS (self);
if (!importer_class->handle_context_query)
return FALSE;
return importer_class->handle_context_query (self, bsink, query);
}
void
gst_clapper_importer_snapshot (GstClapperImporter *self, GdkSnapshot *snapshot,
gdouble width, gdouble height)
gdouble width, gdouble height, gfloat scale_x, gfloat scale_y)
{
guint i;
gboolean buffer_changed;
@@ -361,13 +380,15 @@ gst_clapper_importer_snapshot (GstClapperImporter *self, GdkSnapshot *snapshot,
* lock ourselves to make sure everything matches */
GST_OBJECT_LOCK (self);
if (self->has_pending_v_info) {
buffer_changed = gst_buffer_replace (&self->buffer, self->pending_buffer);
/* Only replace v_info when buffer changed, this way
* we still use old (correct) v_info when resizing */
if (buffer_changed && self->has_pending_v_info) {
self->v_info = self->pending_v_info;
self->has_pending_v_info = FALSE;
}
buffer_changed = gst_buffer_replace (&self->buffer, self->pending_buffer);
/* Ref overlays associated with current buffer */
for (i = 0; i < self->pending_overlays->len; i++) {
GstClapperGdkOverlay *overlay = g_ptr_array_index (self->pending_overlays, i);
@@ -396,21 +417,12 @@ gst_clapper_importer_snapshot (GstClapperImporter *self, GdkSnapshot *snapshot,
if (G_LIKELY (self->texture)) {
gtk_snapshot_append_texture (snapshot, self->texture, &GRAPHENE_RECT_INIT (0, 0, width, height));
if (self->overlays->len > 0) {
gfloat scale_x, scale_y;
for (i = 0; i < self->overlays->len; i++) {
GstClapperGdkOverlay *overlay = g_ptr_array_index (self->overlays, i);
/* FIXME: GStreamer scales subtitles without considering pixel aspect ratio.
* See: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/20 */
scale_x = (gfloat) width / GST_VIDEO_INFO_WIDTH (&self->v_info);
scale_y = (gfloat) height / GST_VIDEO_INFO_HEIGHT (&self->v_info);
for (i = 0; i < self->overlays->len; i++) {
GstClapperGdkOverlay *overlay = g_ptr_array_index (self->overlays, i);
gtk_snapshot_append_texture (snapshot, overlay->texture,
&GRAPHENE_RECT_INIT (overlay->x * scale_x, overlay->y * scale_y,
overlay->width * scale_x, overlay->height * scale_y));
}
gtk_snapshot_append_texture (snapshot, overlay->texture,
&GRAPHENE_RECT_INIT (overlay->x * scale_x, overlay->y * scale_y,
overlay->width * scale_x, overlay->height * scale_y));
}
} else {
GST_ERROR_OBJECT (self, "Failed import of %" GST_PTR_FORMAT, self->buffer);

View File

@@ -33,11 +33,10 @@ G_BEGIN_DECLS
#define GST_CLAPPER_IMPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_CLAPPER_IMPORTER, GstClapperImporterClass))
#define GST_CLAPPER_IMPORTER_CAST(obj) ((GstClapperImporter *)(obj))
#define GST_CLAPPER_IMPORTER_DEFINE(camel,lower,type) \
G_DEFINE_TYPE (camel, lower, type) \
G_MODULE_EXPORT GstClapperImporter *make_importer (GPtrArray *context_handlers); \
G_MODULE_EXPORT GstCaps *make_caps (gboolean is_template, \
GstRank *rank, GPtrArray *context_handlers);
#define GST_CLAPPER_IMPORTER_DEFINE(camel,lower,type) \
G_DEFINE_TYPE (camel, lower, type) \
G_MODULE_EXPORT GstClapperImporter *make_importer (void); \
G_MODULE_EXPORT GstCaps *make_caps (GstRank *rank, GStrv *context_types);
typedef struct _GstClapperImporter GstClapperImporter;
typedef struct _GstClapperImporterClass GstClapperImporterClass;
@@ -50,7 +49,6 @@ struct _GstClapperImporter
{
GstObject parent;
GstCaps *pending_caps;
GstBuffer *pending_buffer, *buffer;
GPtrArray *pending_overlays, *overlays;
GstVideoInfo pending_v_info, v_info;
@@ -65,9 +63,18 @@ struct _GstClapperImporterClass
{
GstObjectClass parent_class;
gboolean (* prepare) (GstClapperImporter *importer);
void (* share_data) (GstClapperImporter *src,
GstClapperImporter *dest);
void (* set_caps) (GstClapperImporter *importer,
GstCaps *caps);
gboolean (* handle_context_query) (GstClapperImporter *importer,
GstBaseSink *bsink,
GstQuery *query);
GstBufferPool * (* create_pool) (GstClapperImporter *importer,
GstStructure **config);
@@ -81,12 +88,15 @@ struct _GstClapperImporterClass
GType gst_clapper_importer_get_type (void);
gboolean gst_clapper_importer_prepare (GstClapperImporter *importer);
void gst_clapper_importer_share_data (GstClapperImporter *importer, GstClapperImporter *dest);
gboolean gst_clapper_importer_handle_context_query (GstClapperImporter *importer, GstBaseSink *bsink, GstQuery *query);
GstBufferPool * gst_clapper_importer_create_pool (GstClapperImporter *importer, GstStructure **config);
void gst_clapper_importer_add_allocation_metas (GstClapperImporter *importer, GstQuery *query);
void gst_clapper_importer_set_caps (GstClapperImporter *importer, GstCaps *caps);
void gst_clapper_importer_set_buffer (GstClapperImporter *importer, GstBuffer *buffer);
void gst_clapper_importer_snapshot (GstClapperImporter *importer, GdkSnapshot *snapshot, gdouble width, gdouble height);
void gst_clapper_importer_snapshot (GstClapperImporter *importer, GdkSnapshot *snapshot, gdouble width, gdouble height, gfloat scale_x, gfloat scale_y);
G_END_DECLS

View File

@@ -25,155 +25,135 @@
#include "gstclapperimporterloader.h"
#include "gstclapperimporter.h"
#include "gstclappercontexthandler.h"
#define GST_CAT_DEFAULT gst_clapper_importer_loader_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
#define parent_class gst_clapper_importer_loader_parent_class
G_DEFINE_TYPE (GstClapperImporterLoader, gst_clapper_importer_loader, GST_TYPE_OBJECT);
typedef GstClapperImporter* (* MakeImporter) (GPtrArray *context_handlers);
typedef GstCaps* (* MakeCaps) (gboolean is_template, GstRank *rank, GPtrArray *context_handlers);
typedef GstClapperImporter* (* MakeImporter) (void);
typedef GstCaps* (* MakeCaps) (GstRank *rank, GStrv *context_types);
typedef struct
{
GModule *module;
gchar *module_path;
GModule *open_module;
GstCaps *caps;
GstRank rank;
GStrv context_types;
} GstClapperImporterData;
static void
gst_clapper_importer_data_free (GstClapperImporterData *data)
{
GST_TRACE ("Freeing importer data: %" GST_PTR_FORMAT, data);
g_free (data->module_path);
if (data->open_module)
g_module_close (data->open_module);
gst_clear_caps (&data->caps);
g_strfreev (data->context_types);
g_free (data);
}
static gboolean
_open_importer (GstClapperImporterData *data)
{
g_return_val_if_fail (data && data->module_path, FALSE);
/* Already open */
if (data->open_module)
return TRUE;
GST_DEBUG ("Opening module: %s", data->module_path);
data->open_module = g_module_open (data->module_path, G_MODULE_BIND_LAZY);
if (!data->open_module) {
GST_WARNING ("Could not load importer: %s, reason: %s",
data->module_path, g_module_error ());
return FALSE;
}
GST_DEBUG ("Opened importer module");
/* Make sure module stays loaded. Seems to be needed for
* reusing exported symbols from the same module again */
g_module_make_resident (data->open_module);
return TRUE;
}
static void
_close_importer (GstClapperImporterData *data)
{
if (!data || !data->open_module)
return;
if (G_LIKELY (g_module_close (data->open_module)))
GST_DEBUG ("Closed module: %s", data->module_path);
else
GST_WARNING ("Could not close importer module");
data->open_module = NULL;
}
static GstClapperImporter *
_obtain_importer_internal (GstClapperImporterData *data)
{
MakeImporter make_importer;
GstClapperImporter *importer = NULL;
if (!_open_importer (data))
goto finish;
if (!g_module_symbol (data->open_module, "make_importer", (gpointer *) &make_importer)
|| make_importer == NULL) {
GST_WARNING ("Make function missing in importer");
goto fail;
}
/* Do not close the module, we are gonna continue using it */
if ((importer = make_importer ()))
goto finish;
fail:
_close_importer (data);
finish:
return importer;
}
static GstClapperImporterData *
_obtain_importer_data (GModule *module, gboolean is_template, GPtrArray *context_handlers)
_fill_importer_data (const gchar *module_path)
{
MakeCaps make_caps;
GstClapperImporterData *data;
GST_DEBUG ("Found importer: %s", g_module_name (module));
data = g_new0 (GstClapperImporterData, 1);
data->module_path = g_strdup (module_path);
data->open_module = g_module_open (data->module_path, G_MODULE_BIND_LAZY);
if (!g_module_symbol (module, "make_caps", (gpointer *) &make_caps)
if (!data->open_module)
goto fail;
if (!g_module_symbol (data->open_module, "make_caps", (gpointer *) &make_caps)
|| make_caps == NULL) {
GST_WARNING ("Make caps function missing in importer");
return NULL;
goto fail;
}
data = g_new0 (GstClapperImporterData, 1);
data->module = module;
data->caps = make_caps (is_template, &data->rank, context_handlers);
data->caps = make_caps (&data->rank, &data->context_types);
GST_DEBUG ("Caps reading %ssuccessful", data->caps ? "" : "un");
GST_TRACE ("Created importer data: %" GST_PTR_FORMAT, data);
if (!data->caps)
goto fail;
if (G_UNLIKELY (!data->caps)) {
if (!is_template) {
GST_ERROR ("Invalid importer without caps: %s",
g_module_name (data->module));
} else {
/* When importer cannot be actually used, due to e.g. unsupported HW */
GST_DEBUG ("No actual caps returned from importer");
}
gst_clapper_importer_data_free (data);
return NULL;
}
GST_DEBUG ("Importer caps: %" GST_PTR_FORMAT, data->caps);
/* Once we obtain importer data, close module afterwards */
_close_importer (data);
return data;
}
static GstClapperImporter *
_obtain_importer_internal (GModule *module, GPtrArray *context_handlers)
{
MakeImporter make_importer;
GstClapperImporter *importer;
fail:
gst_clapper_importer_data_free (data);
if (!g_module_symbol (module, "make_importer", (gpointer *) &make_importer)
|| make_importer == NULL) {
GST_WARNING ("Make function missing in importer");
return NULL;
}
importer = make_importer (context_handlers);
GST_TRACE ("Created importer: %" GST_PTR_FORMAT, importer);
return importer;
}
static gpointer
_obtain_available_modules_once (G_GNUC_UNUSED gpointer data)
{
GPtrArray *modules;
GFile *dir;
GFileEnumerator *dir_enum;
GError *error = NULL;
GST_INFO ("Preparing modules");
modules = g_ptr_array_new ();
dir = g_file_new_for_path (CLAPPER_SINK_IMPORTER_PATH);
if ((dir_enum = g_file_enumerate_children (dir,
G_FILE_ATTRIBUTE_STANDARD_NAME,
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, &error))) {
while (TRUE) {
GFileInfo *info = NULL;
GModule *module;
gchar *module_path;
const gchar *module_name;
if (!g_file_enumerator_iterate (dir_enum, &info,
NULL, NULL, &error) || !info)
break;
module_name = g_file_info_get_name (info);
if (!g_str_has_suffix (module_name, G_MODULE_SUFFIX))
continue;
module_path = g_module_build_path (CLAPPER_SINK_IMPORTER_PATH, module_name);
module = g_module_open (module_path, G_MODULE_BIND_LAZY);
g_free (module_path);
if (!module) {
GST_WARNING ("Could not read module: %s, reason: %s",
module_name, g_module_error ());
continue;
}
GST_INFO ("Found module: %s", module_name);
g_ptr_array_add (modules, module);
}
g_object_unref (dir_enum);
}
g_object_unref (dir);
if (error) {
GST_ERROR ("Could not load module, reason: %s",
(error->message) ? error->message : "unknown");
g_error_free (error);
}
return modules;
}
static const GPtrArray *
gst_clapper_importer_loader_get_available_modules (void)
{
static GOnce once = G_ONCE_INIT;
g_once (&once, _obtain_available_modules_once, NULL);
return (const GPtrArray *) once.retval;
return NULL;
}
static gint
@@ -187,108 +167,93 @@ _sort_importers_cb (gconstpointer a, gconstpointer b)
return (data_b->rank - data_a->rank);
}
static GPtrArray *
_obtain_importers (gboolean is_template, GPtrArray *context_handlers)
static gpointer
_obtain_available_importers (G_GNUC_UNUSED gpointer data)
{
const GPtrArray *modules;
GPtrArray *importers;
guint i;
GFile *dir;
GFileEnumerator *dir_enum;
GError *error = NULL;
GST_DEBUG ("Checking %s importers",
(is_template) ? "available" : "usable");
modules = gst_clapper_importer_loader_get_available_modules ();
importers = g_ptr_array_new_with_free_func (
(GDestroyNotify) gst_clapper_importer_data_free);
for (i = 0; i < modules->len; i++) {
GModule *module = g_ptr_array_index (modules, i);
GstClapperImporterData *data;
GST_INFO ("Checking available clapper sink importers");
if ((data = _obtain_importer_data (module, is_template, context_handlers)))
dir = g_file_new_for_path (CLAPPER_SINK_IMPORTER_PATH);
if ((dir_enum = g_file_enumerate_children (dir,
G_FILE_ATTRIBUTE_STANDARD_NAME,
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, &error))) {
while (TRUE) {
GFileInfo *info = NULL;
GstClapperImporterData *data;
gchar *module_path;
const gchar *module_name;
if (!g_file_enumerator_iterate (dir_enum, &info,
NULL, NULL, &error) || !info)
break;
module_name = g_file_info_get_name (info);
if (!g_str_has_suffix (module_name, G_MODULE_SUFFIX))
continue;
module_path = g_module_build_path (CLAPPER_SINK_IMPORTER_PATH, module_name);
data = _fill_importer_data (module_path);
g_free (module_path);
if (!data) {
GST_WARNING ("Could not read importer data: %s", module_name);
continue;
}
GST_INFO ("Found importer: %s, caps: %" GST_PTR_FORMAT, module_name, data->caps);
g_ptr_array_add (importers, data);
}
g_object_unref (dir_enum);
}
g_object_unref (dir);
if (error) {
GST_ERROR ("Could not load importer, reason: %s",
(error->message) ? error->message : "unknown");
g_error_free (error);
}
g_ptr_array_sort (importers, (GCompareFunc) _sort_importers_cb);
GST_DEBUG ("Found %i %s importers", importers->len,
(is_template) ? "available" : "usable");
return importers;
}
GstClapperImporterLoader *
gst_clapper_importer_loader_new (void)
static const GPtrArray *
gst_clapper_importer_loader_get_available_importers (void)
{
return g_object_new (GST_TYPE_CLAPPER_IMPORTER_LOADER, NULL);
static GOnce once = G_ONCE_INIT;
g_once (&once, _obtain_available_importers, NULL);
return (const GPtrArray *) once.retval;
}
static GstCaps *
_make_caps_for_importers (const GPtrArray *importers)
static GstClapperImporterData *
_find_open_importer_data (const GPtrArray *importers)
{
GstCaps *caps = gst_caps_new_empty ();
guint i;
for (i = 0; i < importers->len; i++) {
GstClapperImporterData *data = g_ptr_array_index (importers, i);
gst_caps_append (caps, gst_caps_ref (data->caps));
if (data->open_module)
return data;
}
return caps;
return NULL;
}
GstPadTemplate *
gst_clapper_importer_loader_make_sink_pad_template (void)
{
GPtrArray *importers;
GstCaps *caps;
GstPadTemplate *templ;
/* This is only called once from sink class init function */
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperimporterloader", 0,
"Clapper Importer Loader");
GST_DEBUG ("Making sink pad template");
importers = _obtain_importers (TRUE, NULL);
caps = _make_caps_for_importers (importers);
g_ptr_array_unref (importers);
if (G_UNLIKELY (gst_caps_is_empty (caps)))
gst_caps_append (caps, gst_caps_new_any ());
templ = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, caps);
gst_caps_unref (caps);
GST_TRACE ("Created sink pad template");
return templ;
}
GstCaps *
gst_clapper_importer_loader_make_actual_caps (GstClapperImporterLoader *self)
{
return _make_caps_for_importers (self->importers);
}
gboolean
gst_clapper_importer_loader_handle_context_query (GstClapperImporterLoader *self,
GstBaseSink *bsink, GstQuery *query)
{
guint i;
for (i = 0; i < self->context_handlers->len; i++) {
GstClapperContextHandler *handler = g_ptr_array_index (self->context_handlers, i);
if (gst_clapper_context_handler_handle_context_query (handler, bsink, query))
return TRUE;
}
return FALSE;
}
static const GstClapperImporterData *
static GstClapperImporterData *
_get_importer_data_for_caps (const GPtrArray *importers, const GstCaps *caps)
{
guint i;
@@ -305,81 +270,148 @@ _get_importer_data_for_caps (const GPtrArray *importers, const GstCaps *caps)
return NULL;
}
gboolean
gst_clapper_importer_loader_find_importer_for_caps (GstClapperImporterLoader *self,
GstCaps *caps, GstClapperImporter **importer)
static GstClapperImporterData *
_get_importer_data_for_context_type (const GPtrArray *importers, const gchar *context_type)
{
const GstClapperImporterData *data = NULL;
guint i;
for (i = 0; i < importers->len; i++) {
GstClapperImporterData *data = g_ptr_array_index (importers, i);
guint j;
if (!data->context_types)
continue;
for (j = 0; data->context_types[j]; j++) {
if (strcmp (context_type, data->context_types[j]))
continue;
return data;
}
}
return NULL;
}
void
gst_clapper_importer_loader_unload_all (void)
{
const GPtrArray *importers;
guint i;
importers = gst_clapper_importer_loader_get_available_importers ();
GST_TRACE ("Unloading all open modules");
for (i = 0; i < importers->len; i++) {
GstClapperImporterData *data = g_ptr_array_index (importers, i);
_close_importer (data);
}
}
GstPadTemplate *
gst_clapper_importer_loader_make_sink_pad_template (void)
{
const GPtrArray *importers;
GstCaps *sink_caps;
GstPadTemplate *templ;
guint i;
/* This is only called once from sink class init function */
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperimporterloader", 0,
"Clapper Importer Loader");
importers = gst_clapper_importer_loader_get_available_importers ();
sink_caps = gst_caps_new_empty ();
for (i = 0; i < importers->len; i++) {
GstClapperImporterData *data = g_ptr_array_index (importers, i);
GstCaps *copied_caps;
copied_caps = gst_caps_copy (data->caps);
gst_caps_append (sink_caps, copied_caps);
}
if (G_UNLIKELY (gst_caps_is_empty (sink_caps)))
gst_caps_append (sink_caps, gst_caps_new_any ());
templ = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, sink_caps);
gst_caps_unref (sink_caps);
return templ;
}
static gboolean
_find_importer_internal (GstCaps *caps, GstQuery *query, GstClapperImporter **importer)
{
const GPtrArray *importers;
GstClapperImporterData *old_data = NULL, *new_data = NULL;
GstClapperImporter *found_importer = NULL;
GST_OBJECT_LOCK (self);
importers = gst_clapper_importer_loader_get_available_importers ();
old_data = _find_open_importer_data (importers);
GST_DEBUG_OBJECT (self, "Requested importer for caps: %" GST_PTR_FORMAT, caps);
data = _get_importer_data_for_caps (self->importers, caps);
if (caps) {
GST_DEBUG ("Requested importer for caps: %" GST_PTR_FORMAT, caps);
new_data = _get_importer_data_for_caps (importers, caps);
} else if (query) {
const gchar *context_type;
GST_LOG_OBJECT (self, "Old importer path: %s, new path: %s",
(self->last_module) ? g_module_name (self->last_module) : NULL,
(data) ? g_module_name (data->module) : NULL);
gst_query_parse_context_type (query, &context_type);
if (G_UNLIKELY (!data)) {
gst_clear_object (importer);
goto finish;
GST_DEBUG ("Requested importer for context: %s", context_type);
new_data = _get_importer_data_for_context_type (importers, context_type);
/* In case missing importer for context query, leave the old one.
* We should allow some queries to go through unresponded */
if (!new_data)
new_data = old_data;
}
GST_LOG ("Old importer path: %s, new path: %s",
(old_data != NULL) ? old_data->module_path : NULL,
(new_data != NULL) ? new_data->module_path : NULL);
if (old_data == new_data) {
GST_DEBUG ("No importer change");
if (*importer && caps)
gst_clapper_importer_set_caps (*importer, caps);
return (*importer != NULL);
}
if (*importer && (self->last_module == data->module)) {
GST_DEBUG_OBJECT (self, "No importer change");
if (new_data) {
found_importer = _obtain_importer_internal (new_data);
gst_clapper_importer_set_caps (*importer, caps);
goto finish;
if (*importer && found_importer)
gst_clapper_importer_share_data (*importer, found_importer);
}
found_importer = _obtain_importer_internal (data->module, self->context_handlers);
gst_clear_object (importer);
_close_importer (old_data);
if (!found_importer)
goto finish;
if (found_importer && gst_clapper_importer_prepare (found_importer)) {
if (caps)
gst_clapper_importer_set_caps (found_importer, caps);
gst_clapper_importer_set_caps (found_importer, caps);
*importer = found_importer;
return TRUE;
}
*importer = found_importer;
gst_clear_object (&found_importer);
_close_importer (new_data);
finish:
self->last_module = (*importer && data)
? data->module
: NULL;
GST_OBJECT_UNLOCK (self);
return (*importer != NULL);
return FALSE;
}
static void
gst_clapper_importer_loader_init (GstClapperImporterLoader *self)
gboolean
gst_clapper_importer_loader_find_importer_for_caps (GstCaps *caps, GstClapperImporter **importer)
{
self->context_handlers = g_ptr_array_new_with_free_func (
(GDestroyNotify) gst_object_unref);
self->importers = _obtain_importers (FALSE, self->context_handlers);
return _find_importer_internal (caps, NULL, importer);
}
static void
gst_clapper_importer_loader_finalize (GObject *object)
gboolean
gst_clapper_importer_loader_find_importer_for_context_query (GstQuery *query, GstClapperImporter **importer)
{
GstClapperImporterLoader *self = GST_CLAPPER_IMPORTER_LOADER_CAST (object);
GST_TRACE ("Finalize");
if (self->importers)
g_ptr_array_unref (self->importers);
g_ptr_array_unref (self->context_handlers);
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
}
static void
gst_clapper_importer_loader_class_init (GstClapperImporterLoaderClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
gobject_class->finalize = gst_clapper_importer_loader_finalize;
return _find_importer_internal (NULL, query, importer);
}

View File

@@ -20,35 +20,17 @@
#pragma once
#include <gst/gst.h>
#include <gst/base/gstbasesink.h>
#include "gstclapperimporter.h"
G_BEGIN_DECLS
#define GST_TYPE_CLAPPER_IMPORTER_LOADER (gst_clapper_importer_loader_get_type())
G_DECLARE_FINAL_TYPE (GstClapperImporterLoader, gst_clapper_importer_loader, GST, CLAPPER_IMPORTER_LOADER, GstObject)
GstPadTemplate * gst_clapper_importer_loader_make_sink_pad_template (void);
#define GST_CLAPPER_IMPORTER_LOADER_CAST(obj) ((GstClapperImporterLoader *)(obj))
gboolean gst_clapper_importer_loader_find_importer_for_caps (GstCaps *caps, GstClapperImporter **importer);
struct _GstClapperImporterLoader
{
GstObject parent;
gboolean gst_clapper_importer_loader_find_importer_for_context_query (GstQuery *query, GstClapperImporter **importer);
GModule *last_module;
GPtrArray *importers;
GPtrArray *context_handlers;
};
GstClapperImporterLoader * gst_clapper_importer_loader_new (void);
GstPadTemplate * gst_clapper_importer_loader_make_sink_pad_template (void);
GstCaps * gst_clapper_importer_loader_make_actual_caps (GstClapperImporterLoader *loader);
gboolean gst_clapper_importer_loader_handle_context_query (GstClapperImporterLoader *loader, GstBaseSink *bsink, GstQuery *query);
gboolean gst_clapper_importer_loader_find_importer_for_caps (GstClapperImporterLoader *loader, GstCaps *caps, GstClapperImporter **importer);
void gst_clapper_importer_loader_unload_all (void);
G_END_DECLS

View File

@@ -53,18 +53,14 @@ gst_clapper_paintable_class_init (GstClapperPaintableClass *klass)
static void
gst_clapper_paintable_init (GstClapperPaintable *self)
{
self->display_width = 1;
self->display_height = 1;
self->display_aspect_ratio = 1.0;
self->par_n = DEFAULT_PAR_N;
self->par_d = DEFAULT_PAR_D;
self->pixel_aspect = ((gdouble) self->par_d / self->par_n);
g_mutex_init (&self->lock);
g_mutex_init (&self->importer_lock);
gst_video_info_init (&self->v_info);
g_weak_ref_init (&self->widget, NULL);
g_weak_ref_init (&self->importer, NULL);
gdk_rgba_parse (&self->bg, "black");
}
@@ -83,10 +79,6 @@ gst_clapper_paintable_dispose (GObject *object)
GST_CLAPPER_PAINTABLE_UNLOCK (self);
GST_CLAPPER_PAINTABLE_IMPORTER_LOCK (self);
gst_clear_object (&self->importer);
GST_CLAPPER_PAINTABLE_IMPORTER_UNLOCK (self);
GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
}
@@ -98,9 +90,8 @@ gst_clapper_paintable_finalize (GObject *object)
GST_TRACE ("Finalize");
g_weak_ref_clear (&self->widget);
g_weak_ref_clear (&self->importer);
g_mutex_clear (&self->lock);
g_mutex_clear (&self->importer_lock);
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
}
@@ -158,6 +149,8 @@ invalidate_paintable_size_internal (GstClapperPaintable *self)
display_ratio_num = self->display_ratio_num;
display_ratio_den = self->display_ratio_den;
self->pixel_aspect = ((gdouble) self->par_d / self->par_n);
GST_CLAPPER_PAINTABLE_UNLOCK (self);
if (video_height % display_ratio_den == 0) {
@@ -239,9 +232,7 @@ gst_clapper_paintable_set_widget (GstClapperPaintable *self, GtkWidget *widget)
void
gst_clapper_paintable_set_importer (GstClapperPaintable *self, GstClapperImporter *importer)
{
GST_CLAPPER_PAINTABLE_IMPORTER_LOCK (self);
gst_object_replace ((GstObject **) &self->importer, GST_OBJECT_CAST (importer));
GST_CLAPPER_PAINTABLE_IMPORTER_UNLOCK (self);
g_weak_ref_set (&self->importer, importer);
}
void
@@ -330,6 +321,7 @@ gst_clapper_paintable_snapshot_internal (GstClapperPaintable *self,
GdkSnapshot *snapshot, gdouble width, gdouble height,
gint widget_width, gint widget_height)
{
GstClapperImporter *importer;
gfloat scale_x, scale_y;
GST_LOG_OBJECT (self, "Snapshot");
@@ -355,16 +347,14 @@ gst_clapper_paintable_snapshot_internal (GstClapperPaintable *self,
}
}
GST_CLAPPER_PAINTABLE_IMPORTER_LOCK (self);
if (self->importer) {
gst_clapper_importer_snapshot (self->importer, snapshot, width, height);
if ((importer = g_weak_ref_get (&self->importer))) {
gst_clapper_importer_snapshot (importer, snapshot, width, height,
scale_x * self->pixel_aspect, scale_y);
g_object_unref (importer);
} else {
GST_LOG_OBJECT (self, "No texture importer, drawing black");
gtk_snapshot_append_color (snapshot, &self->bg, &GRAPHENE_RECT_INIT (0, 0, width, height));
}
GST_CLAPPER_PAINTABLE_IMPORTER_UNLOCK (self);
}
static void
@@ -376,8 +366,11 @@ gst_clapper_paintable_snapshot (GdkPaintable *paintable,
gint widget_width = 0, widget_height = 0;
if ((widget = g_weak_ref_get (&self->widget))) {
widget_width = gtk_widget_get_width (widget);
widget_height = gtk_widget_get_height (widget);
gint scale_factor;
scale_factor = gtk_widget_get_scale_factor (widget);
widget_width = gtk_widget_get_width (widget) * scale_factor;
widget_height = gtk_widget_get_height (widget) * scale_factor;
g_object_unref (widget);
}

View File

@@ -36,27 +36,24 @@ G_DECLARE_FINAL_TYPE (GstClapperPaintable, gst_clapper_paintable, GST, CLAPPER_P
#define GST_CLAPPER_PAINTABLE_LOCK(obj) g_mutex_lock (GST_CLAPPER_PAINTABLE_GET_LOCK(obj))
#define GST_CLAPPER_PAINTABLE_UNLOCK(obj) g_mutex_unlock (GST_CLAPPER_PAINTABLE_GET_LOCK(obj))
#define GST_CLAPPER_PAINTABLE_IMPORTER_GET_LOCK(obj) (&GST_CLAPPER_PAINTABLE_CAST(obj)->importer_lock)
#define GST_CLAPPER_PAINTABLE_IMPORTER_LOCK(obj) g_mutex_lock (GST_CLAPPER_PAINTABLE_IMPORTER_GET_LOCK(obj))
#define GST_CLAPPER_PAINTABLE_IMPORTER_UNLOCK(obj) g_mutex_unlock (GST_CLAPPER_PAINTABLE_IMPORTER_GET_LOCK(obj))
struct _GstClapperPaintable
{
GObject parent;
GMutex lock;
GMutex importer_lock;
GstVideoInfo v_info;
GdkRGBA bg;
GWeakRef widget;
GstClapperImporter *importer;
GWeakRef widget, importer;
/* Sink properties */
gint par_n, par_d;
/* For drawing overlays */
gdouble pixel_aspect;
/* Resize */
gboolean pending_resize;
guint display_ratio_num;

View File

@@ -22,6 +22,7 @@
#endif
#include "gstclappersink.h"
#include "gstclapperimporterloader.h"
#include "gstgtkutils.h"
#define DEFAULT_FORCE_ASPECT_RATIO TRUE
@@ -279,15 +280,8 @@ gst_clapper_sink_get_widget (GstClapperSink *self)
gst_clapper_paintable_set_widget (self->paintable, self->widget);
/* Set earlier remembered property */
#if GTK_CHECK_VERSION(4,8,0)
if (self->force_aspect_ratio)
gtk_picture_set_content_fit (GTK_PICTURE (self->widget), GTK_CONTENT_FIT_CONTAIN);
else
gtk_picture_set_content_fit (GTK_PICTURE (self->widget), GTK_CONTENT_FIT_FILL);
#else
gtk_picture_set_keep_aspect_ratio (GTK_PICTURE (self->widget),
self->force_aspect_ratio);
#endif
gtk_picture_set_paintable (GTK_PICTURE (self->widget), GDK_PAINTABLE (self->paintable));
@@ -365,15 +359,8 @@ gst_clapper_sink_set_property (GObject *object, guint prop_id,
self->force_aspect_ratio = g_value_get_boolean (value);
if (self->widget) {
#if GTK_CHECK_VERSION(4,8,0)
if (self->force_aspect_ratio)
gtk_picture_set_content_fit (GTK_PICTURE (self->widget), GTK_CONTENT_FIT_CONTAIN);
else
gtk_picture_set_content_fit (GTK_PICTURE (self->widget), GTK_CONTENT_FIT_FILL);
#else
gtk_picture_set_keep_aspect_ratio (GTK_PICTURE (self->widget),
self->force_aspect_ratio);
#endif
}
break;
case PROP_PIXEL_ASPECT_RATIO:
@@ -426,6 +413,7 @@ static gboolean
gst_clapper_sink_propose_allocation (GstBaseSink *bsink, GstQuery *query)
{
GstClapperSink *self = GST_CLAPPER_SINK_CAST (bsink);
GstBufferPool *pool = NULL;
GstCaps *caps;
GstVideoInfo info;
guint size, min_buffers;
@@ -450,7 +438,6 @@ gst_clapper_sink_propose_allocation (GstBaseSink *bsink, GstQuery *query)
min_buffers = 3;
if (need_pool) {
GstBufferPool *pool;
GstStructure *config = NULL;
GST_DEBUG_OBJECT (self, "Need to create buffer pool");
@@ -472,15 +459,16 @@ gst_clapper_sink_propose_allocation (GstBaseSink *bsink, GstQuery *query)
GST_ERROR_OBJECT (self, "Failed to set config");
return FALSE;
}
gst_query_add_allocation_pool (query, pool, size, min_buffers, 0);
gst_object_unref (pool);
} else if (config) {
GST_WARNING_OBJECT (self, "Got config without a pool to apply it");
gst_structure_free (config);
}
}
gst_query_add_allocation_pool (query, pool, size, min_buffers, 0);
if (pool)
gst_object_unref (pool);
GST_CLAPPER_SINK_LOCK (self);
gst_clapper_importer_add_allocation_metas (self->importer, query);
GST_CLAPPER_SINK_UNLOCK (self);
@@ -494,12 +482,25 @@ gst_clapper_sink_query (GstBaseSink *bsink, GstQuery *query)
GstClapperSink *self = GST_CLAPPER_SINK_CAST (bsink);
gboolean res = FALSE;
GST_CLAPPER_SINK_LOCK (self);
if (GST_QUERY_TYPE (query) == GST_QUERY_CONTEXT) {
GST_CLAPPER_SINK_LOCK (self);
res = gst_clapper_importer_loader_handle_context_query (self->loader, bsink, query);
GST_CLAPPER_SINK_UNLOCK (self);
gboolean is_inactive;
GST_OBJECT_LOCK (self);
is_inactive = (GST_STATE (self) < GST_STATE_PAUSED);
GST_OBJECT_UNLOCK (self);
/* Some random context query in the middle of playback
* should not trigger importer replacement */
if (is_inactive)
gst_clapper_importer_loader_find_importer_for_context_query (query, &self->importer);
if (self->importer)
res = gst_clapper_importer_handle_context_query (self->importer, bsink, query);
}
GST_CLAPPER_SINK_UNLOCK (self);
if (res)
return TRUE;
@@ -695,10 +696,9 @@ gst_clapper_sink_get_times (GstBaseSink *bsink, GstBuffer *buffer,
static GstCaps *
gst_clapper_sink_get_caps (GstBaseSink *bsink, GstCaps *filter)
{
GstClapperSink *self = GST_CLAPPER_SINK_CAST (bsink);
GstCaps *result, *tmp;
tmp = gst_clapper_importer_loader_make_actual_caps (self->loader);
tmp = gst_pad_get_pad_template_caps (GST_BASE_SINK_PAD (bsink));
if (filter) {
GST_DEBUG ("Intersecting with filter caps: %" GST_PTR_FORMAT, filter);
@@ -728,7 +728,7 @@ gst_clapper_sink_set_caps (GstBaseSink *bsink, GstCaps *caps)
return FALSE;
}
if (!gst_clapper_importer_loader_find_importer_for_caps (self->loader, caps, &self->importer)) {
if (!gst_clapper_importer_loader_find_importer_for_caps (caps, &self->importer)) {
GST_CLAPPER_SINK_UNLOCK (self);
GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND,
("No importer for given caps found"), (NULL));
@@ -808,7 +808,6 @@ gst_clapper_sink_init (GstClapperSink *self)
gst_video_info_init (&self->v_info);
self->paintable = gst_clapper_paintable_new ();
self->loader = gst_clapper_importer_loader_new ();
}
static void
@@ -836,7 +835,7 @@ gst_clapper_sink_finalize (GObject *object)
GST_TRACE ("Finalize");
gst_clear_object (&self->loader);
gst_clapper_importer_loader_unload_all ();
g_mutex_clear (&self->lock);
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
@@ -891,7 +890,7 @@ gst_clapper_sink_class_init (GstClapperSinkClass *klass)
gstvideosink_class->set_info = gst_clapper_sink_set_info;
gstvideosink_class->show_frame = gst_clapper_sink_show_frame;
gst_element_class_set_static_metadata (gstelement_class,
gst_element_class_set_metadata (gstelement_class,
"Clapper video sink",
"Sink/Video", "A GTK4 video sink used by Clapper media player",
"Rafał Dzięgiel <rafostar.github@gmail.com>");

View File

@@ -25,7 +25,6 @@
#include <gst/video/video.h>
#include "gstclapperpaintable.h"
#include "gstclapperimporterloader.h"
#include "gstclapperimporter.h"
G_BEGIN_DECLS
@@ -47,7 +46,6 @@ struct _GstClapperSink
GMutex lock;
GstClapperPaintable *paintable;
GstClapperImporterLoader *loader;
GstClapperImporter *importer;
GstVideoInfo v_info;

View File

@@ -22,8 +22,6 @@
#include "gstgtkutils.h"
#define _IS_FRAME_PREMULTIPLIED(f) (GST_VIDEO_INFO_FLAG_IS_SET (&(f)->info, GST_VIDEO_FLAG_PREMULTIPLIED_ALPHA))
struct invoke_context
{
GThreadFunc func;
@@ -73,29 +71,21 @@ gst_gtk_invoke_on_main (GThreadFunc func, gpointer data)
return info.res;
}
static GdkMemoryFormat
gst_gdk_memory_format_from_frame (GstVideoFrame *frame)
/* For use with `GdkMemoryTexture` only! */
GdkMemoryFormat
gst_video_format_to_gdk_memory_format (GstVideoFormat format)
{
switch (GST_VIDEO_FRAME_FORMAT (frame)) {
switch (format) {
case GST_VIDEO_FORMAT_RGBA64_LE:
case GST_VIDEO_FORMAT_RGBA64_BE:
return (_IS_FRAME_PREMULTIPLIED (frame))
? GDK_MEMORY_R16G16B16A16_PREMULTIPLIED
: GDK_MEMORY_R16G16B16A16;
return GDK_MEMORY_R16G16B16A16_PREMULTIPLIED;
case GST_VIDEO_FORMAT_RGBA:
return (_IS_FRAME_PREMULTIPLIED (frame))
? GDK_MEMORY_R8G8B8A8_PREMULTIPLIED
: GDK_MEMORY_R8G8B8A8;
return GDK_MEMORY_R8G8B8A8;
case GST_VIDEO_FORMAT_BGRA:
return (_IS_FRAME_PREMULTIPLIED (frame))
? GDK_MEMORY_B8G8R8A8_PREMULTIPLIED
: GDK_MEMORY_B8G8R8A8;
return GDK_MEMORY_B8G8R8A8;
case GST_VIDEO_FORMAT_ARGB:
return (_IS_FRAME_PREMULTIPLIED (frame))
? GDK_MEMORY_A8R8G8B8_PREMULTIPLIED
: GDK_MEMORY_A8R8G8B8;
return GDK_MEMORY_A8R8G8B8;
case GST_VIDEO_FORMAT_ABGR:
/* GTK is missing premultiplied ABGR support */
return GDK_MEMORY_A8B8G8R8;
case GST_VIDEO_FORMAT_RGBx:
return GDK_MEMORY_R8G8B8A8_PREMULTIPLIED;
@@ -132,7 +122,7 @@ gst_video_frame_into_gdk_texture (GstVideoFrame *frame)
texture = gdk_memory_texture_new (
GST_VIDEO_FRAME_WIDTH (frame),
GST_VIDEO_FRAME_HEIGHT (frame),
gst_gdk_memory_format_from_frame (frame),
gst_video_format_to_gdk_memory_format (GST_VIDEO_FRAME_FORMAT (frame)),
bytes,
GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0));

View File

@@ -30,6 +30,8 @@ G_BEGIN_DECLS
gpointer gst_gtk_invoke_on_main (GThreadFunc func, gpointer data);
GdkMemoryFormat gst_video_format_to_gdk_memory_format (GstVideoFormat format);
GdkTexture * gst_video_frame_into_gdk_texture (GstVideoFrame *frame);
G_END_DECLS

View File

@@ -1,583 +0,0 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "gstclapperglcontexthandler.h"
#include "gst/plugin/gstgdkformats.h"
#include "gst/plugin/gstgtkutils.h"
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_WAYLAND
#include <gdk/wayland/gdkwayland.h>
#include <gst/gl/wayland/gstgldisplay_wayland.h>
#endif
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_X11
#include <gdk/x11/gdkx.h>
#endif
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_X11_GLX
#include <gst/gl/x11/gstgldisplay_x11.h>
#endif
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_X11_EGL || GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_WIN32_EGL
#include <gst/gl/egl/gstgldisplay_egl.h>
#endif
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_WIN32
#include <gdk/win32/gdkwin32.h>
#endif
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_MACOS
#include <gdk/macos/gdkmacos.h>
#endif
#define GST_CAT_DEFAULT gst_clapper_gl_context_handler_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
#define parent_class gst_clapper_gl_context_handler_parent_class
G_DEFINE_TYPE (GstClapperGLContextHandler, gst_clapper_gl_context_handler, GST_TYPE_OBJECT);
static GstGLContext *
_wrap_current_gl (GstGLDisplay *display, GdkGLAPI gdk_gl_api, GstGLPlatform platform)
{
GstGLAPI gst_gl_api = GST_GL_API_NONE;
switch (gdk_gl_api) {
case GDK_GL_API_GL:
gst_gl_api = GST_GL_API_OPENGL | GST_GL_API_OPENGL3;
break;
case GDK_GL_API_GLES:
gst_gl_api = GST_GL_API_GLES2;
break;
default:
g_assert_not_reached ();
break;
}
if (gst_gl_api != GST_GL_API_NONE) {
guintptr gl_handle;
gst_gl_display_filter_gl_api (display, gst_gl_api);
if ((gl_handle = gst_gl_context_get_current_gl_context (platform)))
return gst_gl_context_new_wrapped (display, gl_handle, platform, gst_gl_api);
}
return NULL;
}
static gboolean
_realize_gdk_context_with_api (GdkGLContext *gdk_context, GdkGLAPI api, gint maj, gint min)
{
GError *error = NULL;
gboolean success;
gdk_gl_context_set_allowed_apis (gdk_context, api);
gdk_gl_context_set_required_version (gdk_context, maj, min);
GST_DEBUG ("Trying to realize %s context, min ver: %i.%i",
(api & GDK_GL_API_GL) ? "GL" : "GLES", maj, min);
if (!(success = gdk_gl_context_realize (gdk_context, &error))) {
GST_DEBUG ("Could not realize Gdk context with %s: %s",
(api & GDK_GL_API_GL) ? "GL" : "GLES", error->message);
g_clear_error (&error);
}
return success;
}
static gboolean
_gl_context_handler_context_realize (GstClapperGLContextHandler *self, GdkGLContext *gdk_context)
{
GdkGLAPI preferred_api = GDK_GL_API_GL;
GdkDisplay *gdk_display;
const gchar *gl_env;
gboolean success;
GST_DEBUG_OBJECT (self, "Realizing GdkGLContext with default implementation");
/* Use single "GST_GL_API" env to also influence Gdk GL selection */
if ((gl_env = g_getenv ("GST_GL_API"))) {
preferred_api = (g_str_has_prefix (gl_env, "gles"))
? GDK_GL_API_GLES
: g_str_has_prefix (gl_env, "opengl")
? GDK_GL_API_GL
: GDK_GL_API_GL | GDK_GL_API_GLES;
/* With requested by user API, we either use it or give up */
return _realize_gdk_context_with_api (gdk_context, preferred_api, 0, 0);
}
gdk_display = gdk_gl_context_get_display (gdk_context);
GST_DEBUG_OBJECT (self, "Auto selecting GL API for display: %s",
gdk_display_get_name (gdk_display));
/* Apple decoder uses rectangle texture-target, which GLES does not support.
* For Linux we prefer EGL + GLES in order to get direct HW colorspace conversion.
* Windows will try EGL + GLES setup first and auto fallback to WGL. */
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_WAYLAND
if (GDK_IS_WAYLAND_DISPLAY (gdk_display))
preferred_api = GDK_GL_API_GLES;
#endif
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_X11_EGL
if (GDK_IS_X11_DISPLAY (gdk_display) && gdk_x11_display_get_egl_display (gdk_display))
preferred_api = GDK_GL_API_GLES;
#endif
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_WIN32_EGL
if (GDK_IS_WIN32_DISPLAY (gdk_display) && gdk_win32_display_get_egl_display (gdk_display))
preferred_api = GDK_GL_API_GLES;
#endif
/* FIXME: Remove once GStreamer can handle DRM modifiers. This tries to avoid
* "scrambled" image on Linux with Intel GPUs that are mostly used together with
* x86 CPUs at the expense of using slightly slower non-direct DMABuf import.
* See: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1236 */
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_WAYLAND || GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_X11_EGL
#if !defined(HAVE_GST_PATCHES) && (defined(__i386__) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64))
preferred_api = GDK_GL_API_GL;
#endif
#endif
/* Continue with GLES only if it should have "GL_EXT_texture_norm16"
* extension, as we need it to handle P010_10LE, etc. */
if ((preferred_api == GDK_GL_API_GLES)
&& _realize_gdk_context_with_api (gdk_context, GDK_GL_API_GLES, 3, 1))
return TRUE;
/* If not using GLES 3.1, try with core GL 3.2 that GTK4 defaults to */
if (_realize_gdk_context_with_api (gdk_context, GDK_GL_API_GL, 3, 2))
return TRUE;
/* Try with what we normally prefer first, otherwise use fallback */
if (!(success = _realize_gdk_context_with_api (gdk_context, preferred_api, 0, 0))) {
GdkGLAPI fallback_api;
fallback_api = (GDK_GL_API_GL | GDK_GL_API_GLES);
fallback_api &= ~preferred_api;
success = _realize_gdk_context_with_api (gdk_context, fallback_api, 0, 0);
}
return success;
}
static gboolean
_retrieve_gl_context_on_main (GstClapperGLContextHandler *self)
{
GdkDisplay *gdk_display;
GdkGLContext *gdk_context;
GError *error = NULL;
GdkGLAPI gdk_gl_api;
GstGLPlatform platform = GST_GL_PLATFORM_NONE;
gint gl_major = 0, gl_minor = 0;
if (!gtk_init_check ()) {
GST_ERROR_OBJECT (self, "Could not ensure GTK initialization");
return FALSE;
}
gdk_display = gdk_display_get_default ();
if (G_UNLIKELY (!gdk_display)) {
GST_ERROR_OBJECT (self, "Could not retrieve Gdk display");
return FALSE;
}
if (!(gdk_context = gdk_display_create_gl_context (gdk_display, &error))) {
GST_ERROR_OBJECT (self, "Error creating Gdk GL context: %s",
error ? error->message : "No error set by Gdk");
g_clear_error (&error);
return FALSE;
}
if (!_gl_context_handler_context_realize (self, gdk_context)) {
GST_ERROR_OBJECT (self, "Could not realize Gdk context: %" GST_PTR_FORMAT,
gdk_context);
g_object_unref (gdk_context);
return FALSE;
}
gdk_gl_api = gdk_gl_context_get_api (gdk_context);
GST_OBJECT_LOCK (self);
self->gdk_context = gdk_context;
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_WAYLAND
if (GDK_IS_WAYLAND_DISPLAY (gdk_display)) {
struct wl_display *wayland_display =
gdk_wayland_display_get_wl_display (gdk_display);
self->gst_display = (GstGLDisplay *)
gst_gl_display_wayland_new_with_display (wayland_display);
}
#endif
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_X11
if (GDK_IS_X11_DISPLAY (gdk_display)) {
gpointer display_ptr;
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_X11_EGL
display_ptr = gdk_x11_display_get_egl_display (gdk_display);
if (display_ptr) {
self->gst_display = (GstGLDisplay *)
gst_gl_display_egl_new_with_egl_display (display_ptr);
}
#endif
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_X11_GLX
if (!self->gst_display) {
display_ptr = gdk_x11_display_get_xdisplay (gdk_display);
self->gst_display = (GstGLDisplay *)
gst_gl_display_x11_new_with_display (display_ptr);
}
}
#endif
#endif
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_WIN32
if (GDK_IS_WIN32_DISPLAY (gdk_display)) {
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_WIN32_EGL
gpointer display_ptr = gdk_win32_display_get_egl_display (gdk_display);
if (display_ptr) {
self->gst_display = (GstGLDisplay *)
gst_gl_display_egl_new_with_egl_display (display_ptr);
}
#endif
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_WIN32_WGL
if (!self->gst_display) {
self->gst_display =
gst_gl_display_new_with_type (GST_GL_DISPLAY_TYPE_WIN32);
}
}
#endif
#endif
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_MACOS
if (GDK_IS_MACOS_DISPLAY (gdk_display)) {
self->gst_display =
gst_gl_display_new_with_type (GST_GL_DISPLAY_TYPE_COCOA);
}
#endif
/* Fallback to generic display */
if (G_UNLIKELY (!self->gst_display)) {
GST_WARNING_OBJECT (self, "Unknown Gdk display!");
self->gst_display = gst_gl_display_new ();
}
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_WAYLAND
if (GST_IS_GL_DISPLAY_WAYLAND (self->gst_display)) {
platform = GST_GL_PLATFORM_EGL;
GST_INFO_OBJECT (self, "Using EGL on Wayland");
goto have_display;
}
#endif
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_X11_EGL
if (GST_IS_GL_DISPLAY_EGL (self->gst_display)
&& GDK_IS_X11_DISPLAY (gdk_display)) {
platform = GST_GL_PLATFORM_EGL;
GST_INFO_OBJECT (self, "Using EGL on x11");
goto have_display;
}
#endif
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_X11_GLX
if (GST_IS_GL_DISPLAY_X11 (self->gst_display)) {
platform = GST_GL_PLATFORM_GLX;
GST_INFO_OBJECT (self, "Using GLX on x11");
goto have_display;
}
#endif
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_WIN32_EGL
if (GST_IS_GL_DISPLAY_EGL (self->gst_display)
&& GDK_IS_WIN32_DISPLAY (gdk_display)) {
platform = GST_GL_PLATFORM_EGL;
GST_INFO_OBJECT (self, "Using EGL on Win32");
goto have_display;
}
#endif
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_WIN32_WGL
if (gst_gl_display_get_handle_type (self->gst_display) == GST_GL_DISPLAY_TYPE_WIN32) {
platform = GST_GL_PLATFORM_WGL;
GST_INFO_OBJECT (self, "Using WGL on Win32");
goto have_display;
}
#endif
#if GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_MACOS
if (gst_gl_display_get_handle_type (self->gst_display) == GST_GL_DISPLAY_TYPE_COCOA) {
platform = GST_GL_PLATFORM_CGL;
GST_INFO_OBJECT (self, "Using CGL on macOS");
goto have_display;
}
#endif
g_clear_object (&self->gdk_context);
gst_clear_object (&self->gst_display);
GST_OBJECT_UNLOCK (self);
GST_ERROR_OBJECT (self, "Unsupported GL platform");
return FALSE;
have_display:
gdk_gl_context_make_current (self->gdk_context);
self->wrapped_context = _wrap_current_gl (self->gst_display, gdk_gl_api, platform);
if (!self->wrapped_context) {
GST_ERROR ("Could not retrieve Gdk OpenGL context");
gdk_gl_context_clear_current ();
g_clear_object (&self->gdk_context);
gst_clear_object (&self->gst_display);
GST_OBJECT_UNLOCK (self);
return FALSE;
}
GST_INFO ("Retrieved Gdk OpenGL context %" GST_PTR_FORMAT, self->wrapped_context);
gst_gl_context_activate (self->wrapped_context, TRUE);
if (!gst_gl_context_fill_info (self->wrapped_context, &error)) {
GST_ERROR ("Failed to fill Gdk context info: %s", error->message);
g_clear_error (&error);
gst_gl_context_activate (self->wrapped_context, FALSE);
gst_clear_object (&self->wrapped_context);
g_clear_object (&self->gdk_context);
gst_clear_object (&self->gst_display);
GST_OBJECT_UNLOCK (self);
return FALSE;
}
gst_gl_context_get_gl_version (self->wrapped_context, &gl_major, &gl_minor);
GST_INFO ("Using OpenGL%s %i.%i", (gdk_gl_api == GDK_GL_API_GLES) ? " ES" : "",
gl_major, gl_minor);
/* Deactivate in both places */
gst_gl_context_activate (self->wrapped_context, FALSE);
gdk_gl_context_clear_current ();
GST_OBJECT_UNLOCK (self);
return TRUE;
}
static gboolean
_retrieve_gst_context (GstClapperGLContextHandler *self)
{
GstGLDisplay *gst_display = NULL;
GstGLContext *gst_context = NULL;
GError *error = NULL;
GST_OBJECT_LOCK (self);
gst_display = gst_object_ref (self->gst_display);
GST_TRACE_OBJECT (self, "Creating new GstGLContext");
/* GstGLDisplay operations require display object lock to be held */
GST_OBJECT_LOCK (gst_display);
if (!gst_gl_display_create_context (gst_display, self->wrapped_context,
&self->gst_context, &error)) {
GST_WARNING ("Could not create OpenGL context: %s",
error ? error->message : "Unknown");
g_clear_error (&error);
GST_OBJECT_UNLOCK (gst_display);
GST_OBJECT_UNLOCK (self);
return FALSE;
}
gst_context = gst_object_ref (self->gst_context);
GST_OBJECT_UNLOCK (self);
gst_gl_display_add_context (gst_display, gst_context);
GST_OBJECT_UNLOCK (gst_display);
gst_object_unref (gst_display);
gst_object_unref (gst_context);
return TRUE;
}
static gboolean
gst_clapper_gl_context_handler_handle_context_query (GstClapperContextHandler *handler,
GstBaseSink *bsink, GstQuery *query)
{
GstClapperGLContextHandler *self = GST_CLAPPER_GL_CONTEXT_HANDLER_CAST (handler);
gboolean res;
GST_OBJECT_LOCK (self);
res = gst_gl_handle_context_query (GST_ELEMENT_CAST (bsink), query,
self->gst_display, self->gst_context, self->wrapped_context);
GST_OBJECT_UNLOCK (self);
return res;
}
static void
gst_clapper_gl_context_handler_init (GstClapperGLContextHandler *self)
{
}
static void
gst_clapper_gl_context_handler_constructed (GObject *object)
{
GstClapperGLContextHandler *self = GST_CLAPPER_GL_CONTEXT_HANDLER_CAST (object);
if (! !gst_gtk_invoke_on_main ((GThreadFunc) (GCallback)
_retrieve_gl_context_on_main, self)) {
_retrieve_gst_context (self);
}
GST_CALL_PARENT (G_OBJECT_CLASS, constructed, (object));
}
static void
gst_clapper_gl_context_handler_finalize (GObject *object)
{
GstClapperGLContextHandler *self = GST_CLAPPER_GL_CONTEXT_HANDLER_CAST (object);
GST_TRACE ("Finalize");
g_clear_object (&self->gdk_context);
gst_clear_object (&self->gst_display);
gst_clear_object (&self->wrapped_context);
gst_clear_object (&self->gst_context);
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
}
static void
gst_clapper_gl_context_handler_class_init (GstClapperGLContextHandlerClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
GstClapperContextHandlerClass *handler_class = (GstClapperContextHandlerClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperglcontexthandler", 0,
"Clapper GL Context Handler");
gobject_class->constructed = gst_clapper_gl_context_handler_constructed;
gobject_class->finalize = gst_clapper_gl_context_handler_finalize;
handler_class->handle_context_query = gst_clapper_gl_context_handler_handle_context_query;
}
void
gst_clapper_gl_context_handler_add_handler (GPtrArray *context_handlers)
{
guint i;
gboolean found = FALSE;
for (i = 0; i < context_handlers->len; i++) {
GstClapperContextHandler *handler = g_ptr_array_index (context_handlers, i);
if ((found = GST_IS_CLAPPER_GL_CONTEXT_HANDLER (handler)))
break;
}
if (!found) {
GstClapperGLContextHandler *handler = g_object_new (
GST_TYPE_CLAPPER_GL_CONTEXT_HANDLER, NULL);
g_ptr_array_add (context_handlers, handler);
GST_DEBUG ("Added GL context handler to handlers array");
}
}
GstCaps *
gst_clapper_gl_context_handler_make_gdk_gl_caps (const gchar *features, gboolean only_2d)
{
GstCaps *caps, *tmp;
if (only_2d) {
tmp = gst_caps_from_string (GST_VIDEO_CAPS_MAKE (
"{ " GST_GDK_GL_TEXTURE_FORMATS " }") ", "
"texture-target = (string) { " GST_GL_TEXTURE_TARGET_2D_STR " }");
} else {
tmp = gst_caps_from_string (GST_VIDEO_CAPS_MAKE (
"{ " GST_GDK_GL_TEXTURE_FORMATS " }"));
}
caps = gst_caps_copy (tmp);
gst_caps_set_features_simple (tmp, gst_caps_features_new (
features, NULL));
gst_caps_set_features_simple (caps, gst_caps_features_new (
features, GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION, NULL));
gst_caps_append (caps, tmp);
return caps;
}
GdkTexture *
gst_clapper_gl_context_handler_make_gl_texture (GstClapperGLContextHandler *self,
GstBuffer *buffer, GstVideoInfo *v_info)
{
GdkTexture *texture;
GstGLSyncMeta *sync_meta;
GstVideoFrame frame;
if (G_UNLIKELY (!gst_video_frame_map (&frame, v_info, buffer, GST_MAP_READ | GST_MAP_GL))) {
GST_ERROR_OBJECT (self, "Could not map input buffer for reading");
return NULL;
}
GST_OBJECT_LOCK (self);
/* Must have context active here for both sync meta
* and Gdk texture format auto-detection to work */
gdk_gl_context_make_current (self->gdk_context);
gst_gl_context_activate (self->wrapped_context, TRUE);
sync_meta = gst_buffer_get_gl_sync_meta (buffer);
/* Wait for all previous OpenGL commands to complete,
* before we start using the input texture */
if (sync_meta) {
gst_gl_sync_meta_set_sync_point (sync_meta, self->gst_context);
gst_gl_sync_meta_wait (sync_meta, self->wrapped_context);
}
texture = gdk_gl_texture_new (
self->gdk_context,
*(guint *) GST_VIDEO_FRAME_PLANE_DATA (&frame, 0),
GST_VIDEO_FRAME_WIDTH (&frame),
GST_VIDEO_FRAME_HEIGHT (&frame),
(GDestroyNotify) gst_buffer_unref,
gst_buffer_ref (buffer));
gst_gl_context_activate (self->wrapped_context, FALSE);
gdk_gl_context_clear_current ();
GST_OBJECT_UNLOCK (self);
gst_video_frame_unmap (&frame);
return texture;
}

View File

@@ -1,64 +0,0 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once
#include <gst/gst.h>
#include <gst/video/video.h>
#include <gst/gl/gl.h>
#include <gst/gl/gstglfuncs.h>
#include <gtk/gtk.h>
#include "gst/plugin/gstclappercontexthandler.h"
G_BEGIN_DECLS
#define GST_TYPE_CLAPPER_GL_CONTEXT_HANDLER (gst_clapper_gl_context_handler_get_type())
G_DECLARE_FINAL_TYPE (GstClapperGLContextHandler, gst_clapper_gl_context_handler, GST, CLAPPER_GL_CONTEXT_HANDLER, GstClapperContextHandler)
#define GST_CLAPPER_GL_CONTEXT_HANDLER_CAST(obj) ((GstClapperGLContextHandler *)(obj))
#define GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_WAYLAND (GST_GL_HAVE_WINDOW_WAYLAND && defined (GDK_WINDOWING_WAYLAND))
#define GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_X11 (GST_GL_HAVE_WINDOW_X11 && defined (GDK_WINDOWING_X11))
#define GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_X11_GLX (GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_X11 && GST_GL_HAVE_PLATFORM_GLX)
#define GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_X11_EGL (GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_X11 && GST_GL_HAVE_PLATFORM_EGL)
#define GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_WIN32 (GST_GL_HAVE_WINDOW_WIN32 && defined (GDK_WINDOWING_WIN32))
#define GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_WIN32_WGL (GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_WIN32 && GST_GL_HAVE_PLATFORM_WGL)
#define GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_WIN32_EGL (GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_WIN32 && GST_GL_HAVE_PLATFORM_EGL)
#define GST_CLAPPER_GL_CONTEXT_HANDLER_HAVE_MACOS (GST_GL_HAVE_WINDOW_COCOA && defined (GDK_WINDOWING_MACOS) && GST_GL_HAVE_PLATFORM_CGL)
struct _GstClapperGLContextHandler
{
GstClapperContextHandler parent;
GdkGLContext *gdk_context;
GstGLDisplay *gst_display;
GstGLContext *wrapped_context;
GstGLContext *gst_context;
};
void gst_clapper_gl_context_handler_add_handler (GPtrArray *context_handlers);
GstCaps * gst_clapper_gl_context_handler_make_gdk_gl_caps (const gchar *features, gboolean only_2d);
GdkTexture * gst_clapper_gl_context_handler_make_gl_texture (GstClapperGLContextHandler *handler, GstBuffer *buffer, GstVideoInfo *v_info);
G_END_DECLS

View File

@@ -1,83 +0,0 @@
gst_clapper_gl_ch_dep = dependency('', required: false)
build_gl_ch = (
not get_option('glimporter').disabled()
or not get_option('gluploader').disabled()
)
gl_support_required = (
get_option('glimporter').enabled()
or get_option('gluploader').enabled()
)
gst_plugin_gl_ch_deps = [gst_clapper_sink_dep, gstgl_dep, gstglproto_dep]
have_gtk_gl_windowing = false
if gst_gl_have_window_x11 and (gst_gl_have_platform_egl or gst_gl_have_platform_glx)
gtk_x11_dep = dependency('gtk4-x11', required: false)
if gtk_x11_dep.found()
gst_plugin_gl_ch_deps += gtk_x11_dep
if gst_gl_have_platform_glx
gst_plugin_gl_ch_deps += gstglx11_dep
endif
have_gtk_gl_windowing = true
endif
endif
if gst_gl_have_window_wayland and gst_gl_have_platform_egl
gtk_wayland_dep = dependency('gtk4-wayland', required: false)
if gtk_wayland_dep.found()
gst_plugin_gl_ch_deps += [gtk_wayland_dep, gstglwayland_dep]
have_gtk_gl_windowing = true
endif
endif
if gst_gl_have_window_win32 and (gst_gl_have_platform_egl or gst_gl_have_platform_wgl)
gtk_win32_dep = dependency('gtk4-win32', required: false)
if gtk_win32_dep.found()
gst_plugin_gl_ch_deps += gtk_win32_dep
have_gtk_gl_windowing = true
endif
endif
if gst_gl_have_window_cocoa and gst_gl_have_platform_cgl
gtk_macos_dep = dependency('gtk4-macos', required: false)
if gtk_macos_dep.found()
gst_plugin_gl_ch_deps += gtk_macos_dep
have_gtk_gl_windowing = true
endif
endif
if not have_gtk_gl_windowing
if gl_support_required
error('GL-based importer was enabled, but support for current GL windowing is missing')
endif
build_gl_ch = false
endif
if gst_gl_have_platform_egl
gst_plugin_gl_ch_deps += gstglegl_dep
endif
foreach dep : gst_plugin_gl_ch_deps
if not dep.found()
if gl_support_required
error('GL-based importer was enabled, but required dependencies were not found')
endif
build_gl_ch = false
endif
endforeach
if build_gl_ch
gst_clapper_gl_ch_dep = declare_dependency(
link_with: library('gstclapperglcontexthandler',
'gstclapperglcontexthandler.c',
c_args: gst_clapper_plugin_args,
include_directories: configinc,
dependencies: gst_plugin_gl_ch_deps,
version: libversion,
install: true,
),
include_directories: configinc,
dependencies: gst_plugin_gl_ch_deps,
)
endif

View File

@@ -1 +0,0 @@
subdir('gl')

View File

@@ -0,0 +1,549 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "gstclapperglbaseimporter.h"
#include "gst/plugin/gstgdkformats.h"
#include "gst/plugin/gstgtkutils.h"
#include <gst/gl/gstglfuncs.h>
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WAYLAND
#include <gdk/wayland/gdkwayland.h>
#include <gst/gl/wayland/gstgldisplay_wayland.h>
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11
#include <gdk/x11/gdkx.h>
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_GLX
#include <gst/gl/x11/gstgldisplay_x11.h>
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_EGL
#include <gst/gl/egl/gstgldisplay_egl.h>
#endif
#define GST_CAT_DEFAULT gst_clapper_gl_base_importer_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
#define parent_class gst_clapper_gl_base_importer_parent_class
G_DEFINE_TYPE (GstClapperGLBaseImporter, gst_clapper_gl_base_importer, GST_TYPE_CLAPPER_IMPORTER);
static GstGLContext *
wrap_current_gl (GstGLDisplay *display, GdkGLAPI gdk_gl_api, GstGLPlatform platform)
{
GstGLAPI gst_gl_api = GST_GL_API_NONE;
switch (gdk_gl_api) {
case GDK_GL_API_GL:
gst_gl_api = GST_GL_API_OPENGL | GST_GL_API_OPENGL3;
break;
case GDK_GL_API_GLES:
gst_gl_api = GST_GL_API_GLES2;
break;
default:
g_assert_not_reached ();
break;
}
if (gst_gl_api != GST_GL_API_NONE) {
guintptr gl_handle;
gst_gl_display_filter_gl_api (display, gst_gl_api);
if ((gl_handle = gst_gl_context_get_current_gl_context (platform)))
return gst_gl_context_new_wrapped (display, gl_handle, platform, gst_gl_api);
}
return NULL;
}
static gboolean
retrieve_gl_context_on_main (GstClapperGLBaseImporter *self)
{
GstClapperGLBaseImporterClass *gl_bi_class = GST_CLAPPER_GL_BASE_IMPORTER_GET_CLASS (self);
GdkDisplay *gdk_display;
GdkGLContext *gdk_context;
GError *error = NULL;
GdkGLAPI gdk_gl_api;
GstGLPlatform platform = GST_GL_PLATFORM_NONE;
gint gl_major = 0, gl_minor = 0;
if (!gtk_init_check ()) {
GST_ERROR_OBJECT (self, "Could not ensure GTK initialization");
return FALSE;
}
/* Make sure we are clean here, otherwise data sharing
* between GL-based importers may lead to leaks */
gst_clear_object (&self->wrapped_context);
g_clear_object (&self->gdk_context);
gst_clear_object (&self->gst_display);
gdk_display = gdk_display_get_default ();
if (!(gdk_context = gdk_display_create_gl_context (gdk_display, &error))) {
GST_ERROR_OBJECT (self, "Error creating Gdk GL context: %s",
error ? error->message : "No error set by Gdk");
g_clear_error (&error);
return FALSE;
}
if (!gl_bi_class->gdk_context_realize (self, gdk_context)) {
GST_ERROR_OBJECT (self, "Could not realize Gdk context: %" GST_PTR_FORMAT,
gdk_context);
g_object_unref (gdk_context);
return FALSE;
}
gdk_gl_api = gdk_gl_context_get_api (gdk_context);
GST_OBJECT_LOCK (self);
self->gdk_context = gdk_context;
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WAYLAND
if (GDK_IS_WAYLAND_DISPLAY (gdk_display)) {
struct wl_display *wayland_display =
gdk_wayland_display_get_wl_display (gdk_display);
self->gst_display = (GstGLDisplay *)
gst_gl_display_wayland_new_with_display (wayland_display);
}
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11
if (GDK_IS_X11_DISPLAY (gdk_display)) {
gpointer display_ptr;
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_EGL
display_ptr = gdk_x11_display_get_egl_display (gdk_display);
if (display_ptr) {
self->gst_display = (GstGLDisplay *)
gst_gl_display_egl_new_with_egl_display (display_ptr);
}
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_GLX
if (!self->gst_display) {
display_ptr = gdk_x11_display_get_xdisplay (gdk_display);
self->gst_display = (GstGLDisplay *)
gst_gl_display_x11_new_with_display (display_ptr);
}
}
#endif
#endif
/* Fallback to generic display */
if (G_UNLIKELY (!self->gst_display)) {
GST_WARNING_OBJECT (self, "Unknown Gdk display!");
self->gst_display = gst_gl_display_new ();
}
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WAYLAND
if (GST_IS_GL_DISPLAY_WAYLAND (self->gst_display)) {
platform = GST_GL_PLATFORM_EGL;
GST_INFO_OBJECT (self, "Using EGL on Wayland");
goto have_display;
}
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_EGL
if (GST_IS_GL_DISPLAY_EGL (self->gst_display)) {
platform = GST_GL_PLATFORM_EGL;
GST_INFO_OBJECT (self, "Using EGL on x11");
goto have_display;
}
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_GLX
if (GST_IS_GL_DISPLAY_X11 (self->gst_display)) {
platform = GST_GL_PLATFORM_GLX;
GST_INFO_OBJECT (self, "Using GLX on x11");
goto have_display;
}
#endif
g_clear_object (&self->gdk_context);
gst_clear_object (&self->gst_display);
GST_OBJECT_UNLOCK (self);
GST_ERROR_OBJECT (self, "Unsupported GL platform");
return FALSE;
have_display:
gdk_gl_context_make_current (self->gdk_context);
self->wrapped_context = wrap_current_gl (self->gst_display, gdk_gl_api, platform);
if (!self->wrapped_context) {
GST_ERROR ("Could not retrieve Gdk OpenGL context");
gdk_gl_context_clear_current ();
g_clear_object (&self->gdk_context);
gst_clear_object (&self->gst_display);
GST_OBJECT_UNLOCK (self);
return FALSE;
}
GST_INFO ("Retrieved Gdk OpenGL context %" GST_PTR_FORMAT, self->wrapped_context);
gst_gl_context_activate (self->wrapped_context, TRUE);
if (!gst_gl_context_fill_info (self->wrapped_context, &error)) {
GST_ERROR ("Failed to fill Gdk context info: %s", error->message);
g_clear_error (&error);
gst_gl_context_activate (self->wrapped_context, FALSE);
gst_clear_object (&self->wrapped_context);
g_clear_object (&self->gdk_context);
gst_clear_object (&self->gst_display);
GST_OBJECT_UNLOCK (self);
return FALSE;
}
gst_gl_context_get_gl_version (self->wrapped_context, &gl_major, &gl_minor);
GST_INFO ("Using OpenGL%s %i.%i", (gdk_gl_api == GDK_GL_API_GLES) ? " ES" : "",
gl_major, gl_minor);
/* Deactivate in both places */
gst_gl_context_activate (self->wrapped_context, FALSE);
gdk_gl_context_clear_current ();
GST_OBJECT_UNLOCK (self);
return TRUE;
}
static gboolean
retrieve_gst_context (GstClapperGLBaseImporter *self)
{
GstGLDisplay *gst_display = NULL;
GstGLContext *gst_context = NULL;
GError *error = NULL;
GST_OBJECT_LOCK (self);
gst_display = gst_object_ref (self->gst_display);
/* GstGLDisplay operations require display object lock to be held */
GST_OBJECT_LOCK (gst_display);
if (!self->gst_context) {
GST_TRACE_OBJECT (self, "Creating new GstGLContext");
if (!gst_gl_display_create_context (gst_display, self->wrapped_context,
&self->gst_context, &error)) {
GST_WARNING ("Could not create OpenGL context: %s",
error ? error->message : "Unknown");
g_clear_error (&error);
GST_OBJECT_UNLOCK (gst_display);
GST_OBJECT_UNLOCK (self);
return FALSE;
}
}
gst_context = gst_object_ref (self->gst_context);
GST_OBJECT_UNLOCK (self);
gst_gl_display_add_context (gst_display, gst_context);
GST_OBJECT_UNLOCK (gst_display);
gst_object_unref (gst_display);
gst_object_unref (gst_context);
return TRUE;
}
static gboolean
gst_clapper_gl_base_importer_prepare (GstClapperImporter *importer)
{
GstClapperGLBaseImporter *self = GST_CLAPPER_GL_BASE_IMPORTER_CAST (importer);
gboolean need_invoke;
GST_OBJECT_LOCK (self);
need_invoke = (!self->gdk_context || !self->gst_display || !self->wrapped_context);
GST_OBJECT_UNLOCK (self);
if (need_invoke) {
if (!(! !gst_gtk_invoke_on_main ((GThreadFunc) (GCallback)
retrieve_gl_context_on_main, self)))
return FALSE;
}
if (!retrieve_gst_context (self))
return FALSE;
if (!GST_CLAPPER_IMPORTER_CLASS (parent_class)->prepare)
return TRUE;
return GST_CLAPPER_IMPORTER_CLASS (parent_class)->prepare (importer);
}
static void
gst_clapper_gl_base_importer_share_data (GstClapperImporter *importer, GstClapperImporter *dest_importer)
{
GstClapperGLBaseImporter *self = GST_CLAPPER_GL_BASE_IMPORTER (importer);
if (GST_IS_CLAPPER_GL_BASE_IMPORTER (dest_importer)) {
GstClapperGLBaseImporter *dest = GST_CLAPPER_GL_BASE_IMPORTER (dest_importer);
GST_OBJECT_LOCK (self);
GST_OBJECT_LOCK (dest);
/* Successfully prepared GL importer should have all three */
if (self->gdk_context && self->gst_display && self->wrapped_context) {
g_clear_object (&dest->gdk_context);
dest->gdk_context = g_object_ref (self->gdk_context);
gst_clear_object (&dest->gst_display);
dest->gst_display = gst_object_ref (self->gst_display);
gst_clear_object (&dest->wrapped_context);
dest->wrapped_context = gst_object_ref (self->wrapped_context);
}
/* This context is not required, we can create it ourselves
* using gst_display and wrapped_context */
if (self->gst_context) {
gst_clear_object (&dest->gst_context);
dest->gst_context = gst_object_ref (self->gst_context);
}
GST_OBJECT_UNLOCK (dest);
GST_OBJECT_UNLOCK (self);
}
if (GST_CLAPPER_IMPORTER_CLASS (parent_class)->share_data)
GST_CLAPPER_IMPORTER_CLASS (parent_class)->share_data (importer, dest_importer);
}
static gboolean
gst_clapper_gl_base_importer_handle_context_query (GstClapperImporter *importer,
GstBaseSink *bsink, GstQuery *query)
{
GstClapperGLBaseImporter *self = GST_CLAPPER_GL_BASE_IMPORTER_CAST (importer);
gboolean res;
GST_OBJECT_LOCK (self);
res = gst_gl_handle_context_query (GST_ELEMENT_CAST (bsink), query,
self->gst_display, self->gst_context, self->wrapped_context);
GST_OBJECT_UNLOCK (self);
return res;
}
static GstBufferPool *
gst_clapper_gl_base_importer_create_pool (GstClapperImporter *importer, GstStructure **config)
{
GstClapperGLBaseImporter *self = GST_CLAPPER_GL_BASE_IMPORTER_CAST (importer);
GstBufferPool *pool;
GST_DEBUG_OBJECT (self, "Creating new GL buffer pool");
GST_OBJECT_LOCK (self);
pool = gst_gl_buffer_pool_new (self->gst_context);
GST_OBJECT_UNLOCK (self);
*config = gst_buffer_pool_get_config (pool);
gst_buffer_pool_config_add_option (*config, GST_BUFFER_POOL_OPTION_VIDEO_META);
gst_buffer_pool_config_add_option (*config, GST_BUFFER_POOL_OPTION_GL_SYNC_META);
return pool;
}
static void
gst_clapper_gl_base_importer_add_allocation_metas (GstClapperImporter *importer, GstQuery *query)
{
GstClapperGLBaseImporter *self = GST_CLAPPER_GL_BASE_IMPORTER_CAST (importer);
gst_query_add_allocation_meta (query, GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, NULL);
gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL);
GST_OBJECT_LOCK (self);
if (self->gst_context->gl_vtable->FenceSync)
gst_query_add_allocation_meta (query, GST_GL_SYNC_META_API_TYPE, NULL);
GST_OBJECT_UNLOCK (self);
}
static gboolean
gst_clapper_gl_base_importer_gdk_context_realize (GstClapperGLBaseImporter *self, GdkGLContext *gdk_context)
{
GdkGLAPI allowed_apis;
GError *error = NULL;
const gchar *gl_env;
gboolean success;
GST_DEBUG_OBJECT (self, "Realizing GdkGLContext with default implementation");
/* Use single "GST_GL_API" env to also influence Gdk GL selection */
gl_env = g_getenv ("GST_GL_API");
allowed_apis = (!gl_env || g_str_has_prefix (gl_env, "gles"))
? GDK_GL_API_GLES
: (g_str_has_prefix (gl_env, "opengl"))
? GDK_GL_API_GL
: GDK_GL_API_GL | GDK_GL_API_GLES;
gdk_gl_context_set_allowed_apis (gdk_context, allowed_apis);
if (!(success = gdk_gl_context_realize (gdk_context, &error))) {
GST_WARNING_OBJECT (self, "Could not realize Gdk context with %s: %s",
(allowed_apis & GDK_GL_API_GL) ? "GL" : "GLES", error->message);
g_clear_error (&error);
}
if (!success && !gl_env) {
gdk_gl_context_set_allowed_apis (gdk_context, GDK_GL_API_GL);
if (!(success = gdk_gl_context_realize (gdk_context, &error))) {
GST_WARNING_OBJECT (self, "Could not realize Gdk context with GL: %s", error->message);
g_clear_error (&error);
}
}
return success;
}
static void
gst_clapper_gl_base_importer_init (GstClapperGLBaseImporter *self)
{
}
static void
gst_clapper_gl_base_importer_finalize (GObject *object)
{
GstClapperGLBaseImporter *self = GST_CLAPPER_GL_BASE_IMPORTER_CAST (object);
g_clear_object (&self->gdk_context);
gst_clear_object (&self->gst_display);
gst_clear_object (&self->wrapped_context);
gst_clear_object (&self->gst_context);
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
}
static void
gst_clapper_gl_base_importer_class_init (GstClapperGLBaseImporterClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
GstClapperImporterClass *importer_class = (GstClapperImporterClass *) klass;
GstClapperGLBaseImporterClass *gl_bi_class = (GstClapperGLBaseImporterClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperglbaseimporter", 0,
"Clapper GL Base Importer");
gobject_class->finalize = gst_clapper_gl_base_importer_finalize;
importer_class->prepare = gst_clapper_gl_base_importer_prepare;
importer_class->share_data = gst_clapper_gl_base_importer_share_data;
importer_class->handle_context_query = gst_clapper_gl_base_importer_handle_context_query;
importer_class->create_pool = gst_clapper_gl_base_importer_create_pool;
importer_class->add_allocation_metas = gst_clapper_gl_base_importer_add_allocation_metas;
gl_bi_class->gdk_context_realize = gst_clapper_gl_base_importer_gdk_context_realize;
}
GstCaps *
gst_clapper_gl_base_importer_make_supported_gdk_gl_caps (void)
{
GstCaps *caps, *tmp;
tmp = gst_caps_from_string (
GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
"{ " GST_GDK_GL_TEXTURE_FORMATS " }") ", "
"texture-target = (string) { " GST_GL_TEXTURE_TARGET_2D_STR " }");
caps = gst_caps_copy (tmp);
gst_caps_set_features_simple (caps, gst_caps_features_new (
GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION, NULL));
gst_caps_append (caps, tmp);
return caps;
}
GStrv
gst_clapper_gl_base_importer_make_gl_context_types (void)
{
GStrv context_types;
GStrvBuilder *builder = g_strv_builder_new ();
g_strv_builder_add (builder, GST_GL_DISPLAY_CONTEXT_TYPE);
g_strv_builder_add (builder, "gst.gl.app_context");
g_strv_builder_add (builder, "gst.gl.local_context");
context_types = g_strv_builder_end (builder);
g_strv_builder_unref (builder);
return context_types;
}
GdkTexture *
gst_clapper_gl_base_importer_make_gl_texture (GstClapperGLBaseImporter *self,
GstBuffer *buffer, GstVideoInfo *v_info)
{
GdkTexture *texture;
GstGLSyncMeta *sync_meta;
GstVideoFrame frame;
if (G_UNLIKELY (!gst_video_frame_map (&frame, v_info, buffer, GST_MAP_READ | GST_MAP_GL))) {
GST_ERROR_OBJECT (self, "Could not map input buffer for reading");
return NULL;
}
GST_OBJECT_LOCK (self);
/* Must have context active here for both sync meta
* and Gdk texture format auto-detection to work */
gdk_gl_context_make_current (self->gdk_context);
gst_gl_context_activate (self->wrapped_context, TRUE);
sync_meta = gst_buffer_get_gl_sync_meta (buffer);
/* Wait for all previous OpenGL commands to complete,
* before we start using the input texture */
if (sync_meta) {
gst_gl_sync_meta_set_sync_point (sync_meta, self->gst_context);
gst_gl_sync_meta_wait (sync_meta, self->wrapped_context);
}
texture = gdk_gl_texture_new (
self->gdk_context,
*(guint *) GST_VIDEO_FRAME_PLANE_DATA (&frame, 0),
GST_VIDEO_FRAME_WIDTH (&frame),
GST_VIDEO_FRAME_HEIGHT (&frame),
(GDestroyNotify) gst_buffer_unref,
gst_buffer_ref (buffer));
gst_gl_context_activate (self->wrapped_context, FALSE);
gdk_gl_context_clear_current ();
GST_OBJECT_UNLOCK (self);
gst_video_frame_unmap (&frame);
return texture;
}

View File

@@ -0,0 +1,75 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once
#include <gst/gl/gl.h>
#include "gst/plugin/gstclapperimporter.h"
G_BEGIN_DECLS
#define GST_TYPE_CLAPPER_GL_BASE_IMPORTER (gst_clapper_gl_base_importer_get_type())
#define GST_IS_CLAPPER_GL_BASE_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_CLAPPER_GL_BASE_IMPORTER))
#define GST_IS_CLAPPER_GL_BASE_IMPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_CLAPPER_GL_BASE_IMPORTER))
#define GST_CLAPPER_GL_BASE_IMPORTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_CLAPPER_GL_BASE_IMPORTER, GstClapperGLBaseImporterClass))
#define GST_CLAPPER_GL_BASE_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_CLAPPER_GL_BASE_IMPORTER, GstClapperGLBaseImporter))
#define GST_CLAPPER_GL_BASE_IMPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_CLAPPER_GL_BASE_IMPORTER, GstClapperGLBaseImporterClass))
#define GST_CLAPPER_GL_BASE_IMPORTER_CAST(obj) ((GstClapperGLBaseImporter *)(obj))
#define GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WAYLAND (GST_GL_HAVE_WINDOW_WAYLAND && defined (GDK_WINDOWING_WAYLAND))
#define GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11 (GST_GL_HAVE_WINDOW_X11 && defined (GDK_WINDOWING_X11))
#define GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_GLX (GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11 && GST_GL_HAVE_PLATFORM_GLX)
#define GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_EGL (GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11 && GST_GL_HAVE_PLATFORM_EGL)
typedef struct _GstClapperGLBaseImporter GstClapperGLBaseImporter;
typedef struct _GstClapperGLBaseImporterClass GstClapperGLBaseImporterClass;
#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GstClapperGLBaseImporter, gst_object_unref)
#endif
struct _GstClapperGLBaseImporter
{
GstClapperImporter parent;
GdkGLContext *gdk_context;
GstGLDisplay *gst_display;
GstGLContext *wrapped_context;
GstGLContext *gst_context;
};
struct _GstClapperGLBaseImporterClass
{
GstClapperImporterClass parent_class;
gboolean (* gdk_context_realize) (GstClapperGLBaseImporter *gl_bi,
GdkGLContext *gdk_context);
};
GType gst_clapper_gl_base_importer_get_type (void);
GstCaps * gst_clapper_gl_base_importer_make_supported_gdk_gl_caps (void);
GStrv gst_clapper_gl_base_importer_make_gl_context_types (void);
GdkTexture * gst_clapper_gl_base_importer_make_gl_texture (GstClapperGLBaseImporter *self, GstBuffer *buffer, GstVideoInfo *v_info);
G_END_DECLS

View File

@@ -27,45 +27,15 @@
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
#define parent_class gst_clapper_gl_importer_parent_class
GST_CLAPPER_IMPORTER_DEFINE (GstClapperGLImporter, gst_clapper_gl_importer, GST_TYPE_CLAPPER_IMPORTER);
static GstBufferPool *
gst_clapper_gl_importer_create_pool (GstClapperImporter *importer, GstStructure **config)
{
GstClapperGLImporter *self = GST_CLAPPER_GL_IMPORTER_CAST (importer);
GstBufferPool *pool;
GST_DEBUG_OBJECT (self, "Creating new GL buffer pool");
pool = gst_gl_buffer_pool_new (self->gl_handler->gst_context);
*config = gst_buffer_pool_get_config (pool);
gst_buffer_pool_config_add_option (*config, GST_BUFFER_POOL_OPTION_VIDEO_META);
gst_buffer_pool_config_add_option (*config, GST_BUFFER_POOL_OPTION_GL_SYNC_META);
return pool;
}
static void
gst_clapper_gl_importer_add_allocation_metas (GstClapperImporter *importer, GstQuery *query)
{
GstClapperGLImporter *self = GST_CLAPPER_GL_IMPORTER_CAST (importer);
/* We can support GL sync meta */
if (self->gl_handler->gst_context->gl_vtable->FenceSync)
gst_query_add_allocation_meta (query, GST_GL_SYNC_META_API_TYPE, NULL);
/* Also add base importer class supported meta */
GST_CLAPPER_IMPORTER_CLASS (parent_class)->add_allocation_metas (importer, query);
}
GST_CLAPPER_IMPORTER_DEFINE (GstClapperGLImporter, gst_clapper_gl_importer, GST_TYPE_CLAPPER_GL_BASE_IMPORTER);
static GdkTexture *
gst_clapper_gl_importer_generate_texture (GstClapperImporter *importer,
GstBuffer *buffer, GstVideoInfo *v_info)
{
GstClapperGLImporter *self = GST_CLAPPER_GL_IMPORTER_CAST (importer);
GstClapperGLBaseImporter *gl_bi = GST_CLAPPER_GL_BASE_IMPORTER_CAST (importer);
return gst_clapper_gl_context_handler_make_gl_texture (self->gl_handler, buffer, v_info);
return gst_clapper_gl_base_importer_make_gl_texture (gl_bi, buffer, v_info);
}
static void
@@ -73,58 +43,28 @@ gst_clapper_gl_importer_init (GstClapperGLImporter *self)
{
}
static void
gst_clapper_gl_importer_finalize (GObject *object)
{
GstClapperGLImporter *self = GST_CLAPPER_GL_IMPORTER_CAST (object);
gst_clear_object (&self->gl_handler);
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
}
static void
gst_clapper_gl_importer_class_init (GstClapperGLImporterClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
GstClapperImporterClass *importer_class = (GstClapperImporterClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperglimporter", 0,
"Clapper GL Importer");
gobject_class->finalize = gst_clapper_gl_importer_finalize;
importer_class->create_pool = gst_clapper_gl_importer_create_pool;
importer_class->add_allocation_metas = gst_clapper_gl_importer_add_allocation_metas;
importer_class->generate_texture = gst_clapper_gl_importer_generate_texture;
}
GstClapperImporter *
make_importer (GPtrArray *context_handlers)
make_importer (void)
{
GstClapperGLImporter *self;
GstClapperContextHandler *handler;
handler = gst_clapper_context_handler_obtain_with_type (context_handlers,
GST_TYPE_CLAPPER_GL_CONTEXT_HANDLER);
if (G_UNLIKELY (!handler))
return NULL;
self = g_object_new (GST_TYPE_CLAPPER_GL_IMPORTER, NULL);
self->gl_handler = GST_CLAPPER_GL_CONTEXT_HANDLER_CAST (handler);
return GST_CLAPPER_IMPORTER_CAST (self);
return g_object_new (GST_TYPE_CLAPPER_GL_IMPORTER, NULL);
}
GstCaps *
make_caps (gboolean is_template, GstRank *rank, GPtrArray *context_handlers)
make_caps (GstRank *rank, GStrv *context_types)
{
*rank = GST_RANK_SECONDARY;
*context_types = gst_clapper_gl_base_importer_make_gl_context_types ();
if (!is_template && context_handlers)
gst_clapper_gl_context_handler_add_handler (context_handlers);
return gst_clapper_gl_context_handler_make_gdk_gl_caps (
GST_CAPS_FEATURE_MEMORY_GL_MEMORY, TRUE);
return gst_clapper_gl_base_importer_make_supported_gdk_gl_caps ();
}

View File

@@ -19,21 +19,18 @@
#pragma once
#include "gst/plugin/gstclapperimporter.h"
#include "gst/plugin/handlers/gl/gstclapperglcontexthandler.h"
#include "gstclapperglbaseimporter.h"
G_BEGIN_DECLS
#define GST_TYPE_CLAPPER_GL_IMPORTER (gst_clapper_gl_importer_get_type())
G_DECLARE_FINAL_TYPE (GstClapperGLImporter, gst_clapper_gl_importer, GST, CLAPPER_GL_IMPORTER, GstClapperImporter)
G_DECLARE_FINAL_TYPE (GstClapperGLImporter, gst_clapper_gl_importer, GST, CLAPPER_GL_IMPORTER, GstClapperGLBaseImporter)
#define GST_CLAPPER_GL_IMPORTER_CAST(obj) ((GstClapperGLImporter *)(obj))
struct _GstClapperGLImporter
{
GstClapperImporter parent;
GstClapperGLContextHandler *gl_handler;
GstClapperGLBaseImporter parent;
};
G_END_DECLS

View File

@@ -22,38 +22,409 @@
#endif
#include "gstclappergluploader.h"
#include "gst/plugin/gstgtkutils.h"
#include <gst/gl/egl/gsteglimage.h>
#include <gst/allocators/gstdmabuf.h>
static const GLfloat vertices[] = {
1.0f, 1.0f, 0.0f, 1.0f, 0.0f,
-1.0f, 1.0f, 0.0f, 0.0f, 0.0f,
-1.0f, -1.0f, 0.0f, 0.0f, 1.0f,
1.0f, -1.0f, 0.0f, 1.0f, 1.0f
};
static const GLushort indices[] = {
0, 1, 2, 0, 2, 3
};
/* GTK4 renders things upside down ¯\_(ツ)_/¯ */
static const gfloat vertical_flip_matrix[] = {
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, -1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f,
};
typedef struct
{
GstClapperGLUploader *dmabuf_bi;
GLuint id;
guint width;
guint height;
} GstClapperDmabufTexData;
#define GST_CAT_DEFAULT gst_clapper_gl_uploader_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
#define parent_class gst_clapper_gl_uploader_parent_class
GST_CLAPPER_IMPORTER_DEFINE (GstClapperGLUploader, gst_clapper_gl_uploader, GST_TYPE_CLAPPER_IMPORTER);
GST_CLAPPER_IMPORTER_DEFINE (GstClapperGLUploader, gst_clapper_gl_uploader, GST_TYPE_CLAPPER_GL_BASE_IMPORTER);
static void
gst_clapper_gl_uploader_bind_buffer (GstClapperGLUploader *self)
{
GstClapperGLBaseImporter *gl_bi = GST_CLAPPER_GL_BASE_IMPORTER_CAST (self);
const GstGLFuncs *gl = gl_bi->gst_context->gl_vtable;
gl->BindBuffer (GL_ARRAY_BUFFER, self->vertex_buffer);
/* Load the vertex position */
gl->VertexAttribPointer (self->attr_position, 3, GL_FLOAT, GL_FALSE,
5 * sizeof (GLfloat), (void *) 0);
/* Load the texture coordinate */
gl->VertexAttribPointer (self->attr_texture, 2, GL_FLOAT, GL_FALSE,
5 * sizeof (GLfloat), (void *) (3 * sizeof (GLfloat)));
gl->EnableVertexAttribArray (self->attr_position);
gl->EnableVertexAttribArray (self->attr_texture);
}
static void
gst_clapper_gl_uploader_unbind_buffer (GstClapperGLUploader *self)
{
GstClapperGLBaseImporter *gl_bi = GST_CLAPPER_GL_BASE_IMPORTER_CAST (self);
const GstGLFuncs *gl = gl_bi->gst_context->gl_vtable;
gl->BindBuffer (GL_ARRAY_BUFFER, 0);
gl->DisableVertexAttribArray (self->attr_position);
gl->DisableVertexAttribArray (self->attr_texture);
}
static gboolean
prepare_dmabuf_support_on_main (GstClapperGLUploader *self)
{
GstClapperGLBaseImporter *gl_bi = GST_CLAPPER_GL_BASE_IMPORTER_CAST (self);
GstGLSLStage *frag_stage, *vert_stage;
GError *error = NULL;
gchar *frag_str;
const GstGLFuncs *gl;
GST_OBJECT_LOCK (self);
/* FIXME: Return if already prepared */
gdk_gl_context_make_current (gl_bi->gdk_context);
gst_gl_context_activate (gl_bi->gst_context, TRUE);
if (!((vert_stage = gst_glsl_stage_new_with_string (gl_bi->gst_context,
GL_VERTEX_SHADER, GST_GLSL_VERSION_NONE,
GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
gst_gl_shader_string_vertex_mat4_vertex_transform)))) {
gdk_gl_context_make_current (gl_bi->gdk_context);
gst_gl_context_activate (gl_bi->gst_context, TRUE);
GST_OBJECT_UNLOCK (self);
GST_ERROR ("Failed to retrieve vertex shader for texture target");
return FALSE;
}
frag_str = gst_gl_shader_string_fragment_external_oes_get_default (
gl_bi->gst_context, GST_GLSL_VERSION_NONE,
GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY);
frag_stage = gst_glsl_stage_new_with_string (gl_bi->gst_context,
GL_FRAGMENT_SHADER, GST_GLSL_VERSION_NONE,
GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY, frag_str);
g_free (frag_str);
if (!frag_stage) {
gst_gl_context_activate (gl_bi->gst_context, FALSE);
gdk_gl_context_clear_current ();
GST_OBJECT_UNLOCK (self);
GST_ERROR ("Failed to retrieve fragment shader for texture target");
return FALSE;
}
if (!((self->shader = gst_gl_shader_new_link_with_stages (gl_bi->gst_context,
&error, vert_stage, frag_stage, NULL)))) {
gst_gl_context_activate (gl_bi->gst_context, FALSE);
gdk_gl_context_clear_current ();
GST_OBJECT_UNLOCK (self);
GST_ERROR ("Failed to initialize shader: %s", error->message);
g_clear_error (&error);
return FALSE;
}
self->attr_position =
gst_gl_shader_get_attribute_location (self->shader, "a_position");
self->attr_texture =
gst_gl_shader_get_attribute_location (self->shader, "a_texcoord");
gl = gl_bi->gst_context->gl_vtable;
if (gl->GenVertexArrays) {
gl->GenVertexArrays (1, &self->vao);
gl->BindVertexArray (self->vao);
}
gl->GenBuffers (1, &self->vertex_buffer);
gl->BindBuffer (GL_ARRAY_BUFFER, self->vertex_buffer);
gl->BufferData (GL_ARRAY_BUFFER, 4 * 5 * sizeof (GLfloat), vertices, GL_STATIC_DRAW);
if (gl->GenVertexArrays) {
gst_clapper_gl_uploader_bind_buffer (self);
gl->BindVertexArray (0);
}
gl->BindBuffer (GL_ARRAY_BUFFER, 0);
//self->prepared = TRUE;
gst_gl_context_activate (gl_bi->gst_context, FALSE);
gdk_gl_context_clear_current ();
GST_OBJECT_UNLOCK (self);
return TRUE;
}
static void
_tex_data_free (GstClapperDmabufTexData *tex_data)
{
GstClapperGLBaseImporter *gl_bi = GST_CLAPPER_GL_BASE_IMPORTER_CAST (tex_data->dmabuf_bi);
if (G_LIKELY (tex_data->id > 0)) {
const GstGLFuncs *gl;
GST_OBJECT_LOCK (gl_bi);
gl = gl_bi->gst_context->gl_vtable;
gdk_gl_context_make_current (gl_bi->gdk_context);
gst_gl_context_activate (gl_bi->gst_context, TRUE);
gl->DeleteTextures (1, &tex_data->id);
gst_gl_context_activate (gl_bi->gst_context, FALSE);
gdk_gl_context_clear_current ();
GST_OBJECT_UNLOCK (gl_bi);
}
gst_object_unref (tex_data->dmabuf_bi);
g_slice_free (GstClapperDmabufTexData, tex_data);
}
static gboolean
_dmabuf_into_texture (GstClapperGLUploader *self, gint *fds, GstVideoInfo *v_info,
gsize *offsets, GstClapperDmabufTexData *tex_data)
{
GstClapperGLBaseImporter *gl_bi = GST_CLAPPER_GL_BASE_IMPORTER_CAST (self);
GstEGLImage *image;
const GstGLFuncs *gl;
image = gst_egl_image_from_dmabuf_direct_target (gl_bi->gst_context,
fds, offsets, v_info, self->gst_tex_target);
/* If HW colorspace conversion failed and there is only one
* plane, we can just make it into single EGLImage as is */
if (!image && GST_VIDEO_INFO_N_PLANES (v_info) == 1)
image = gst_egl_image_from_dmabuf (gl_bi->gst_context,
fds[0], v_info, 0, offsets[0]);
if (!image)
return FALSE;
gl = gl_bi->gst_context->gl_vtable;
gl->GenTextures (1, &tex_data->id);
tex_data->width = GST_VIDEO_INFO_WIDTH (v_info);
tex_data->height = GST_VIDEO_INFO_HEIGHT (v_info);
gl->BindTexture (self->gl_tex_target, tex_data->id);
gl->TexParameteri (self->gl_tex_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
gl->TexParameteri (self->gl_tex_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
gl->TexParameteri (self->gl_tex_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
gl->TexParameteri (self->gl_tex_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
gl->EGLImageTargetTexture2D (self->gl_tex_target, gst_egl_image_get_image (image));
gl->BindTexture (GL_TEXTURE_2D, 0);
gst_egl_image_unref (image);
return TRUE;
}
static gboolean
_oes_texture_into_2d (GstClapperGLUploader *self, GstClapperDmabufTexData *tex_data)
{
GstClapperGLBaseImporter *gl_bi = GST_CLAPPER_GL_BASE_IMPORTER_CAST (self);
GLuint framebuffer, tex_id;
GLenum status;
const GstGLFuncs *gl;
gl = gl_bi->gst_context->gl_vtable;
gl->GenFramebuffers (1, &framebuffer);
gl->BindFramebuffer (GL_FRAMEBUFFER, framebuffer);
gl->GenTextures (1, &tex_id);
gl->BindTexture (GL_TEXTURE_2D, tex_id);
gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
gl->TexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, tex_data->width, tex_data->height, 0,
GL_RGBA, GL_UNSIGNED_BYTE, NULL);
gl->FramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, tex_id, 0);
status = gl->CheckFramebufferStatus (GL_FRAMEBUFFER);
if (G_UNLIKELY (status != GL_FRAMEBUFFER_COMPLETE)) {
GST_ERROR ("Invalid framebuffer status: %u", status);
gl->BindTexture (GL_TEXTURE_2D, 0);
gl->DeleteTextures (1, &tex_id);
gl->BindFramebuffer (GL_FRAMEBUFFER, 0);
gl->DeleteFramebuffers (1, &framebuffer);
return FALSE;
}
gl->Viewport (0, 0, tex_data->width, tex_data->height);
gst_gl_shader_use (self->shader);
if (gl->BindVertexArray)
gl->BindVertexArray (self->vao);
gst_clapper_gl_uploader_bind_buffer (self);
gl->ActiveTexture (GL_TEXTURE0);
gl->BindTexture (self->gl_tex_target, tex_data->id);
gst_gl_shader_set_uniform_1i (self->shader, "tex", 0);
gst_gl_shader_set_uniform_matrix_4fv (self->shader,
"u_transformation", 1, FALSE, vertical_flip_matrix);
gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);
if (gl->BindVertexArray)
gl->BindVertexArray (0);
else
gst_clapper_gl_uploader_unbind_buffer (self);
gl->BindTexture (self->gl_tex_target, 0);
/* Replace External OES texture with newly created 2D */
gl->DeleteTextures (1, &tex_data->id);
tex_data->id = tex_id;
gl->BindFramebuffer (GL_FRAMEBUFFER, 0);
gl->DeleteFramebuffers (1, &framebuffer);
return TRUE;
}
static GdkTexture *
dmabuf_into_gdk_texture (GstClapperGLUploader *self, GstVideoInfo *v_info, gint *fds, gsize *offsets)
{
GstClapperGLBaseImporter *gl_bi = GST_CLAPPER_GL_BASE_IMPORTER_CAST (self);
GdkTexture *texture = NULL;
GstClapperDmabufTexData *tex_data;
tex_data = g_slice_new (GstClapperDmabufTexData);
tex_data->dmabuf_bi = gst_object_ref (self);
GST_OBJECT_LOCK (self);
gdk_gl_context_make_current (gl_bi->gdk_context);
gst_gl_context_activate (gl_bi->gst_context, TRUE);
if (!_dmabuf_into_texture (self, fds, v_info, offsets, tex_data))
goto finish;
/* GTK4 does not support External OES textures.
* Make it into 2D using framebuffer + shader */
if (self->gst_tex_target == GST_GL_TEXTURE_TARGET_EXTERNAL_OES) {
if (G_UNLIKELY (!_oes_texture_into_2d (self, tex_data)))
goto finish;
}
texture = gdk_gl_texture_new (gl_bi->gdk_context,
tex_data->id,
tex_data->width,
tex_data->height,
(GDestroyNotify) _tex_data_free,
tex_data);
finish:
gst_gl_context_activate (gl_bi->gst_context, FALSE);
gdk_gl_context_clear_current ();
GST_OBJECT_UNLOCK (self);
return texture;
}
static gboolean
verify_dmabuf_memory (GstBuffer *buffer, GstVideoInfo *info, gint *fds, gsize *offsets)
{
guint i, n_planes = GST_VIDEO_INFO_N_PLANES (info);
for (i = 0; i < n_planes; i++) {
GstMemory *memory;
gsize plane_size, mem_skip;
guint mem_idx, length;
plane_size = gst_gl_get_plane_data_size (info, NULL, i);
if (!gst_buffer_find_memory (buffer,
GST_VIDEO_INFO_PLANE_OFFSET (info, i),
plane_size, &mem_idx, &length, &mem_skip)) {
GST_DEBUG ("Could not find memory %u", i);
return FALSE;
}
/* We cannot have more then one DMABuf per plane */
if (length != 1) {
GST_DEBUG ("Data for plane %u spans %u memories", i, length);
return FALSE;
}
memory = gst_buffer_peek_memory (buffer, mem_idx);
offsets[i] = memory->offset + mem_skip;
fds[i] = gst_dmabuf_memory_get_fd (memory);
}
return TRUE;
}
static void
_update_elements_caps_locked (GstClapperGLUploader *self, GstCaps *upload_sink_caps)
{
GstGLContext *gst_context;
GstClapperGLBaseImporter *gl_bi = GST_CLAPPER_GL_BASE_IMPORTER_CAST (self);
GstCaps *upload_src_caps, *color_sink_caps, *color_src_caps, *gdk_sink_caps;
gst_context = self->gl_handler->gst_context;
GST_INFO_OBJECT (self, "Input caps: %" GST_PTR_FORMAT, upload_sink_caps);
upload_src_caps = gst_gl_upload_transform_caps (self->upload, gst_context,
upload_src_caps = gst_gl_upload_transform_caps (self->upload, gl_bi->gst_context,
GST_PAD_SINK, upload_sink_caps, NULL);
upload_src_caps = gst_caps_fixate (upload_src_caps);
GST_INFO_OBJECT (self, "GLUpload caps: %" GST_PTR_FORMAT, upload_src_caps);
gst_gl_upload_set_caps (self->upload, upload_sink_caps, upload_src_caps);
gdk_sink_caps = gst_clapper_gl_context_handler_make_gdk_gl_caps (
GST_CAPS_FEATURE_MEMORY_GL_MEMORY, TRUE);
color_sink_caps = gst_gl_color_convert_transform_caps (gst_context,
gdk_sink_caps = gst_clapper_gl_base_importer_make_supported_gdk_gl_caps ();
color_sink_caps = gst_gl_color_convert_transform_caps (gl_bi->gst_context,
GST_PAD_SRC, upload_src_caps, gdk_sink_caps);
gst_caps_unref (gdk_sink_caps);
/* Second caps arg is transfer-full */
color_src_caps = gst_gl_color_convert_fixate_caps (gst_context,
color_src_caps = gst_gl_color_convert_fixate_caps (gl_bi->gst_context,
GST_PAD_SINK, upload_src_caps, color_sink_caps);
GST_INFO_OBJECT (self, "GLColorConvert caps: %" GST_PTR_FORMAT, color_src_caps);
@@ -70,9 +441,9 @@ gst_clapper_gl_uploader_set_caps (GstClapperImporter *importer, GstCaps *caps)
{
GstClapperGLUploader *self = GST_CLAPPER_GL_UPLOADER_CAST (importer);
GST_CLAPPER_GL_UPLOADER_LOCK (self);
GST_OBJECT_LOCK (self);
_update_elements_caps_locked (self, caps);
GST_CLAPPER_GL_UPLOADER_UNLOCK (self);
GST_OBJECT_UNLOCK (self);
}
static void
@@ -90,6 +461,36 @@ _uploader_reconfigure_locked (GstClapperGLUploader *self)
}
}
static gboolean
gst_clapper_gl_uploader_prepare (GstClapperImporter *importer)
{
gboolean res = GST_CLAPPER_IMPORTER_CLASS (parent_class)->prepare (importer);
if (res) {
GstClapperGLUploader *self = GST_CLAPPER_GL_UPLOADER_CAST (importer);
GstClapperGLBaseImporter *gl_bi = GST_CLAPPER_GL_BASE_IMPORTER_CAST (importer);
GST_OBJECT_LOCK (self);
if (!self->upload)
self->upload = gst_gl_upload_new (gl_bi->gst_context);
if (!self->color_convert)
self->color_convert = gst_gl_color_convert_new (gl_bi->gst_context);
GST_OBJECT_UNLOCK (self);
if (!(! !gst_gtk_invoke_on_main (
(GThreadFunc) (GCallback) prepare_dmabuf_support_on_main, self))) {
GST_WARNING_OBJECT (self, "Could not prepare DMABuf support");
/* FIXME: Continue to allow using glupload/cc as fallback */
return FALSE;
}
}
return res;
}
static GstBuffer *
_upload_perform_locked (GstClapperGLUploader *self, GstBuffer *buffer)
{
@@ -113,58 +514,54 @@ _upload_perform_locked (GstClapperGLUploader *self, GstBuffer *buffer)
return upload_buf;
}
static GstBufferPool *
gst_clapper_gl_uploader_create_pool (GstClapperImporter *importer, GstStructure **config)
{
/* Since GLUpload API provides a ready to use propose_allocation method,
* we will use it with our query in add_allocation_metas instead of
* making pool here ourselves */
return NULL;
}
static void
gst_clapper_gl_uploader_add_allocation_metas (GstClapperImporter *importer, GstQuery *query)
{
GstClapperGLUploader *self = GST_CLAPPER_GL_UPLOADER_CAST (importer);
GstGLUpload *upload;
GST_CLAPPER_GL_UPLOADER_LOCK (self);
upload = gst_object_ref (self->upload);
GST_CLAPPER_GL_UPLOADER_UNLOCK (self);
/* Add glupload supported meta */
gst_gl_upload_propose_allocation (upload, NULL, query);
gst_object_unref (upload);
/* We can support GL sync meta */
if (self->gl_handler->gst_context->gl_vtable->FenceSync)
gst_query_add_allocation_meta (query, GST_GL_SYNC_META_API_TYPE, NULL);
/* Also add base importer class supported meta */
GST_CLAPPER_IMPORTER_CLASS (parent_class)->add_allocation_metas (importer, query);
}
static GdkTexture *
gst_clapper_gl_uploader_generate_texture (GstClapperImporter *importer,
GstBuffer *buffer, GstVideoInfo *v_info)
{
GstClapperGLUploader *self = GST_CLAPPER_GL_UPLOADER_CAST (importer);
GstClapperGLBaseImporter *gl_bi = GST_CLAPPER_GL_BASE_IMPORTER_CAST (importer);
GstBuffer *upload_buf, *color_buf;
GstVideoMeta *meta;
GdkTexture *texture;
/* XXX: We both upload and perform color conversion here, thus we skip
* upload for buffers that are not going to be shown and gain more free
* CPU time to prepare the next one. Improves performance on weak HW. */
if ((meta = gst_buffer_get_video_meta (buffer))) {
guint i;
GST_VIDEO_INFO_WIDTH (v_info) = meta->width;
GST_VIDEO_INFO_HEIGHT (v_info) = meta->height;
for (i = 0; i < meta->n_planes; i++) {
GST_VIDEO_INFO_PLANE_OFFSET (v_info, i) = meta->offset[i];
GST_VIDEO_INFO_PLANE_STRIDE (v_info, i) = meta->stride[i];
}
}
/* FIXME: if can do dmabuf and seems like we have dmabuf here */
{
gint fds[GST_VIDEO_MAX_PLANES];
gsize offsets[GST_VIDEO_MAX_PLANES];
if (verify_dmabuf_memory (buffer, v_info, fds, offsets)) {
if ((texture = dmabuf_into_gdk_texture (self, v_info, fds, offsets))) {
GST_TRACE_OBJECT (self, "Got texture from DMABuf, skipping upload of %" GST_PTR_FORMAT, buffer);
goto done;
}
}
}
GST_LOG_OBJECT (self, "Uploading %" GST_PTR_FORMAT, buffer);
GST_CLAPPER_GL_UPLOADER_LOCK (self);
GST_OBJECT_LOCK (self);
upload_buf = _upload_perform_locked (self, buffer);
if (G_UNLIKELY (!upload_buf)) {
GST_ERROR_OBJECT (self, "Could not perform upload on input buffer");
GST_CLAPPER_GL_UPLOADER_UNLOCK (self);
GST_OBJECT_UNLOCK (self);
return NULL;
}
@@ -179,7 +576,7 @@ gst_clapper_gl_uploader_generate_texture (GstClapperImporter *importer,
self->has_pending_v_info = FALSE;
}
GST_CLAPPER_GL_UPLOADER_UNLOCK (self);
GST_OBJECT_UNLOCK (self);
if (G_UNLIKELY (!color_buf)) {
GST_ERROR_OBJECT (self, "Could not perform color conversion on input buffer");
@@ -187,19 +584,21 @@ gst_clapper_gl_uploader_generate_texture (GstClapperImporter *importer,
}
GST_LOG_OBJECT (self, "Color converted into %" GST_PTR_FORMAT, color_buf);
texture = gst_clapper_gl_context_handler_make_gl_texture (self->gl_handler, color_buf, &self->v_info);
texture = gst_clapper_gl_base_importer_make_gl_texture (gl_bi, color_buf, &self->v_info);
gst_buffer_unref (color_buf);
done:
return texture;
}
static void
gst_clapper_gl_uploader_init (GstClapperGLUploader *self)
{
g_mutex_init (&self->lock);
gst_video_info_init (&self->pending_v_info);
gst_video_info_init (&self->v_info);
self->gst_tex_target = GST_GL_TEXTURE_TARGET_EXTERNAL_OES;
self->gl_tex_target = gst_gl_texture_target_to_gl (self->gst_tex_target);
}
static void
@@ -210,9 +609,7 @@ gst_clapper_gl_uploader_finalize (GObject *object)
gst_clear_object (&self->upload);
gst_clear_object (&self->color_convert);
gst_clear_object (&self->gl_handler);
g_mutex_clear (&self->lock);
gst_clear_object (&self->shader);
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
}
@@ -228,101 +625,22 @@ gst_clapper_gl_uploader_class_init (GstClapperGLUploaderClass *klass)
gobject_class->finalize = gst_clapper_gl_uploader_finalize;
importer_class->prepare = gst_clapper_gl_uploader_prepare;
importer_class->set_caps = gst_clapper_gl_uploader_set_caps;
importer_class->create_pool = gst_clapper_gl_uploader_create_pool;
importer_class->add_allocation_metas = gst_clapper_gl_uploader_add_allocation_metas;
importer_class->generate_texture = gst_clapper_gl_uploader_generate_texture;
}
GstClapperImporter *
make_importer (GPtrArray *context_handlers)
make_importer (void)
{
GstClapperGLUploader *self;
GstClapperContextHandler *handler;
handler = gst_clapper_context_handler_obtain_with_type (context_handlers,
GST_TYPE_CLAPPER_GL_CONTEXT_HANDLER);
if (G_UNLIKELY (!handler))
return NULL;
self = g_object_new (GST_TYPE_CLAPPER_GL_UPLOADER, NULL);
self->gl_handler = GST_CLAPPER_GL_CONTEXT_HANDLER_CAST (handler);
self->upload = gst_gl_upload_new (self->gl_handler->gst_context);
self->color_convert = gst_gl_color_convert_new (self->gl_handler->gst_context);
return GST_CLAPPER_IMPORTER_CAST (self);
}
static GstCaps *
_make_actual_caps (GstClapperGLContextHandler *gl_handler)
{
GstGLUpload *upload;
GstCaps *gdk_sink_caps, *color_sink_caps, *upload_sink_caps, *actual;
guint i;
/* Having "gst_context" means we also have all other contexts and
* display as they are used to create it, so no need to check */
if (!gl_handler->gst_context)
return NULL;
gdk_sink_caps = gst_clapper_gl_context_handler_make_gdk_gl_caps (
GST_CAPS_FEATURE_MEMORY_GL_MEMORY, TRUE);
color_sink_caps = gst_gl_color_convert_transform_caps (gl_handler->gst_context,
GST_PAD_SRC, gdk_sink_caps, NULL);
gst_caps_unref (gdk_sink_caps);
upload = gst_gl_upload_new (NULL);
upload_sink_caps = gst_gl_upload_transform_caps (upload, gl_handler->gst_context,
GST_PAD_SRC, color_sink_caps, NULL);
gst_caps_unref (color_sink_caps);
gst_object_unref (upload);
/* Check for existence and remove duplicated structures,
* they may contain unsupported by our GL context formats */
actual = gst_caps_new_empty ();
for (i = 0; i < gst_caps_get_size (upload_sink_caps); i++) {
GstCaps *tmp = gst_caps_copy_nth (upload_sink_caps, i);
if (!gst_caps_can_intersect (actual, tmp))
gst_caps_append (actual, tmp);
else
gst_caps_unref (tmp);
}
gst_caps_unref (upload_sink_caps);
if (G_UNLIKELY (gst_caps_is_empty (actual)))
gst_clear_caps (&actual);
return actual;
return g_object_new (GST_TYPE_CLAPPER_GL_UPLOADER, NULL);
}
GstCaps *
make_caps (gboolean is_template, GstRank *rank, GPtrArray *context_handlers)
make_caps (GstRank *rank, GStrv *context_types)
{
GstCaps *caps = NULL;
*rank = GST_RANK_MARGINAL + 1;
*context_types = gst_clapper_gl_base_importer_make_gl_context_types ();
if (is_template) {
caps = gst_gl_upload_get_input_template_caps ();
} else if (context_handlers) {
GstClapperGLContextHandler *gl_handler;
/* Add GL context handler if not already present */
gst_clapper_gl_context_handler_add_handler (context_handlers);
if ((gl_handler = GST_CLAPPER_GL_CONTEXT_HANDLER_CAST (
gst_clapper_context_handler_obtain_with_type (context_handlers,
GST_TYPE_CLAPPER_GL_CONTEXT_HANDLER)))) {
caps = _make_actual_caps (gl_handler);
gst_object_unref (gl_handler);
}
}
if (caps)
*rank = GST_RANK_MARGINAL + 1;
return caps;
return gst_gl_upload_get_input_template_caps ();
}

View File

@@ -19,33 +19,37 @@
#pragma once
#include "gst/plugin/gstclapperimporter.h"
#include "gst/plugin/handlers/gl/gstclapperglcontexthandler.h"
#include "gstclapperglbaseimporter.h"
#include <gst/gl/gstglfuncs.h>
G_BEGIN_DECLS
#define GST_TYPE_CLAPPER_GL_UPLOADER (gst_clapper_gl_uploader_get_type())
G_DECLARE_FINAL_TYPE (GstClapperGLUploader, gst_clapper_gl_uploader, GST, CLAPPER_GL_UPLOADER, GstClapperImporter)
G_DECLARE_FINAL_TYPE (GstClapperGLUploader, gst_clapper_gl_uploader, GST, CLAPPER_GL_UPLOADER, GstClapperGLBaseImporter)
#define GST_CLAPPER_GL_UPLOADER_CAST(obj) ((GstClapperGLUploader *)(obj))
#define GST_CLAPPER_GL_UPLOADER_GET_LOCK(obj) (&GST_CLAPPER_GL_UPLOADER_CAST(obj)->lock)
#define GST_CLAPPER_GL_UPLOADER_LOCK(obj) g_mutex_lock (GST_CLAPPER_GL_UPLOADER_GET_LOCK(obj))
#define GST_CLAPPER_GL_UPLOADER_UNLOCK(obj) g_mutex_unlock (GST_CLAPPER_GL_UPLOADER_GET_LOCK(obj))
struct _GstClapperGLUploader
{
GstClapperImporter parent;
GMutex lock;
GstClapperGLContextHandler *gl_handler;
GstClapperGLBaseImporter parent;
GstGLUpload *upload;
GstGLColorConvert *color_convert;
GstVideoInfo pending_v_info, v_info;
gboolean has_pending_v_info;
/* DMABuf fast-path */
GstGLTextureTarget gst_tex_target;
guint gl_tex_target;
GstGLShader *shader;
GLuint vao;
GLuint vertex_buffer;
GLint attr_position;
GLint attr_texture;
};
G_END_DECLS

View File

@@ -47,6 +47,13 @@ gst_clapper_raw_importer_create_pool (GstClapperImporter *importer, GstStructure
return pool;
}
static void
gst_clapper_raw_importer_add_allocation_metas (GstClapperImporter *importer, GstQuery *query)
{
gst_query_add_allocation_meta (query, GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, NULL);
gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL);
}
static GdkTexture *
gst_clapper_raw_importer_generate_texture (GstClapperImporter *importer,
GstBuffer *buffer, GstVideoInfo *v_info)
@@ -79,17 +86,18 @@ gst_clapper_raw_importer_class_init (GstClapperRawImporterClass *klass)
"Clapper RAW Importer");
importer_class->create_pool = gst_clapper_raw_importer_create_pool;
importer_class->add_allocation_metas = gst_clapper_raw_importer_add_allocation_metas;
importer_class->generate_texture = gst_clapper_raw_importer_generate_texture;
}
GstClapperImporter *
make_importer (GPtrArray *context_handlers)
make_importer (void)
{
return g_object_new (GST_TYPE_CLAPPER_RAW_IMPORTER, NULL);
}
GstCaps *
make_caps (gboolean is_template, GstRank *rank, GPtrArray *context_handlers)
make_caps (GstRank *rank, GStrv *context_types)
{
*rank = GST_RANK_MARGINAL;

View File

@@ -1,9 +1,20 @@
gst_clapper_gl_base_importer_dep = dependency('', required: false)
all_importers = [
'glimporter',
'gluploader',
'rawimporter',
]
build_glbase = (
not get_option('glimporter').disabled()
or not get_option('gluploader').disabled()
)
gl_support_required = (
get_option('glimporter').enabled()
or get_option('gluploader').enabled()
)
# We cannot build any importers without sink that they depend on
if not gst_clapper_sink_dep.found()
foreach imp : all_importers
@@ -13,16 +24,70 @@ if not gst_clapper_sink_dep.found()
endforeach
endif
gst_plugin_gl_base_deps = [gst_clapper_sink_dep, gstgl_dep, gstglproto_dep]
have_gtk_gl_windowing = false
if gst_gl_have_window_x11 and (gst_gl_have_platform_egl or gst_gl_have_platform_glx)
gtk_x11_dep = dependency('gtk4-x11', required: false)
if gtk_x11_dep.found()
gst_plugin_gl_base_deps += gtk_x11_dep
if gst_gl_have_platform_glx
gst_plugin_gl_base_deps += gstglx11_dep
endif
have_gtk_gl_windowing = true
endif
endif
if gst_gl_have_window_wayland and gst_gl_have_platform_egl
gtk_wayland_dep = dependency('gtk4-wayland', required: false)
if gtk_wayland_dep.found()
gst_plugin_gl_base_deps += [gtk_wayland_dep, gstglwayland_dep]
have_gtk_gl_windowing = true
endif
endif
if gl_support_required and not have_gtk_gl_windowing
error('GL-based importer was enabled, but support for current GL windowing is missing')
endif
if gst_gl_have_platform_egl
gst_plugin_gl_base_deps += gstglegl_dep
endif
foreach dep : gst_plugin_gl_base_deps
if not dep.found()
if gl_support_required
error('GL-based importer was enabled, but required dependencies were not found')
endif
build_glbase = false
endif
endforeach
if build_glbase
gst_clapper_gl_base_importer_dep = declare_dependency(
link_with: library('gstclapperglbaseimporter',
'gstclapperglbaseimporter.c',
c_args: gst_clapper_plugin_args,
include_directories: configinc,
dependencies: gst_plugin_gl_base_deps,
version: libversion,
install: true,
),
include_directories: configinc,
dependencies: gst_plugin_gl_base_deps,
)
endif
build_glimporter = (
not get_option('glimporter').disabled()
and gst_clapper_gl_ch_dep.found()
and gst_clapper_gl_base_importer_dep.found()
)
if build_glimporter
library(
'gstclapperglimporter',
'gstclapperglimporter.c',
dependencies: gst_clapper_gl_ch_dep,
dependencies: gst_clapper_gl_base_importer_dep,
include_directories: configinc,
c_args: gst_clapper_plugin_args,
install: true,
@@ -32,14 +97,28 @@ endif
build_gluploader = (
not get_option('gluploader').disabled()
and gst_clapper_gl_ch_dep.found()
and gst_clapper_gl_base_importer_dep.found()
)
gluploader_deps = [
gst_clapper_gl_base_importer_dep,
gstallocators_dep,
]
foreach dep : gluploader_deps
if not dep.found()
if get_option('gluploader').enabled()
error('GL uploader was enabled, but required dependencies were not found')
endif
build_gluploader = false
endif
endforeach
if build_gluploader
library(
'gstclappergluploader',
'gstclappergluploader.c',
dependencies: gst_clapper_gl_ch_dep,
dependencies: gluploader_deps,
include_directories: configinc,
c_args: gst_clapper_plugin_args,
install: true,

View File

@@ -41,7 +41,6 @@ gst_clapper_plugin_sources = [
'gstclapperpaintable.c',
'gstgtkutils.c',
'gstplugin.c',
'gstclappercontexthandler.c',
'gstclapperimporter.c',
'gstclapperimporterloader.c',
]
@@ -61,5 +60,4 @@ if build_gst_plugin
)
endif
subdir('handlers')
subdir('importers')

13
lib/meson.build vendored
View File

@@ -9,8 +9,6 @@ cxx = meson.get_compiler('cpp')
cdata = configuration_data()
os_unix = host_machine.system() != 'windows'
if cc.get_id() == 'msvc'
msvc_args = [
# Ignore several spurious warnings for things gstreamer does very commonly
@@ -198,6 +196,8 @@ gsttag_dep = dependency('gstreamer-tag-1.0', version: gst_req,
fallback: ['gst-plugins-base', 'tag_dep'])
gstvideo_dep = dependency('gstreamer-video-1.0', version: gst_req,
fallback: ['gst-plugins-base', 'video_dep'])
gstallocators_dep = dependency('gstreamer-allocators-1.0', version: gst_req,
fallback : ['gst-plugins-base', 'allocators_dep'])
# GStreamer OpenGL
gstgl_dep = dependency('gstreamer-gl-1.0', version: gst_req,
@@ -245,12 +245,7 @@ libm = cc.find_library('m', required: false)
glib_dep = dependency('glib-2.0', version: glib_req, fallback: ['glib', 'libglib_dep'])
gmodule_dep = dependency('gmodule-2.0', fallback: ['glib', 'libgmodule_dep'])
gio_dep = dependency('gio-2.0', fallback: ['glib', 'libgio_dep'])
if os_unix
giounix_dep = dependency('gio-unix-2.0', version: glib_req, fallback: ['glib', 'libgio_dep'])
else
giowin_dep = dependency('gio-windows-2.0', version: glib_req, fallback : ['glib', 'libgio_dep'])
endif
giounix_dep = dependency('gio-unix-2.0', version: glib_req, fallback: ['glib', 'libgiounix_dep'])
cdata.set('DISABLE_ORC', 1)
cdata.set('GST_ENABLE_EXTRA_CHECKS', get_option('devel-checks'))
@@ -258,7 +253,7 @@ cdata.set('GST_ENABLE_EXTRA_CHECKS', get_option('devel-checks'))
configinc = include_directories('.')
libsinc = include_directories('gst')
gir = find_program('g-ir-scanner', required: false)
gir = find_program('g-ir-scanner')
gir_init_section = ['--add-init-section=extern void gst_init(gint*,gchar**);' + \
'g_setenv("GST_REGISTRY_1.0", "@0@", TRUE);'.format(meson.current_build_dir() + '/gir_empty_registry.reg') + \
'g_setenv("GST_PLUGIN_PATH_1_0", "", TRUE);' + \

View File

@@ -1,5 +1,5 @@
project('com.github.rafostar.Clapper', 'c', 'cpp',
version: '0.5.2',
version: '0.4.1',
meson_version: '>= 0.50.0',
license: 'GPL-3.0-or-later',
default_options: [

View File

@@ -10,7 +10,7 @@ option('lib',
)
option('gst-plugin',
type: 'feature',
value: 'auto',
value: 'enabled',
description: 'Build GStreamer plugin (includes GTK video sink element)'
)

View File

@@ -5,7 +5,7 @@
"sdk": "org.gnome.Sdk",
"sdk-extensions": [
"org.freedesktop.Sdk.Extension.rust-nightly",
"org.freedesktop.Sdk.Extension.llvm14"
"org.freedesktop.Sdk.Extension.llvm13"
],
"command": "com.github.rafostar.Clapper",
"finish-args": [
@@ -18,18 +18,20 @@
"--device=all",
"--filesystem=xdg-run/pipewire-0:ro",
"--filesystem=xdg-videos",
"--filesystem=xdg-run/gvfsd",
"--own-name=org.mpris.MediaPlayer2.Clapper",
"--talk-name=org.gtk.vfs.*",
"--talk-name=org.gnome.Shell",
"--env=GST_PLUGIN_SYSTEM_PATH=/app/lib/gstreamer-1.0"
"--env=GST_PLUGIN_SYSTEM_PATH=/app/lib/gstreamer-1.0",
"--env=GST_VAAPI_ALL_DRIVERS=1"
],
"build-options": {
"append-path": "/usr/lib/sdk/rust-nightly/bin:/usr/lib/sdk/llvm14/bin",
"prepend-ld-library-path": "/usr/lib/sdk/llvm14/lib"
"append-path": "/usr/lib/sdk/rust-nightly/bin:/usr/lib/sdk/llvm13/bin",
"prepend-ld-library-path": "/usr/lib/sdk/llvm13/lib"
},
"modules": [
"flathub/shared-modules/gudev/gudev.json",
"flathub/lib/libsass.json",
"flathub/lib/sassc.json",
"flathub/lib/libadwaita.json",
"flathub/lib/liba52.json",
"flathub/lib/libmpeg2.json",
"flathub/lib/libdv.json",

View File

@@ -1,7 +1,7 @@
{
"app-id": "com.github.rafostar.Clapper",
"runtime": "org.gnome.Platform",
"runtime-version": "43",
"runtime-version": "42",
"sdk": "org.gnome.Sdk",
"command": "com.github.rafostar.Clapper",
"finish-args": [
@@ -14,11 +14,10 @@
"--device=all",
"--filesystem=xdg-run/pipewire-0:ro",
"--filesystem=xdg-videos",
"--filesystem=xdg-run/gvfsd",
"--own-name=org.mpris.MediaPlayer2.Clapper",
"--talk-name=org.gtk.vfs.*",
"--talk-name=org.gnome.Shell",
"--env=GST_PLUGIN_SYSTEM_PATH=/app/lib/gstreamer-1.0"
"--env=GST_PLUGIN_SYSTEM_PATH=/app/lib/gstreamer-1.0",
"--env=GST_VAAPI_ALL_DRIVERS=1"
],
"modules": [
"flathub/shared-modules/gudev/gudev.json",
@@ -35,14 +34,11 @@
"flathub/lib/uchardet.json",
"flathub/gstreamer-1.0/gstreamer.json",
"testing/gtk4.json",
"testing/libadwaita.json",
"flathub/lib/libadwaita.json",
"testing/gtuber.json",
{
"name": "clapper",
"buildsystem": "meson",
"config-opts": [
"-Dc_args=\"-DHAVE_GST_PATCHES=1\""
],
"sources": [
{
"type": "dir",

View File

@@ -1,9 +1,6 @@
{
"name": "gst-plugins-rs",
"buildsystem": "simple",
"only-arches": [
"x86_64"
],
"build-options": {
"build-args": [
"--share=network"

View File

@@ -1,13 +0,0 @@
diff --git a/meson.build b/meson.build
index 38d23ed61c..68dea864a0 100644
--- a/meson.build
+++ b/meson.build
@@ -799,7 +799,7 @@ subdir('docs/tools')
subdir('docs/reference')
if not meson.is_cross_build()
- if meson.version().version_compare('>=0.57.0')
+ if false
gnome.post_install(
glib_compile_schemas: true,
gio_querymodules: gio_module_dirs,

View File

@@ -1,114 +0,0 @@
From 4dcd02e85315f487310e2e01fe9412706a77dc35 Mon Sep 17 00:00:00 2001
From: Emmanuele Bassi <ebassi@gnome.org>
Date: Tue, 19 Apr 2022 15:33:21 +0100
Subject: [PATCH] Quench the anger of GCC
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Direct access of the fields of the union trips compiler warnings with
GCC 12, such as:
../gtk/gtkimagedefinition.c:135:13: error: array subscript
GtkImageDefinition {aka union _GtkImageDefinition}[0] is partly
outside array bounds of GtkImageDefinitionEmpty[1] {aka
struct _GtkImageDefinitionEmpty[1]} [-Werror=array-bounds]
---
gtk/gtkimagedefinition.c | 38 ++++++++++++++++++++++++++++----------
1 file changed, 28 insertions(+), 10 deletions(-)
diff --git a/gtk/gtkimagedefinition.c b/gtk/gtkimagedefinition.c
index 1b7c9e51d9..3cf785b01c 100644
--- a/gtk/gtkimagedefinition.c
+++ b/gtk/gtkimagedefinition.c
@@ -132,7 +132,9 @@ gtk_image_definition_new_paintable (GdkPaintable *paintable)
GtkImageDefinition *
gtk_image_definition_ref (GtkImageDefinition *def)
{
- def->empty.ref_count++;
+ GtkImageDefinitionEmpty *empty = (GtkImageDefinitionEmpty *) def;
+
+ empty->ref_count++;
return def;
}
@@ -140,9 +142,11 @@ gtk_image_definition_ref (GtkImageDefinition *def)
void
gtk_image_definition_unref (GtkImageDefinition *def)
{
- def->empty.ref_count--;
+ GtkImageDefinitionEmpty *empty = (GtkImageDefinitionEmpty *) def;
+
+ empty->ref_count--;
- if (def->empty.ref_count > 0)
+ if (empty->ref_count > 0)
return;
switch (def->type)
@@ -152,13 +156,22 @@ gtk_image_definition_unref (GtkImageDefinition *def)
g_assert_not_reached ();
break;
case GTK_IMAGE_PAINTABLE:
- g_object_unref (def->paintable.paintable);
+ {
+ GtkImageDefinitionPaintable *paintable = (GtkImageDefinitionPaintable *) def;
+ g_object_unref (paintable->paintable);
+ }
break;
case GTK_IMAGE_ICON_NAME:
- g_free (def->icon_name.icon_name);
+ {
+ GtkImageDefinitionIconName *icon_name = (GtkImageDefinitionIconName *) def;
+ g_free (icon_name->icon_name);
+ }
break;
case GTK_IMAGE_GICON:
- g_object_unref (def->gicon.gicon);
+ {
+ GtkImageDefinitionGIcon *gicon = (GtkImageDefinitionGIcon *) def;
+ g_object_unref (gicon->gicon);
+ }
break;
}
@@ -189,27 +202,32 @@ gtk_image_definition_get_scale (const GtkImageDefinition *def)
const char *
gtk_image_definition_get_icon_name (const GtkImageDefinition *def)
{
+ const GtkImageDefinitionIconName *icon_name = (const GtkImageDefinitionIconName *) def;
+
if (def->type != GTK_IMAGE_ICON_NAME)
return NULL;
- return def->icon_name.icon_name;
+ return icon_name->icon_name;
}
GIcon *
gtk_image_definition_get_gicon (const GtkImageDefinition *def)
{
+ const GtkImageDefinitionGIcon *gicon = (const GtkImageDefinitionGIcon *) def;
+
if (def->type != GTK_IMAGE_GICON)
return NULL;
- return def->gicon.gicon;
+ return gicon->gicon;
}
GdkPaintable *
gtk_image_definition_get_paintable (const GtkImageDefinition *def)
{
+ const GtkImageDefinitionPaintable *paintable = (const GtkImageDefinitionPaintable *) def;
+
if (def->type != GTK_IMAGE_PAINTABLE)
return NULL;
- return def->paintable.paintable;
+ return paintable->paintable;
}
-
--
GitLab

View File

@@ -1,11 +1,14 @@
{
"name": "gtk",
"buildsystem": "meson",
"build-options": {
"build-args": [
"--share=network"
]
},
"config-opts": [
"--buildtype=release",
"--wrap-mode=nodownload",
"-Dbroadway-backend=true",
"-Dwin32-backend=false",
"-Dmacos-backend=false",
"-Dmedia-ffmpeg=disabled",
@@ -23,19 +26,12 @@
{
"type": "git",
"url": "https://gitlab.gnome.org/GNOME/gtk.git",
"branch": "gtk-4-4"
"tag": "4.6.2",
"commit": "aec7ca82007dbe07faee6be084d20758ebac2b91"
},
{
"type": "patch",
"path": "gtk4-popover-unrealize.patch"
},
{
"type": "patch",
"path": "gtk4-disable-meson-gnome-post-install.patch"
},
{
"type": "patch",
"path": "gtk4-latest-gcc-fix.patch"
}
]
}

View File

@@ -1,21 +0,0 @@
{
"name": "libadwaita",
"buildsystem": "meson",
"config-opts": [
"--buildtype=release",
"--wrap-mode=nofallback",
"-Dintrospection=enabled",
"-Dvapi=false",
"-Dgtk_doc=false",
"-Dtests=false",
"-Dexamples=false"
],
"sources": [
{
"type": "git",
"url": "https://gitlab.gnome.org/GNOME/libadwaita.git",
"tag": "1.0.0.alpha.4",
"commit": "6b447fde8f270001a0dc29ef59d3e9bf6d32dae9"
}
]
}

View File

@@ -1 +1 @@
ar ast ca cs de es eu fa fr he hu it ja nl pl pt pt_BR ru sv tr zh_CN
ar ca cs de es eu fr hu it ja nl pl pt pt_BR ru sv tr zh_CN

165
po/af.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2021-09-14 15:25\n"
"Last-Translator: \n"
"Language-Team: Afrikaans\n"
"Language: af_ZA\n"
@@ -41,11 +41,12 @@ msgstr ""
msgid "Speed"
msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr ""
@@ -117,7 +118,7 @@ msgstr ""
msgid "Export to file"
msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr ""
@@ -181,183 +182,203 @@ msgstr ""
msgid "Return to the preferences"
msgstr ""
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr ""
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr ""
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr ""
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr ""
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr ""
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr ""
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr ""
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr ""
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr ""
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr ""
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr ""
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr ""
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr ""
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr ""
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr ""
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr ""
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr ""
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr ""
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr ""
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr ""
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr ""
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr ""
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr ""
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr ""
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr ""
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr ""
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr ""
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr ""
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr ""
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr ""
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr ""
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr ""
#: ui/preferences-window.ui:188
msgid "Tweaks"
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:192
msgid "Appearance"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:195
msgid "Dark theme"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:201
msgid "Render window shadows"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr ""
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr ""
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr ""
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr ""
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr ""
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr ""
@@ -424,15 +445,15 @@ msgstr ""
msgid "Ends at: %s"
msgstr ""
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr ""
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr ""
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr ""

127
po/ar.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2022-03-26 13:37\n"
"Last-Translator: \n"
"Language-Team: Arabic\n"
"Language: ar_SA\n"
@@ -41,11 +41,12 @@ msgstr "حول Clapper"
msgid "Speed"
msgstr "السرعة"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr "عادي"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr "عام"
@@ -117,7 +118,7 @@ msgstr "تغيير وضع التكرار"
msgid "Export to file"
msgstr "التصدير إلى مِلَفّ"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr "المشغل"
@@ -181,183 +182,203 @@ msgstr "برامج فك التشفير"
msgid "Return to the preferences"
msgstr "العودة إلى الإعدادات"
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr "السلوك"
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr "ملء الشاشة تلقائياً"
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "أدخل ملء الشاشة عند استبدال قائمة التشغيل باستثناء الوضع العائم"
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr "اطلب استئناف الوسائط السابقة"
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr "عائم في جميع مساحات العمل"
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr "هذا الخِيار يعمل فقط على GNOME"
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr "بعد انتهاء"
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr "لا تفعل شيئًا"
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr "تجميد الأخر لقطة"
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr "أغلق التطبيق"
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr "الصوت"
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr "قيمة الافتراضية مخصصة"
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr "تعيين مستوى صوت مخصص عند بَدْء التشغيل بدلاً من إعادته"
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr "حجم الصوت"
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr "الوضع"
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr "النمط"
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr "دَقيق"
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr "سريع"
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr "الوحدة"
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr "ثواني"
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr "دقائق"
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr "النسبة المئوية"
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr "القيمة"
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr "الصوت"
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr "إزاحة بالمللي ثانية"
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr "تنسيقات الصوت الأصلية فقط"
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr "التَّرْجَمَةً"
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr "الخط الافتراضي"
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr "الشبكة"
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr "العميل"
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr "التخزين المؤقت للتنزيل بالتدريج"
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr "الخادم"
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr "التحكم بالوسائط عن بعد"
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr "منفذ الاستماع"
#: ui/preferences-window.ui:188
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr "تشغيل تطبيق الويب في الخلفية"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "يتطلب GTK مجمعة مع Broadway backend"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "منفذ تطبيق الويب"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "تفضيل البث التكيفي"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "الأعلى جودة"
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr "تعديلات"
#: ui/preferences-window.ui:192
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr "إعدادات المظهر"
#: ui/preferences-window.ui:195
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr "المظهر الداكن"
#: ui/preferences-window.ui:201
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr "عرض ظلال النافذة"
#: ui/preferences-window.ui:202
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr "تعطيل لزيادة الأداء عند وضع النافذة"
#: ui/preferences-window.ui:213
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr "أعدادات الإضافات"
#: ui/preferences-window.ui:214
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr "تغيير الأعدادات الافتراضية للأضافات GStreamer"
#: ui/preferences-window.ui:219
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr "استخدام playbin3"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr "يتطلب إعادة التشغيل"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr "تجريبية"
#: ui/preferences-window.ui:228
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr "استخدام PipeWire لإخراج الصوت"
@@ -424,15 +445,15 @@ msgstr "Yousef Fawaz"
msgid "Ends at: %s"
msgstr "ينتهي في: %s"
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr "غير محدّد"
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr "قنوات"
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr "مُعطّل"

438
po/ast.po
View File

@@ -1,438 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-06-26 22:43\n"
"Last-Translator: \n"
"Language-Team: Asturian\n"
"Language: ast_ES\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: clapper\n"
"X-Crowdin-Project-ID: 473374\n"
"X-Crowdin-Language: ast\n"
"X-Crowdin-File: /master/po/com.github.rafostar.Clapper.pot\n"
"X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6
msgid "Open Files…"
msgstr "Abrir ficheros…"
#: ui/clapper.ui:10
msgid "Open URI…"
msgstr "Abrir un URI…"
#: ui/clapper.ui:16 ui/preferences-window.ui:4
msgid "Preferences"
msgstr "Preferencies"
#: ui/clapper.ui:20
msgid "Shortcuts"
msgstr "Atayos"
#: ui/clapper.ui:26
msgid "About Clapper"
msgstr "Tocante a Clapper"
#: ui/elapsed-time-button.ui:27
msgid "Speed"
msgstr "Velocidá"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
msgid "Normal"
msgstr "Normal"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General"
msgstr "Xenerales"
#: ui/help-overlay.ui:13
msgid "Show shortcuts"
msgstr "Amosar los atayos"
#: ui/help-overlay.ui:19
msgid "Toggle fullscreen"
msgstr ""
#: ui/help-overlay.ui:20
msgid "Double tap | Double click"
msgstr ""
#: ui/help-overlay.ui:26
msgid "Leave fullscreen"
msgstr ""
#: ui/help-overlay.ui:32
msgid "Reveal OSD (fullscreen only)"
msgstr ""
#: ui/help-overlay.ui:33
msgid "Tap"
msgstr ""
#: ui/help-overlay.ui:39
msgid "Quit"
msgstr "Colar"
#: ui/help-overlay.ui:47
msgid "Media"
msgstr ""
#: ui/help-overlay.ui:50
msgid "Open files"
msgstr ""
#: ui/help-overlay.ui:56 src/dialogs.js:137
msgid "Open URI"
msgstr ""
#: ui/help-overlay.ui:64
msgid "Playlist"
msgstr "Llista de reproducción"
#: ui/help-overlay.ui:67
msgid "Next item"
msgstr ""
#: ui/help-overlay.ui:68
msgid "Double tap (right side)"
msgstr ""
#: ui/help-overlay.ui:74
msgid "Previous item"
msgstr ""
#: ui/help-overlay.ui:75
msgid "Double tap (left side)"
msgstr ""
#: ui/help-overlay.ui:81
msgid "Change repeat mode"
msgstr ""
#: ui/help-overlay.ui:87
msgid "Export to file"
msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback"
msgstr ""
#: ui/help-overlay.ui:98
msgid "Toggle play"
msgstr ""
#: ui/help-overlay.ui:99
msgid "Long press | Right click"
msgstr ""
#: ui/help-overlay.ui:105
msgid "Seek forward"
msgstr ""
#: ui/help-overlay.ui:106
msgid "Swipe right | Scroll right"
msgstr ""
#: ui/help-overlay.ui:112
msgid "Seek backward"
msgstr ""
#: ui/help-overlay.ui:113
msgid "Swipe left | Scroll left"
msgstr ""
#: ui/help-overlay.ui:119
msgid "Volume up"
msgstr ""
#: ui/help-overlay.ui:120
msgid "Swipe up | Scroll up"
msgstr ""
#: ui/help-overlay.ui:126
msgid "Volume down"
msgstr ""
#: ui/help-overlay.ui:127
msgid "Swipe down | Scroll down"
msgstr ""
#: ui/help-overlay.ui:133
msgid "Toggle mute"
msgstr ""
#: ui/help-overlay.ui:139
msgid "Next chapter"
msgstr ""
#: ui/help-overlay.ui:145
msgid "Previous chapter"
msgstr ""
#: ui/preferences-plugin-ranking-subpage.ui:11
msgid "Decoders"
msgstr ""
#: ui/preferences-plugin-ranking-subpage.ui:18
msgid "Return to the preferences"
msgstr ""
#: ui/preferences-window.ui:15
msgid "Behavior"
msgstr ""
#: ui/preferences-window.ui:18
msgid "Auto fullscreen"
msgstr ""
#: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr ""
#: ui/preferences-window.ui:25
msgid "Ask to resume recent media"
msgstr ""
#: ui/preferences-window.ui:31
msgid "Float on all workspaces"
msgstr ""
#: ui/preferences-window.ui:32
msgid "This option only works on GNOME"
msgstr "Esta opción namái funciona en GNOME"
#: ui/preferences-window.ui:38
msgid "After playback"
msgstr ""
#: ui/preferences-window.ui:43
msgid "Do nothing"
msgstr ""
#: ui/preferences-window.ui:44
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:45
msgid "Close the app"
msgstr "Zarrar laplicación"
#: ui/preferences-window.ui:55
msgid "Volume"
msgstr "Volume"
#: ui/preferences-window.ui:58
msgid "Custom initial value"
msgstr ""
#: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it"
msgstr ""
#: ui/preferences-window.ui:63
msgid "Volume percentage"
msgstr "Porcentaxe de volume"
#: ui/preferences-window.ui:74
msgid "Seeking"
msgstr ""
#: ui/preferences-window.ui:77
msgid "Mode"
msgstr "Mou"
#: ui/preferences-window.ui:83
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:84
msgid "Fast"
msgstr ""
#: ui/preferences-window.ui:92
msgid "Unit"
msgstr ""
#: ui/preferences-window.ui:97
msgid "Second"
msgstr "Segundu"
#: ui/preferences-window.ui:98
msgid "Minute"
msgstr "Minutu"
#: ui/preferences-window.ui:99
msgid "Percentage"
msgstr "Porcentaxe"
#: ui/preferences-window.ui:107
msgid "Value"
msgstr ""
#: ui/preferences-window.ui:122
msgid "Audio"
msgstr "Audio"
#: ui/preferences-window.ui:125
msgid "Offset in milliseconds"
msgstr ""
#: ui/preferences-window.ui:132
msgid "Only native audio formats"
msgstr ""
#: ui/preferences-window.ui:140
msgid "Subtitles"
msgstr "Sotítulos"
#: ui/preferences-window.ui:143
msgid "Default font"
msgstr ""
#: ui/preferences-window.ui:153
msgid "Network"
msgstr "Rede"
#: ui/preferences-window.ui:157
msgid "Client"
msgstr "Veceru"
#: ui/preferences-window.ui:160
msgid "Progressive download buffering"
msgstr ""
#: ui/preferences-window.ui:168
msgid "Server"
msgstr "Sirvidor"
#: ui/preferences-window.ui:171
msgid "Control player remotely"
msgstr ""
#: ui/preferences-window.ui:175
msgid "Listening port"
msgstr ""
#: ui/preferences-window.ui:188
msgid "Tweaks"
msgstr ""
#: ui/preferences-window.ui:192
msgid "Appearance"
msgstr ""
#: ui/preferences-window.ui:195
msgid "Dark theme"
msgstr "Tema escuru"
#: ui/preferences-window.ui:201
msgid "Render window shadows"
msgstr ""
#: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output"
msgstr ""
#: src/buttons.js:201
#, javascript-format
msgid "Decoder: %s"
msgstr ""
#: src/dialogs.js:152
msgid "Enter or drop URI here"
msgstr ""
#: src/dialogs.js:157
msgid "Cancel"
msgstr "Encaboxar"
#: src/dialogs.js:158
msgid "Open"
msgstr "Abrir"
#: src/dialogs.js:226
msgid "Title"
msgstr "Títulu"
#: src/dialogs.js:227
msgid "Completed"
msgstr "Completáu al"
#: src/dialogs.js:235
msgid "Resume playback?"
msgstr "¿Quies siguir cola reproducción?"
#: src/dialogs.js:289
#, javascript-format
msgid "GTK version: %s"
msgstr "Versión de GTK: %s"
#: src/dialogs.js:290
#, javascript-format
msgid "Adwaita version: %s"
msgstr "Versión dAdwaita: %s"
#: src/dialogs.js:291
#, javascript-format
msgid "GStreamer version: %s"
msgstr "Versión de GStreamer: %s"
#: src/dialogs.js:292
#, javascript-format
msgid "GJS version: %s"
msgstr "Versión de GJS: %s"
#: src/dialogs.js:300
msgid "A GNOME media player powered by GStreamer"
msgstr ""
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305
msgid "translator-credits"
msgstr "Adolfo Jayme Barrientos <fitojb@ubuntu.com>, 2022"
#: src/revealers.js:170
#, javascript-format
msgid "Ends at: %s"
msgstr ""
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined"
msgstr ""
#: src/widget.js:242
msgid "Channels"
msgstr ""
#: src/widget.js:260
msgid "Disabled"
msgstr ""

127
po/ca.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2021-09-14 16:21\n"
"Last-Translator: \n"
"Language-Team: Catalan\n"
"Language: ca_ES\n"
@@ -41,11 +41,12 @@ msgstr "Quant al Clapper"
msgid "Speed"
msgstr "Velocitat"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr "Normal"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr "General"
@@ -117,7 +118,7 @@ msgstr "Canvia el mode de repetició"
msgid "Export to file"
msgstr "Exporta a un fitxer"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr "Reproducció"
@@ -181,183 +182,203 @@ msgstr "Descodificadors"
msgid "Return to the preferences"
msgstr "Torna a les preferències"
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr "Comportament"
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr "Pantalla completa automàtica"
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Entra a pantalla completa quan se substitueix la llista de reproducció excepte el mode flotant"
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr "Pregunta per reprendre recents"
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr "Flota en tots els espais de treball"
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr "Aquesta opció només funciona amb el GNOME"
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr "Després de la reproducció"
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr "No facis res"
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr "Congela l'últim fotograma"
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr "Surt de l'aplicació"
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr "Volum"
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr "Valor inicial personalitzat"
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr "Estableix el volum personalitzat a l'inici en lloc de restaurar-lo"
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr "Percentatge de volum"
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr "Cerca"
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr "Mode"
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr "Acurat"
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr "Ràpid"
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr "Unitat"
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr "Segon"
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr "Minut"
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr "Percentatge"
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr "Valor"
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr "Àudio"
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr "Desplaçament en mil·lisegons"
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr "Només formats d'àudio natius"
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr "Subtítols"
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr "Tipus de lletra per defecte"
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr "Xarxa"
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr "Client"
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr "Memòria intermèdia de baixada progressiva"
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr "Servidor"
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr "Controla el reproductor remotament"
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr "Port d'escolta"
#: ui/preferences-window.ui:188
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr "Executa l'aplicació web en segon pla"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Requereix el GTK compilat amb el backend Broadway"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Port de l'aplicació web"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Prefereix la transmissió adaptativa"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Qualitat màxima"
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr "Ajustaments"
#: ui/preferences-window.ui:192
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr "Aparença"
#: ui/preferences-window.ui:195
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr "Tema fosc"
#: ui/preferences-window.ui:201
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr "Renderitza les ombres de la finestra"
#: ui/preferences-window.ui:202
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr "Inhabilita per augmentar el rendiment en mode finestra"
#: ui/preferences-window.ui:213
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr "Classificació dels connectors"
#: ui/preferences-window.ui:214
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr "Altera els rangs predeterminats dels connectors del GStreamer"
#: ui/preferences-window.ui:219
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr "Usa playbin3"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr "Requereix reiniciar el reproductor"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr "Experimental"
#: ui/preferences-window.ui:228
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr "Usa PipeWire per la sortida d'àudio"
@@ -424,15 +445,15 @@ msgstr "Ícar Nin Solana <icar.nin@protonmail.com>, 2021"
msgid "Ends at: %s"
msgstr "Acaba a la/les %s"
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr "Sense determinar"
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr "Canals"
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr "Deshabilitat"

View File

@@ -8,13 +8,13 @@ msgid ""
msgstr ""
"Project-Id-Version: com.github.rafostar.Clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: ui/clapper.ui:6
@@ -41,11 +41,12 @@ msgstr ""
msgid "Speed"
msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr ""
@@ -117,7 +118,7 @@ msgstr ""
msgid "Export to file"
msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr ""
@@ -181,183 +182,203 @@ msgstr ""
msgid "Return to the preferences"
msgstr ""
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr ""
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr ""
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr ""
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr ""
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr ""
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr ""
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr ""
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr ""
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr ""
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr ""
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr ""
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr ""
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr ""
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr ""
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr ""
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr ""
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr ""
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr ""
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr ""
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr ""
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr ""
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr ""
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr ""
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr ""
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr ""
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr ""
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr ""
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr ""
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr ""
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr ""
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr ""
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr ""
#: ui/preferences-window.ui:188
msgid "Tweaks"
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:192
msgid "Appearance"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:195
msgid "Dark theme"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:201
msgid "Render window shadows"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr ""
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr ""
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr ""
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr ""
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr ""
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr ""
@@ -424,14 +445,14 @@ msgstr ""
msgid "Ends at: %s"
msgstr ""
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr ""
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr ""
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr ""

127
po/cs.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2021-09-19 20:57\n"
"Last-Translator: \n"
"Language-Team: Czech\n"
"Language: cs_CZ\n"
@@ -41,11 +41,12 @@ msgstr "O aplikaci Clapper"
msgid "Speed"
msgstr "Rychlost"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr "Normální"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr "Obecné"
@@ -117,7 +118,7 @@ msgstr "Změnit režim opakování"
msgid "Export to file"
msgstr "Exportovat do souboru"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr "Přehrávání"
@@ -181,183 +182,203 @@ msgstr "Dekodéry"
msgid "Return to the preferences"
msgstr "Zpět do předvoleb"
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr "Chování"
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr "Automaticky na celou obrazovku"
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Přejít do režimu na celou obrazovku při nahrazení seznamu skladeb s výjimkou plovoucího režimu"
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr "Zeptat se na obnovení nedávných médií"
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr "Plovoucí režim na všech pracovních plochách"
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr "Tato možnost funguje pouze na GNOME"
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr "Po skončení přehrávání"
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr "Nedělat nic"
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr "Zůstat na posledním snímku"
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr "Zavřít aplikaci"
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr "Hlasitost"
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr "Vlastní počáteční hodnota"
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr "Nastavit vlastní hlasitost při spuštění namísto obnovení předchozí hodnoty"
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr "Procento hlasitosti"
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr "Přetáčení"
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr "Režim"
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr "Přesný"
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr "Rychlý"
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr "Jednotka"
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr "Sekundy"
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr "Minuty"
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr "Procenta"
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr "Hodnota"
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr "Zvuk"
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr "Posunutí v milisekundách"
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr "Pouze nativní formáty zvuku"
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr "Titulky"
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr "Výchozí styl písma"
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr "Síť"
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr "Klient"
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr "Postupné stahování do vyrovnávací paměti"
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr "Server"
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr "Vzdáleně ovládat přehrávač"
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr "Naslouchat na portu"
#: ui/preferences-window.ui:188
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr "Spustit webovou aplikaci na pozadí"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Vyžaduje GTK kompilovaný s Broadway backendem"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Port webové aplikace"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Preferovat adaptivní streamování"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Maximální kvalita"
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr "Vylepšení"
#: ui/preferences-window.ui:192
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr "Vzhled"
#: ui/preferences-window.ui:195
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr "Tmavý motiv"
#: ui/preferences-window.ui:201
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr "Vykreslovat stíny okna"
#: ui/preferences-window.ui:202
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr "Zakázat pro zvýšení výkonu"
#: ui/preferences-window.ui:213
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr "Pořadí pluginů"
#: ui/preferences-window.ui:214
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr "Změna výchozího pořadí zásuvných modulů GStreameru"
#: ui/preferences-window.ui:219
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr "Použít playbin3"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr "Vyžaduje restart přehrávače"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr "Experimentální"
#: ui/preferences-window.ui:228
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr "Použít PipeWire pro zvukový výstup"
@@ -424,15 +445,15 @@ msgstr "Vojtěch Perník <translations@pervoj.cz>"
msgid "Ends at: %s"
msgstr "Končí v: %s"
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr "Neurčeno"
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr "Kanály"
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr "Vypnuto"

165
po/da.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2021-09-14 15:25\n"
"Last-Translator: \n"
"Language-Team: Danish\n"
"Language: da_DK\n"
@@ -41,11 +41,12 @@ msgstr ""
msgid "Speed"
msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr ""
@@ -117,7 +118,7 @@ msgstr ""
msgid "Export to file"
msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr ""
@@ -181,183 +182,203 @@ msgstr ""
msgid "Return to the preferences"
msgstr ""
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr ""
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr ""
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr ""
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr ""
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr ""
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr ""
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr ""
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr ""
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr ""
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr ""
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr ""
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr ""
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr ""
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr ""
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr ""
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr ""
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr ""
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr ""
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr ""
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr ""
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr ""
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr ""
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr ""
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr ""
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr ""
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr ""
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr ""
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr ""
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr ""
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr ""
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr ""
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr ""
#: ui/preferences-window.ui:188
msgid "Tweaks"
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:192
msgid "Appearance"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:195
msgid "Dark theme"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:201
msgid "Render window shadows"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr ""
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr ""
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr ""
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr ""
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr ""
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr ""
@@ -424,15 +445,15 @@ msgstr ""
msgid "Ends at: %s"
msgstr ""
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr ""
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr ""
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr ""

131
po/de.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-06-24 17:27\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2021-09-14 15:25\n"
"Last-Translator: \n"
"Language-Team: German\n"
"Language: de_DE\n"
@@ -41,11 +41,12 @@ msgstr "Über Clapper"
msgid "Speed"
msgstr "Wiedergabegeschwindigkeit"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr "Normal"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr "Allgemein"
@@ -117,7 +118,7 @@ msgstr "Wiederholmodus ändern"
msgid "Export to file"
msgstr "Als Datei exportieren"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr "Wiedergabe"
@@ -163,7 +164,7 @@ msgstr "Nach unten wischen bzw. scrollen"
#: ui/help-overlay.ui:133
msgid "Toggle mute"
msgstr "Stummschaltung umschalten"
msgstr "In Vollbildmodus wechseln"
#: ui/help-overlay.ui:139
msgid "Next chapter"
@@ -181,183 +182,203 @@ msgstr "Decodierer"
msgid "Return to the preferences"
msgstr "Zurück zu den Einstellungen"
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr "Verhalten"
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr "Automatischer Vollbildmodus"
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Vollbildmodus betreten, wenn Wiedergabeliste ersetzt wird. (Außer Clapper befindet sich im Schwebemodus)"
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr "Nachfragen ob kürzlich wiedergegebene Medien weitergespielt werden sollen"
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr "Schwebemodus auf allen Arbeitsflächen"
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr "Diese Option funktioniert nur auf GNOME"
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr "Nach Wiedergabe"
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr "Nichts tun"
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr "Letztes Bild einfrieren"
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr "Anwendung beenden"
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr "Lautstärke"
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr "Benutzerdefinierter Anfangswert"
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr "Lautstärke auf einen fixierten Wert beim Start setzen, anstelle ihn wiederherzustellen."
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr "Lautstärke (in Prozent)"
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr "Springen"
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr "Modus"
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr "Genau"
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr "Schnell"
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr "Einheit"
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr "Sekunden"
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr "Minuten"
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr "Prozentsatz"
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr "Wert"
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr "Audio"
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr "Verschiebung in Millisekunden"
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr "Nur systemeigene Audioformate"
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr "Untertitel"
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr "Standartschriftart"
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr "Netzwerk"
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr "Client"
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr "Fortschreitender Download-Puffer"
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr "Server"
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr "Clapper fernsteuern"
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr "Empfangsport"
#: ui/preferences-window.ui:188
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr "Webanwendung im Hintergrund starten"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Benötigt, dass GTK mit Broadway Unterstützung kompiliert wurde"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Webanwendungsport"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Bevorzuge adaptives Streaming"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Höchste Qualität"
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr "Optimierungen"
#: ui/preferences-window.ui:192
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr "Erscheinungsbild"
#: ui/preferences-window.ui:195
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr "Dunkler Modus"
#: ui/preferences-window.ui:201
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr "Fensterschatten darstellen"
#: ui/preferences-window.ui:202
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr "Deaktivieren, um Performance im Fenstermodus zu verbessern"
#: ui/preferences-window.ui:213
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr "Plugin-Reihenfolge"
#: ui/preferences-window.ui:214
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr "Standard GStreamer Reihenfolge verändern"
#: ui/preferences-window.ui:219
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr "Playbin3 benutzen"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr "Benötigt Neustart von Clapper"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr "Experimentell"
#: ui/preferences-window.ui:228
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr "PipeWire für Audioausgabe verwenden"
@@ -417,22 +438,22 @@ msgstr "Ein von GStreamer betriebener GNOME Multimedia-Player"
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305
msgid "translator-credits"
msgstr "Florian \"sp1rit\" <sp1rit@disroot.org>"
msgstr ""
#: src/revealers.js:170
#, javascript-format
msgid "Ends at: %s"
msgstr "Ended um %s"
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr "Unbestimmet"
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr "Audio-Kanäle"
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr "Deaktiviert"

165
po/el.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2021-09-14 15:25\n"
"Last-Translator: \n"
"Language-Team: Greek\n"
"Language: el_GR\n"
@@ -41,11 +41,12 @@ msgstr ""
msgid "Speed"
msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr ""
@@ -117,7 +118,7 @@ msgstr ""
msgid "Export to file"
msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr ""
@@ -181,183 +182,203 @@ msgstr ""
msgid "Return to the preferences"
msgstr ""
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr ""
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr ""
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr ""
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr ""
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr ""
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr ""
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr ""
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr ""
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr ""
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr ""
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr ""
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr ""
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr ""
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr ""
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr ""
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr ""
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr ""
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr ""
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr ""
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr ""
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr ""
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr ""
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr ""
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr ""
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr ""
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr ""
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr ""
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr ""
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr ""
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr ""
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr ""
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr ""
#: ui/preferences-window.ui:188
msgid "Tweaks"
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:192
msgid "Appearance"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:195
msgid "Dark theme"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:201
msgid "Render window shadows"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr ""
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr ""
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr ""
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr ""
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr ""
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr ""
@@ -424,15 +445,15 @@ msgstr ""
msgid "Ends at: %s"
msgstr ""
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr ""
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr ""
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr ""

127
po/es.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2022-01-16 16:58\n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"Language: es_ES\n"
@@ -41,11 +41,12 @@ msgstr "Acerca de Clapper"
msgid "Speed"
msgstr "Velocidad"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr "Normal"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr "General"
@@ -117,7 +118,7 @@ msgstr "Cambiar a modo repetir"
msgid "Export to file"
msgstr "Exportar a archivo"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr "Reproducir"
@@ -181,183 +182,203 @@ msgstr "Decodificadores"
msgid "Return to the preferences"
msgstr "Regresar a preferencias"
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr "Configuraciones"
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr "Pantalla completa automática"
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Entra a pantalla completa cuando se reemplaza la lista de reproducción, excepto en modo flotante"
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr "Preguntar al reanudar los medios recientes"
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr "Flotar todos los espacios de trabajo"
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr "Esta opción solo funciona en GNOME"
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr "Después de reproducción "
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr "Nada por hacer"
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr "Detener último fotograma"
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr "Cerrar la aplicación"
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr "Volumen"
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr "Valor inicial personalizado"
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr "Establece un volumen personalizado al inicio en lugar de restaurarlo"
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr "Porcentaje de volumen"
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr "Buscando"
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr "Modo"
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr "Precisión"
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr "Rápido"
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr "Unidad"
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr "Segundo"
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr "Minuto"
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr "Porcentaje"
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr "Valor"
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr "Audio"
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr "Compensación en milisegundos"
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr "Solo formatos de audio nativos"
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr "Subtítulos"
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr "Fuente por defecto"
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr "Red"
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr "Cliente"
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr "Bajada progresiva de búfer"
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr "Servidor"
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr "Controlar el reproductor remotamente"
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr "Puerto de escucha"
#: ui/preferences-window.ui:188
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr "Ejecutar la aplicación web en modo demonio"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Requiere GTK compilado con el backend de Broadway"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Puerto de la aplicación web"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Preferir la transmisión adaptativa "
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Calidad máxima"
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr "Retoques"
#: ui/preferences-window.ui:192
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr "Apariencia"
#: ui/preferences-window.ui:195
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr "Tema oscuro"
#: ui/preferences-window.ui:201
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr "Renderizar sombras de ventana"
#: ui/preferences-window.ui:202
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr "Deshabilitado aumenta el rendimiento cuando se abre en ventana"
#: ui/preferences-window.ui:213
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr "Rango de enchufes"
#: ui/preferences-window.ui:214
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr "Altera los rangos predeterminados de los enchufes de GStreamer"
#: ui/preferences-window.ui:219
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr "Usar Playbin3"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr "Require reiniciar el reproductor"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr "Experimental"
#: ui/preferences-window.ui:228
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr "Usar PipeWire"
@@ -424,15 +445,15 @@ msgstr "carlosgonz"
msgid "Ends at: %s"
msgstr "Termina en: %s"
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr "Indeterminado"
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr "Canales"
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr "Deshabilitar"

127
po/eu.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2022-03-25 16:45\n"
"Last-Translator: \n"
"Language-Team: Basque\n"
"Language: eu_ES\n"
@@ -41,11 +41,12 @@ msgstr "Clapperi buruz"
msgid "Speed"
msgstr "Abiadura"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr "Normala"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr "Orokorra"
@@ -117,7 +118,7 @@ msgstr "Errepikapen modua aldatu"
msgid "Export to file"
msgstr "Esportatu fitxategira"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr "Erreprodukzioa"
@@ -181,183 +182,203 @@ msgstr "Deskodetzaileak"
msgid "Return to the preferences"
msgstr "Itzuli ezarpenetara"
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr "Portaera"
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr "Pantaila osoa automatikoa"
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Pantaila osoan sartu erreprodukzio-zerrenda ordezten denean, flotatzeko modua izan ezik"
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr "Azkenaldiko media berriro ekiteko eskatzea"
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr "Laneko espazio guztietan flotatzea"
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr "Aukera honek GNOMEn bakarrik funtzionatzen du"
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr "Erreprodukzioaren ondoren"
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr "Ez egin ezer"
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr "Izoztu azken fotograma"
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr "Aplikazioa itxi"
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr "Bolumena"
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr "Hasierako balio pertsonalizatua"
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr "Hasieran bolumen pertsonalizatua ezartzea, lehengoratu beharrean"
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr "Bolumenaren ehunekoa"
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr "Bilaketa"
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr "Modua"
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr "Zehatza"
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr "Azkarra"
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr "Unitatea"
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr "Segundu"
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr "Minutu"
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr "Ehunekoa"
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr "Balioa"
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr "Audioa"
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr "Desplazamendua milisegundotan"
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr "Jatorrizko audio-formatuak bakarrik"
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr "Azpitituluak"
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr "Hizki lehenetsia"
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr "Sarea"
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr "Bezeroa"
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr "Deskargak pixkanaka bufferizatzea"
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr "Zerbitzaria"
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr "Urrutiko erreproduzitzailea kontrolatzea"
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr "Entzuteko ataka"
#: ui/preferences-window.ui:188
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr "Web-aplikazioa bigarren planoan exekutatzea"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "GTK Broadwayko backend-arekin konpilatzea eskatzen du"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Web aplikazioaren ataka"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Transmisio moldagarria lehenestea"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Gehieneko kalitatea"
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr "Ukituak"
#: ui/preferences-window.ui:192
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr "Itxura"
#: ui/preferences-window.ui:195
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr "Gai iluna"
#: ui/preferences-window.ui:201
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr "Leihoetako itzalak errenderizatzea"
#: ui/preferences-window.ui:202
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr "Desaktibatu leihoa erabiltzen denean errendimendua handitzeko"
#: ui/preferences-window.ui:213
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr "Pluginen sailkapena"
#: ui/preferences-window.ui:214
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr "Aldatu GStreamer-en pluginen lehenetsitako mailak"
#: ui/preferences-window.ui:219
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr "Playbin3 erabili"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr "Berrabiaraztea eskatzen du"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr "Esperimentala"
#: ui/preferences-window.ui:228
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr "Erabili PipeWire audio-irteerarako"
@@ -424,15 +445,15 @@ msgstr "Sergio Varela (@IngrownMink4)"
msgid "Ends at: %s"
msgstr "Amaiera: %s"
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr "Zehaztugabea"
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr "Kanalak"
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr "Desgaituta"

438
po/fa.po
View File

@@ -1,438 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-07-23 14:14\n"
"Last-Translator: \n"
"Language-Team: Persian\n"
"Language: fa_IR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: clapper\n"
"X-Crowdin-Project-ID: 473374\n"
"X-Crowdin-Language: fa\n"
"X-Crowdin-File: /master/po/com.github.rafostar.Clapper.pot\n"
"X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6
msgid "Open Files…"
msgstr "گشودن پرونده‌ها…"
#: ui/clapper.ui:10
msgid "Open URI…"
msgstr "گشودن نشانی…"
#: ui/clapper.ui:16 ui/preferences-window.ui:4
msgid "Preferences"
msgstr "ترجیحات"
#: ui/clapper.ui:20
msgid "Shortcuts"
msgstr "میان‌برها"
#: ui/clapper.ui:26
msgid "About Clapper"
msgstr "دربارهٔ کلَپِر"
#: ui/elapsed-time-button.ui:27
msgid "Speed"
msgstr "سرعت"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
msgid "Normal"
msgstr "معمولی"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General"
msgstr "عمومی"
#: ui/help-overlay.ui:13
msgid "Show shortcuts"
msgstr "نمایش میان‌برها"
#: ui/help-overlay.ui:19
msgid "Toggle fullscreen"
msgstr "تغییر حالت تمام‌صفحه"
#: ui/help-overlay.ui:20
msgid "Double tap | Double click"
msgstr "دو بار ضربه | دو بار کلیک"
#: ui/help-overlay.ui:26
msgid "Leave fullscreen"
msgstr "خروج از تمام‌صفحه"
#: ui/help-overlay.ui:32
msgid "Reveal OSD (fullscreen only)"
msgstr "نمایش OSD (فقط تمام‌صفحه)"
#: ui/help-overlay.ui:33
msgid "Tap"
msgstr "ضربه"
#: ui/help-overlay.ui:39
msgid "Quit"
msgstr "خروج"
#: ui/help-overlay.ui:47
msgid "Media"
msgstr "رسانه"
#: ui/help-overlay.ui:50
msgid "Open files"
msgstr "گشودن پرونده‌ها"
#: ui/help-overlay.ui:56 src/dialogs.js:137
msgid "Open URI"
msgstr "گشودن نشانی"
#: ui/help-overlay.ui:64
msgid "Playlist"
msgstr "سیاههٔ پخش"
#: ui/help-overlay.ui:67
msgid "Next item"
msgstr "مورد بعدی"
#: ui/help-overlay.ui:68
msgid "Double tap (right side)"
msgstr "ضربه دوتایی (سمت راست)"
#: ui/help-overlay.ui:74
msgid "Previous item"
msgstr "مورد قبل"
#: ui/help-overlay.ui:75
msgid "Double tap (left side)"
msgstr "ضربه دوتایی (سمت چپ)"
#: ui/help-overlay.ui:81
msgid "Change repeat mode"
msgstr "تغییر حالت تکرار"
#: ui/help-overlay.ui:87
msgid "Export to file"
msgstr "خروجی گرفتن در فایل"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback"
msgstr "بازپخش"
#: ui/help-overlay.ui:98
msgid "Toggle play"
msgstr "تغییر پخش"
#: ui/help-overlay.ui:99
msgid "Long press | Right click"
msgstr "فشار طولانی | کلیک راست"
#: ui/help-overlay.ui:105
msgid "Seek forward"
msgstr "پیمایش به جلو"
#: ui/help-overlay.ui:106
msgid "Swipe right | Scroll right"
msgstr "کشیدن به راست | اسکرول به راست"
#: ui/help-overlay.ui:112
msgid "Seek backward"
msgstr "پیمایش به عقب"
#: ui/help-overlay.ui:113
msgid "Swipe left | Scroll left"
msgstr "کشیدن به چپ | اسکرول به چپ"
#: ui/help-overlay.ui:119
msgid "Volume up"
msgstr "افزایش صدا"
#: ui/help-overlay.ui:120
msgid "Swipe up | Scroll up"
msgstr "کشیدن به بالا | اسکرول به بالا"
#: ui/help-overlay.ui:126
msgid "Volume down"
msgstr "کاهش صدا"
#: ui/help-overlay.ui:127
msgid "Swipe down | Scroll down"
msgstr "کشیدن به پایین | اسکرول به پایین"
#: ui/help-overlay.ui:133
msgid "Toggle mute"
msgstr "تغییر وضعیت بیصدا"
#: ui/help-overlay.ui:139
msgid "Next chapter"
msgstr "فصل بعدی"
#: ui/help-overlay.ui:145
msgid "Previous chapter"
msgstr "بخش قبلی"
#: ui/preferences-plugin-ranking-subpage.ui:11
msgid "Decoders"
msgstr "کد گشاها"
#: ui/preferences-plugin-ranking-subpage.ui:18
msgid "Return to the preferences"
msgstr "بازگشت به تنظیمات"
#: ui/preferences-window.ui:15
msgid "Behavior"
msgstr "رفتار"
#: ui/preferences-window.ui:18
msgid "Auto fullscreen"
msgstr "تمام صفحه خودکار"
#: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "ورود به تمام صفحه وقتی لیست پخش جایگزین شود به جز حالت شناور"
#: ui/preferences-window.ui:25
msgid "Ask to resume recent media"
msgstr "پرسش برای ادامه پخش مدیا"
#: ui/preferences-window.ui:31
msgid "Float on all workspaces"
msgstr "حالت شناور روی همه‌ی صفحات‌کاری"
#: ui/preferences-window.ui:32
msgid "This option only works on GNOME"
msgstr "این مورد تنها بر روی GNOME کار می‌کند"
#: ui/preferences-window.ui:38
msgid "After playback"
msgstr "پس از بازپخش"
#: ui/preferences-window.ui:43
msgid "Do nothing"
msgstr "کاری انجام نشود"
#: ui/preferences-window.ui:44
msgid "Freeze last frame"
msgstr "بی‌حرکت کردن ةخرین قاب"
#: ui/preferences-window.ui:45
msgid "Close the app"
msgstr "بستن برنامه"
#: ui/preferences-window.ui:55
msgid "Volume"
msgstr "درجه صدا"
#: ui/preferences-window.ui:58
msgid "Custom initial value"
msgstr "مقدار اولیه سفارشی"
#: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it"
msgstr "تنظیم صدای سفارشی در هنگام راه اندازی به جای بازیابی آن"
#: ui/preferences-window.ui:63
msgid "Volume percentage"
msgstr "درصد صدا"
#: ui/preferences-window.ui:74
msgid "Seeking"
msgstr "پوییدن"
#: ui/preferences-window.ui:77
msgid "Mode"
msgstr "حالت"
#: ui/preferences-window.ui:83
msgid "Accurate"
msgstr "دقت"
#: ui/preferences-window.ui:84
msgid "Fast"
msgstr "تند"
#: ui/preferences-window.ui:92
msgid "Unit"
msgstr "واحد"
#: ui/preferences-window.ui:97
msgid "Second"
msgstr "ثانیه"
#: ui/preferences-window.ui:98
msgid "Minute"
msgstr "دقیقه"
#: ui/preferences-window.ui:99
msgid "Percentage"
msgstr "درصد"
#: ui/preferences-window.ui:107
msgid "Value"
msgstr "مقدار"
#: ui/preferences-window.ui:122
msgid "Audio"
msgstr "صوتی"
#: ui/preferences-window.ui:125
msgid "Offset in milliseconds"
msgstr "جابجایی بر اساس میلی‌ثانیه"
#: ui/preferences-window.ui:132
msgid "Only native audio formats"
msgstr "فقط فرمت‌های صوتی بومی"
#: ui/preferences-window.ui:140
msgid "Subtitles"
msgstr "زیرنویس‌ها"
#: ui/preferences-window.ui:143
msgid "Default font"
msgstr "قلم پیش فرض"
#: ui/preferences-window.ui:153
msgid "Network"
msgstr "شبکه"
#: ui/preferences-window.ui:157
msgid "Client"
msgstr "مشتری"
#: ui/preferences-window.ui:160
msgid "Progressive download buffering"
msgstr "بافرینگ دانلود مترقی"
#: ui/preferences-window.ui:168
msgid "Server"
msgstr "سرور"
#: ui/preferences-window.ui:171
msgid "Control player remotely"
msgstr "کنترل پخش‌کننده از راه دور"
#: ui/preferences-window.ui:175
msgid "Listening port"
msgstr "شنود پورت"
#: ui/preferences-window.ui:188
msgid "Tweaks"
msgstr "دستكاري"
#: ui/preferences-window.ui:192
msgid "Appearance"
msgstr "ظاهر"
#: ui/preferences-window.ui:195
msgid "Dark theme"
msgstr "پوسته تیره"
#: ui/preferences-window.ui:201
msgid "Render window shadows"
msgstr "رندر سایه‌ پنجره‌ها"
#: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed"
msgstr "غیر فعال سازی برای افزایش کارایی در حالت پنجره ای"
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr "پیکربندی پلاگین"
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr "تغییر پیکربندی پیش فرض پلاگین های GStreamer"
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr "استفاده از playbin3"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr "نیازمند به بازشروع برنامه"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
msgstr "آزمایشی"
#: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output"
msgstr "استفاده از PipeWire برای خروجی صدا"
#: src/buttons.js:201
#, javascript-format
msgid "Decoder: %s"
msgstr "کدگشا: %s"
#: src/dialogs.js:152
msgid "Enter or drop URI here"
msgstr "رها کردن یا واردکردن URI"
#: src/dialogs.js:157
msgid "Cancel"
msgstr "لغو"
#: src/dialogs.js:158
msgid "Open"
msgstr "گشودن"
#: src/dialogs.js:226
msgid "Title"
msgstr "عنوان"
#: src/dialogs.js:227
msgid "Completed"
msgstr "کامل شده"
#: src/dialogs.js:235
msgid "Resume playback?"
msgstr "ادامه بازپخش?"
#: src/dialogs.js:289
#, javascript-format
msgid "GTK version: %s"
msgstr "نسخه GTK: %s"
#: src/dialogs.js:290
#, javascript-format
msgid "Adwaita version: %s"
msgstr "نسخه Adwita: %s"
#: src/dialogs.js:291
#, javascript-format
msgid "GStreamer version: %s"
msgstr "نسخه GStreamer: %s"
#: src/dialogs.js:292
#, javascript-format
msgid "GJS version: %s"
msgstr "نسخه GJS: %s"
#: src/dialogs.js:300
msgid "A GNOME media player powered by GStreamer"
msgstr "یک پخش‌کننده رسانه GNOME قدرت گرفته از GStreamer"
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305
msgid "translator-credits"
msgstr "سجاد موسوی نژاد <ssmns@outlook.com>"
#: src/revealers.js:170
#, javascript-format
msgid "Ends at: %s"
msgstr "پایان در: %s"
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined"
msgstr "نامشخص"
#: src/widget.js:242
msgid "Channels"
msgstr "کانال‌ها"
#: src/widget.js:260
msgid "Disabled"
msgstr "غیرفعال"

165
po/fi.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2021-09-14 15:25\n"
"Last-Translator: \n"
"Language-Team: Finnish\n"
"Language: fi_FI\n"
@@ -41,11 +41,12 @@ msgstr ""
msgid "Speed"
msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr ""
@@ -117,7 +118,7 @@ msgstr ""
msgid "Export to file"
msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr ""
@@ -181,183 +182,203 @@ msgstr ""
msgid "Return to the preferences"
msgstr ""
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr ""
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr ""
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr ""
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr ""
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr ""
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr ""
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr ""
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr ""
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr ""
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr ""
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr ""
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr ""
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr ""
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr ""
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr ""
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr ""
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr ""
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr ""
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr ""
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr ""
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr ""
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr ""
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr ""
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr ""
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr ""
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr ""
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr ""
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr ""
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr ""
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr ""
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr ""
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr ""
#: ui/preferences-window.ui:188
msgid "Tweaks"
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:192
msgid "Appearance"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:195
msgid "Dark theme"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:201
msgid "Render window shadows"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr ""
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr ""
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr ""
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr ""
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr ""
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr ""
@@ -424,15 +445,15 @@ msgstr ""
msgid "Ends at: %s"
msgstr ""
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr ""
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr ""
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr ""

127
po/fr.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2022-01-18 20:57\n"
"Last-Translator: \n"
"Language-Team: French\n"
"Language: fr_FR\n"
@@ -41,11 +41,12 @@ msgstr "Á propos de Clapper"
msgid "Speed"
msgstr "Vitesse"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr "Normal"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr "Général"
@@ -117,7 +118,7 @@ msgstr "Changer le mode de répétition"
msgid "Export to file"
msgstr "Exporter vers un fichier"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr "Lecture"
@@ -181,183 +182,203 @@ msgstr "Décodeurs"
msgid "Return to the preferences"
msgstr "Retourner aux préférences"
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr "Comportement"
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr "Lecture automatique en plein écran"
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Basculer en plein écran quand la playlisyt est remplacée sauf si le mode flottant est activé"
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr "Demander pour reprendre à la position des médias récents"
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr "Flotter sur tous les bureaux virtuels"
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr "Cette option ne marche qu'avec GNOME"
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr "Après la lecture"
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr "Ne rien faire"
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr "Geler la dernière image"
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr "Fermer l'application"
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr "Volume"
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr "Valeur initiale personnalisée"
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr "Régler une valeur personnalisée du volume au démarrage au lien de restorer la valeur précédente"
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr "Pourcentage du volume"
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr "Avancement"
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr "Comportement"
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr "Précis"
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr "Rapide"
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr "Unité des sauts"
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr "Seconde"
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr "Minute"
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr "Pourcentage"
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr "Longueur du saut"
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr "Audio"
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr "Décalage en millisecondes"
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr "Seulement des formats audios natifs"
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr "Sous-titres"
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr "Police par défaut"
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr "Réseau"
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr "Client"
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr "Téléchargement progressif dans le tampon"
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr "Serveur"
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr "Controler le lecteur à distance"
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr "Écouter sur le port"
#: ui/preferences-window.ui:188
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr "Lancer l'application web en arrière plan"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Requiert GTK compilé avec l'interface Broadway"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Port de l'application web"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Préférer le streaming adaptatif"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Qualité maximale"
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr "Réglages"
#: ui/preferences-window.ui:192
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr "Apparence"
#: ui/preferences-window.ui:195
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr "Thème sombre"
#: ui/preferences-window.ui:201
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr "Afficher les ombres de la fenêtre"
#: ui/preferences-window.ui:202
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr "Désactiver pour améliorer les performances quand fenêtré"
#: ui/preferences-window.ui:213
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr "Liste des plugins"
#: ui/preferences-window.ui:214
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr "Changer les options par défaut de plugins GStreamer"
#: ui/preferences-window.ui:219
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr "Utiliser playbin3"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr "Requiert le redémarrage du lecteur"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr "Expérimental"
#: ui/preferences-window.ui:228
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr "Utiliser PipeWire pour la sortie audio"
@@ -424,15 +445,15 @@ msgstr "Robin Verdenal-Tallieux"
msgid "Ends at: %s"
msgstr "Finit à: %s"
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr "Indéterminé"
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr "Chaines"
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr "Désactivé"

373
po/he.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-06-01 08:42\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2021-09-14 15:25\n"
"Last-Translator: \n"
"Language-Team: Hebrew\n"
"Language: he_IL\n"
@@ -19,420 +19,441 @@ msgstr ""
#: ui/clapper.ui:6
msgid "Open Files…"
msgstr "פתיחת קבצים…"
msgstr ""
#: ui/clapper.ui:10
msgid "Open URI…"
msgstr "פתיחת כתובת…"
msgstr ""
#: ui/clapper.ui:16 ui/preferences-window.ui:4
msgid "Preferences"
msgstr "העדפות"
msgstr ""
#: ui/clapper.ui:20
msgid "Shortcuts"
msgstr "צירופי מקשים"
msgstr ""
#: ui/clapper.ui:26
msgid "About Clapper"
msgstr "על אודות Clapper"
msgstr ""
#: ui/elapsed-time-button.ui:27
msgid "Speed"
msgstr "מהירות"
msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr "רגילה"
msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr "כללי"
msgstr ""
#: ui/help-overlay.ui:13
msgid "Show shortcuts"
msgstr "הצגת צירופי מקשים"
msgstr ""
#: ui/help-overlay.ui:19
msgid "Toggle fullscreen"
msgstr "שינוי מצב מסך מלא"
msgstr ""
#: ui/help-overlay.ui:20
msgid "Double tap | Double click"
msgstr "נגיעה כפולה | לחיצה כפולה"
msgstr ""
#: ui/help-overlay.ui:26
msgid "Leave fullscreen"
msgstr "יציאה ממסך מלא"
msgstr ""
#: ui/help-overlay.ui:32
msgid "Reveal OSD (fullscreen only)"
msgstr "הצגת מידע וכפתורים (מסך מלא בלבד)"
msgstr ""
#: ui/help-overlay.ui:33
msgid "Tap"
msgstr "נגיעה"
msgstr ""
#: ui/help-overlay.ui:39
msgid "Quit"
msgstr "יציאה"
msgstr ""
#: ui/help-overlay.ui:47
msgid "Media"
msgstr "מדיה"
msgstr ""
#: ui/help-overlay.ui:50
msgid "Open files"
msgstr "פתיחת קבצים"
msgstr ""
#: ui/help-overlay.ui:56 src/dialogs.js:137
msgid "Open URI"
msgstr "פתיחת כתובת"
msgstr ""
#: ui/help-overlay.ui:64
msgid "Playlist"
msgstr "רשימת השמעה"
msgstr ""
#: ui/help-overlay.ui:67
msgid "Next item"
msgstr "פריט הבא"
msgstr ""
#: ui/help-overlay.ui:68
msgid "Double tap (right side)"
msgstr "נגיעה כפולה (צד ימין)"
msgstr ""
#: ui/help-overlay.ui:74
msgid "Previous item"
msgstr "פריט קודם"
msgstr ""
#: ui/help-overlay.ui:75
msgid "Double tap (left side)"
msgstr "נגיעה כפולה (צד שמאל)"
msgstr ""
#: ui/help-overlay.ui:81
msgid "Change repeat mode"
msgstr "שינוי מצב חזרה"
msgstr ""
#: ui/help-overlay.ui:87
msgid "Export to file"
msgstr "ייצוא לקובץ"
msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr "השמעה"
msgstr ""
#: ui/help-overlay.ui:98
msgid "Toggle play"
msgstr "הפעלה/השהיה"
msgstr ""
#: ui/help-overlay.ui:99
msgid "Long press | Right click"
msgstr "לחיצה ארוכה | לחצן ימני"
msgstr ""
#: ui/help-overlay.ui:105
msgid "Seek forward"
msgstr "דילוג קדימה"
msgstr ""
#: ui/help-overlay.ui:106
msgid "Swipe right | Scroll right"
msgstr "החלקה ימינה | גלילה ימינה"
msgstr ""
#: ui/help-overlay.ui:112
msgid "Seek backward"
msgstr "דילוג לאחור"
msgstr ""
#: ui/help-overlay.ui:113
msgid "Swipe left | Scroll left"
msgstr "החלקה שמאלה | גלילה שמאלה"
msgstr ""
#: ui/help-overlay.ui:119
msgid "Volume up"
msgstr "הגברת עצמת השמע"
msgstr ""
#: ui/help-overlay.ui:120
msgid "Swipe up | Scroll up"
msgstr "החלקה למעלה | גלילה למעלה"
msgstr ""
#: ui/help-overlay.ui:126
msgid "Volume down"
msgstr "הנמכת עצמת השמע"
msgstr ""
#: ui/help-overlay.ui:127
msgid "Swipe down | Scroll down"
msgstr "החלקה למעלה | גלילה למעלה"
msgstr ""
#: ui/help-overlay.ui:133
msgid "Toggle mute"
msgstr "השתקה/ביטול השתקה"
msgstr ""
#: ui/help-overlay.ui:139
msgid "Next chapter"
msgstr "פרק הבא"
msgstr ""
#: ui/help-overlay.ui:145
msgid "Previous chapter"
msgstr "פרק קודם"
msgstr ""
#: ui/preferences-plugin-ranking-subpage.ui:11
msgid "Decoders"
msgstr "מפענחים"
msgstr ""
#: ui/preferences-plugin-ranking-subpage.ui:18
msgid "Return to the preferences"
msgstr "חזרה להגדרות"
msgstr ""
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr "התנהגות"
#: ui/preferences-window.ui:18
msgid "Auto fullscreen"
msgstr "מסך מלא אוטומטי"
msgstr ""
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr ""
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "כניסה למצב מסך מלא עם החלפת רשימת השמעה מלבד במצב ציפה"
msgstr ""
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr "לשאול אם להפעיל מחדש את המדיה האחרונה"
#: ui/preferences-window.ui:31
msgid "Float on all workspaces"
msgstr "ציפה בכל מרחבי העבודה"
msgstr ""
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr ""
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr "אפשרות זו פועלת רק ב־GNOME"
msgstr ""
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr "בסיום צפייה"
#: ui/preferences-window.ui:43
msgid "Do nothing"
msgstr "לא לעשות דבר"
msgstr ""
#: ui/preferences-window.ui:44
msgid "Freeze last frame"
msgstr "הקפאת התמונה האחרונה"
msgid "Do nothing"
msgstr ""
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr "סגירת היישום"
msgstr ""
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr "עצמת שמע"
#: ui/preferences-window.ui:58
msgid "Custom initial value"
msgstr "התאמת ערך התחלתי"
msgstr ""
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr ""
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr "הגדרת עצמת השמע עם ההפעלה במקום שחזור"
msgstr ""
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr "עצמת שמע באחוזים"
msgstr ""
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr "דילוג"
msgstr ""
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr "מצב"
#: ui/preferences-window.ui:83
msgid "Accurate"
msgstr "מדויק"
msgstr ""
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr "מהיר"
msgstr ""
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr "יחידה"
#: ui/preferences-window.ui:97
msgid "Second"
msgstr "שניה"
msgstr ""
#: ui/preferences-window.ui:98
msgid "Minute"
msgstr "דקה"
msgid "Second"
msgstr ""
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr ""
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr "אחוז"
msgstr ""
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr "ערך"
msgstr ""
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr "שמע"
msgstr ""
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr "היסט במילי־שניות"
msgstr ""
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr "תבניות שמע רגילות בלבד"
msgstr ""
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr "כתוביות"
msgstr ""
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr "גופן ברירת מחדל"
msgstr ""
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr "רשת"
msgstr ""
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr "לקוח"
msgstr ""
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr "שימוש בחוצץ הורדה"
msgstr ""
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr "שרת"
msgstr ""
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr "שליטה בנגן מרחוק"
msgstr ""
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr "פתחת האזנה"
msgstr ""
#: ui/preferences-window.ui:188
msgid "Tweaks"
msgstr "התאמות"
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:192
msgid "Appearance"
msgstr "מראה"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:195
msgid "Dark theme"
msgstr "מראה כהה"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:201
msgid "Render window shadows"
msgstr "עיבוד צל לחלון"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed"
msgstr "השבתה לצמצום צריכת החלונות"
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr "דרגות תוספים"
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr "שינוי דירוג ברירת המחדל של תוספי GStreamer"
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr "שימוש ב־playbin3"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr "דורש הפעלה מחדש של הנגן"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
msgstr "ניסיוני"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr ""
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr ""
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr ""
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr ""
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr ""
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr "שימוש ב־PipeWire לפלט השמע"
msgstr ""
#: src/buttons.js:201
#, javascript-format
msgid "Decoder: %s"
msgstr "מפענח: %s"
msgstr ""
#: src/dialogs.js:152
msgid "Enter or drop URI here"
msgstr "יש להזין או להשליך כתובת לכאן"
msgstr ""
#: src/dialogs.js:157
msgid "Cancel"
msgstr "ביטול"
msgstr ""
#: src/dialogs.js:158
msgid "Open"
msgstr "פתיחה"
msgstr ""
#: src/dialogs.js:226
msgid "Title"
msgstr "כותרת"
msgstr ""
#: src/dialogs.js:227
msgid "Completed"
msgstr "הושלם"
msgstr ""
#: src/dialogs.js:235
msgid "Resume playback?"
msgstr "להמשיך בצפייה?"
msgstr ""
#: src/dialogs.js:289
#, javascript-format
msgid "GTK version: %s"
msgstr "גרסת GTK: %s"
msgstr ""
#: src/dialogs.js:290
#, javascript-format
msgid "Adwaita version: %s"
msgstr "גרסת Adwaita: %s"
msgstr ""
#: src/dialogs.js:291
#, javascript-format
msgid "GStreamer version: %s"
msgstr "גרסת GStreamer: %s"
msgstr ""
#: src/dialogs.js:292
#, javascript-format
msgid "GJS version: %s"
msgstr "גרסת GJS: %s"
msgstr ""
#: src/dialogs.js:300
msgid "A GNOME media player powered by GStreamer"
msgstr "נגן מדיה עבור GNOME המופעל על ידי GStreamer"
msgstr ""
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305
msgid "translator-credits"
msgstr "יוסף אור בוצ׳קו <yoseforb@gnome.org>"
msgstr ""
#: src/revealers.js:170
#, javascript-format
msgid "Ends at: %s"
msgstr "שעת סיום: %s"
msgstr ""
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr "לא מוגדר"
msgstr ""
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr "ערוצים"
msgstr ""
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr "מושבת"
msgstr ""

127
po/hu.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2021-09-21 16:37\n"
"Last-Translator: \n"
"Language-Team: Hungarian\n"
"Language: hu_HU\n"
@@ -41,11 +41,12 @@ msgstr "A Clapper -ről"
msgid "Speed"
msgstr "Sebesség"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr "Normál"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr "Általános beállítások"
@@ -117,7 +118,7 @@ msgstr "Ismétlési típus változtatása"
msgid "Export to file"
msgstr "Exportálás fájlba"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr "Lejátszás"
@@ -181,183 +182,203 @@ msgstr "Dekóderek"
msgid "Return to the preferences"
msgstr "Visszatérés a beállításokhoz"
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr "Viselkedés"
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr "Automatikus teljes képernyős mód"
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Teljes képernyős módra váltás a lejátszólista megváltoztatásakor (kivétel ha lebegőablakos módban vagyunk)"
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr "Rákérdezés a legutóbbi média folytatására"
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr "Lebegő ablak az összes munkaasztalon"
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr "Ez az opció csak GNOME asztali környezettel működik"
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr "Lejátszás után"
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr "Ne csináljon semmit"
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr "Utolsó képkocka mutatása"
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr "Alkalmazás bezárása"
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr "Hangerő"
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr "Egyedi kezdeti érték"
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr "Induláskor egyedi hangerő az utolsó visszaállítása helyett"
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr "Hangerő százalék"
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr "Tekerés"
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr "Mód"
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr "Precíz"
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr "Gyors"
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr "Mértékegység"
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr "Másodperc"
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr "Perc"
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr "Százalék"
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr "Érték"
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr "Hang"
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr "Eltolás miliszekundumban"
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr "Csak natív hang formátumok"
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr "Feliratok"
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr "Alapértelmezett betűtípus"
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr "Hálózat"
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr "Kliens"
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr "Progresszív letöltéspufferelés"
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr "Szerver"
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr "Lejátszó távirányítása"
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr "Port figyelése"
#: ui/preferences-window.ui:188
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr "Web alkalmazás háttérben való futtatása"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Broadway backenddel fordított GTK -t igényel"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Web alkalmazás portja"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Adaptív streaming előnyben részesítése"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Maximális minőség"
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr "Finomhangolások"
#: ui/preferences-window.ui:192
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr "Megjelenés"
#: ui/preferences-window.ui:195
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr "Sötét téma"
#: ui/preferences-window.ui:201
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr "Ablak árnyékok renderelése"
#: ui/preferences-window.ui:202
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr "Kikapcsolása javítja a teljesítményt ablakban futtatás esetén"
#: ui/preferences-window.ui:213
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr "Bővítményrangsor"
#: ui/preferences-window.ui:214
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr "Az alapértelmezett GStreamer bővítményrangsor megváltoztatása"
#: ui/preferences-window.ui:219
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr "A playbin3 használata"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr "A lejátszó újraindítását igényli"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr "Kísérleti funkció"
#: ui/preferences-window.ui:228
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr "A PipeWire használata hang kimenetként"
@@ -424,15 +445,15 @@ msgstr "Ferenc Géczi"
msgid "Ends at: %s"
msgstr "%s-kor ér véget"
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr "Meghatározatlan"
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr "Csatornák"
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr "Kikapcsolva"

129
po/it.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-27 12:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2021-10-04 08:30\n"
"Last-Translator: \n"
"Language-Team: Italian\n"
"Language: it_IT\n"
@@ -41,11 +41,12 @@ msgstr "Informazioni su Clapper"
msgid "Speed"
msgstr "Velocità"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr "Normale"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr "Generale"
@@ -117,7 +118,7 @@ msgstr "Cambia modalità di ripetizione"
msgid "Export to file"
msgstr "Esporta su file"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr "Riproduzione"
@@ -181,183 +182,203 @@ msgstr "Decodificatori"
msgid "Return to the preferences"
msgstr "Ritorna alle preferenze"
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr "Comportamento"
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr "Schermo intero automatico"
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Attiva schermo intero quando la playlist viene sostituita, tranne in modalità fluttuante"
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr "Chiedi di riprendere i media recenti"
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr "Fluttuante su tutti i workspace"
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr "Questa opzione funziona solo su GNOME"
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr "Dopo la riproduzione"
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr "Non fare nulla"
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr "Mostra l'ultimo fotogramma"
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr "Chiudi l'app"
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr "Volume"
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr "Valore iniziale personalizato"
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr "Imposta un volume all'avvio personalizzato invece di ripristinarlo"
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr "Percentuale volume"
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr "Scorrimento"
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr "Modalità"
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr "Accurata"
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr "Veloce"
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr "Unità"
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr "Secondo"
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr "Minuto"
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr "Percentuale"
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr "Valore"
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr "Audio"
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr "Ritardo/Anticipo in millisecondi"
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr "Solo formati audio nativi"
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr "Sottotitoli"
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr "Carattere predefinito"
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr "Rete"
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr "Client"
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr "Download buffering progressivo"
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr "Server"
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr "Controlla la riproduzione da remoto"
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr "Porta in ascolto"
#: ui/preferences-window.ui:188
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr "Lancia l'applicazione web in sottofondo"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Richiede GTK compilato con il supporto a Broadway"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Porta per l'applicazione web"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Preferisci stream adattivo"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Qualità massima"
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr "Aggiustamenti"
#: ui/preferences-window.ui:192
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr "Aspetto"
#: ui/preferences-window.ui:195
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr "Tema scuro"
#: ui/preferences-window.ui:201
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr "Ombreggiatura della finestra"
#: ui/preferences-window.ui:202
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr "Disabilita per aumentare le prestazioni in modalità finestra"
#: ui/preferences-window.ui:213
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr "Ordine dei plugin"
#: ui/preferences-window.ui:214
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr "Altera l'ordine predefinito dei plugin di GStreamer"
#: ui/preferences-window.ui:219
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr "Usa playbin3"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr "Richiede il riavvio del player"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr "Sperimentale"
#: ui/preferences-window.ui:228
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr "Usa PipeWire per l'uscita audio"
@@ -417,22 +438,22 @@ msgstr "Un riproduttore multimediale per GNOME basato su GStreamer"
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305
msgid "translator-credits"
msgstr "Uniformbuffer"
msgstr ""
#: src/revealers.js:170
#, javascript-format
msgid "Ends at: %s"
msgstr "Termina alle: %s"
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr "Indeterminato"
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr "Canali"
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr "Disabilitato"

127
po/ja.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2022-04-01 09:06\n"
"Last-Translator: \n"
"Language-Team: Japanese\n"
"Language: ja_JP\n"
@@ -41,11 +41,12 @@ msgstr "Clapperについて"
msgid "Speed"
msgstr "速度"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr "標準"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr "一般"
@@ -117,7 +118,7 @@ msgstr "リピートモードを変更"
msgid "Export to file"
msgstr "ファイルへエクスポート"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr "プレイバック"
@@ -181,183 +182,203 @@ msgstr "デコーダー"
msgid "Return to the preferences"
msgstr "設定へ戻る"
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr "挙動"
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr "自動的にフルスクリーンに切り替える"
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "フローティングモードを除き、プレイリストを入れ替えた場合に自動的にフルスクリーンにする"
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr "前回再生したメディアを続きから再生するか尋ねる"
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr "すべてのワークスペースにフロートを配置する"
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr "このオプションはGnomeでのみ機能します"
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr "再生終了後"
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr "何もしない"
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr "最後のフレームで停止する"
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr "アプリを閉じる"
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr "音量"
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr "初期音量を設定する"
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr "前回使用した音量を使用するのではなく、起動時に音量をカスタム値に設定します"
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr "音量(%)"
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr "シーキング"
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr "モード"
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr "精密"
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr "高速"
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr "ユニット"
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr "秒"
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr "分"
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr "パーセント"
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr "値"
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr "オ−ディオ"
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr "オフセット(ミリ秒)"
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr "ネイティブオーディオフォーマットのみを使用する"
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr "字幕"
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr "既定のフォント"
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr "ネットワーク"
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr "クライアント"
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr "プログレッシブなバッファリングを使用する"
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr "サーバー"
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr "プレーヤーをリモートでコントロールする"
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr "待ち受けポート"
#: ui/preferences-window.ui:188
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr "Webアプリケーションをバックグラウンドで実行する"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Broadwayバックエンドでコンパイルされた GTK が必要です"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Webアプリケーションのポート"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "アダプティブストリーミングを優先する"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Max quality"
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr "詳細設定"
#: ui/preferences-window.ui:192
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr "外観"
#: ui/preferences-window.ui:195
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr "ダークテーマ"
#: ui/preferences-window.ui:201
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr "ウィンドウの影をレンダリングする"
#: ui/preferences-window.ui:202
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr "無効化するとウィンドウモードでのパフォーマンスが向上します"
#: ui/preferences-window.ui:213
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr "プライグインの優先順位"
#: ui/preferences-window.ui:214
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr "GStreamerプラグインの優先順位を変更します"
#: ui/preferences-window.ui:219
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr "playbin3を使用"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr "プレイヤーの再起動が必要です"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr "試験運用機能"
#: ui/preferences-window.ui:228
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr "オーディオ出力にPipeWireを使用する"
@@ -424,15 +445,15 @@ msgstr "翻訳者"
msgid "Ends at: %s"
msgstr "再生終了時刻: %s"
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr "不明"
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr "チャンネル"
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr "Disabled"

165
po/ko.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2021-09-14 15:24\n"
"Last-Translator: \n"
"Language-Team: Korean\n"
"Language: ko_KR\n"
@@ -41,11 +41,12 @@ msgstr ""
msgid "Speed"
msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr ""
@@ -117,7 +118,7 @@ msgstr ""
msgid "Export to file"
msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr ""
@@ -181,183 +182,203 @@ msgstr ""
msgid "Return to the preferences"
msgstr ""
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr ""
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr ""
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr ""
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr ""
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr ""
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr ""
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr ""
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr ""
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr ""
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr ""
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr ""
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr ""
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr ""
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr ""
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr ""
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr ""
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr ""
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr ""
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr ""
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr ""
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr ""
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr ""
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr ""
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr ""
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr ""
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr ""
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr ""
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr ""
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr ""
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr ""
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr ""
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr ""
#: ui/preferences-window.ui:188
msgid "Tweaks"
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:192
msgid "Appearance"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:195
msgid "Dark theme"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:201
msgid "Render window shadows"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr ""
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr ""
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr ""
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr ""
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr ""
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr ""
@@ -424,15 +445,15 @@ msgstr ""
msgid "Ends at: %s"
msgstr ""
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr ""
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr ""
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr ""

127
po/nl.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2022-04-08 16:14\n"
"Last-Translator: \n"
"Language-Team: Dutch\n"
"Language: nl_NL\n"
@@ -41,11 +41,12 @@ msgstr "Over Clapper"
msgid "Speed"
msgstr "Snelheid"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr "Normaal"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr "Algemeen"
@@ -117,7 +118,7 @@ msgstr "Herhaalmodus wijzigen"
msgid "Export to file"
msgstr "Exporteren naar bestand"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr "Afspelen"
@@ -181,183 +182,203 @@ msgstr "Decodering"
msgid "Return to the preferences"
msgstr "Terug naar voorkeuren"
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr "Gedrag"
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr "Beeldvullende modus automatisch inschakelen"
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Schakel de beeldvullende modus automatisch in als de afspeellijst wordt vervangen (behalve in de zwevende modus)"
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr "Vragen om onlangs afgespeelde media te hervatten"
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr "Zweven op alle werkbladen"
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr "Deze optie werkt alleen op GNOME"
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr "Actie na het afspelen:"
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr "Niets doen"
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr "Laatste frame bevriezen"
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr "Toepassing afsluiten"
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr "Volume"
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr "Aangepaste initiële waarde"
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr "Stel een aangepast volumeniveau in bij het opstarten in plaats van het vorige te herstellen"
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr "Volumeniveau"
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr "Spoelen"
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr "Modus"
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr "Nauwkeurig"
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr "Snel"
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr "Eenheid"
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr "Seconde"
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr "Minuut"
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr "Percentage"
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr "Waarde"
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr "Audio"
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr "Verschuiving (in milliseconden)"
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr "Alleen ingebouwde audioformaten"
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr "Ondertiteling"
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr "Standaardlettertype"
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr "Netwerk"
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr "Client"
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr "Progressieve downloadbuffering"
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr "Server"
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr "Speler op afstand bedienen"
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr "Luisteren op poort:"
#: ui/preferences-window.ui:188
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr "Webtoepassing op achtergrond uitvoeren"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Vereist GTK met het Broadway-backend"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Webtoepassingspoort"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Adaptief streamen"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Maximumkwaliteit"
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr "Aanpassingen"
#: ui/preferences-window.ui:192
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr "Vormgeving"
#: ui/preferences-window.ui:195
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr "Donker thema"
#: ui/preferences-window.ui:201
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr "Vensterschaduwen tonen"
#: ui/preferences-window.ui:202
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr "Schakel uit om de prestaties te verbeteren in de zwevende modus"
#: ui/preferences-window.ui:213
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr "Plug-involgorde"
#: ui/preferences-window.ui:214
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr "Pas de standaardvolgorde van GStreamer-plug-ins aan"
#: ui/preferences-window.ui:219
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr "playbin3 gebruiken"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr "Herstart de speler om de wijziging toe te passen"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr "Experimenteel"
#: ui/preferences-window.ui:228
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr "PipeWire gebruiken voor audio-uitvoer"
@@ -424,15 +445,15 @@ msgstr "Heimen Stoffels <vistausss@fastmail.com>"
msgid "Ends at: %s"
msgstr "Eindigt op: %s"
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr "onbekend"
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr "Kanalen"
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr "Uitgeschakeld"

165
po/no.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2021-09-14 15:25\n"
"Last-Translator: \n"
"Language-Team: Norwegian\n"
"Language: no_NO\n"
@@ -41,11 +41,12 @@ msgstr ""
msgid "Speed"
msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr ""
@@ -117,7 +118,7 @@ msgstr ""
msgid "Export to file"
msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr ""
@@ -181,183 +182,203 @@ msgstr ""
msgid "Return to the preferences"
msgstr ""
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr ""
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr ""
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr ""
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr ""
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr ""
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr ""
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr ""
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr ""
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr ""
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr ""
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr ""
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr ""
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr ""
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr ""
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr ""
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr ""
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr ""
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr ""
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr ""
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr ""
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr ""
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr ""
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr ""
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr ""
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr ""
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr ""
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr ""
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr ""
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr ""
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr ""
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr ""
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr ""
#: ui/preferences-window.ui:188
msgid "Tweaks"
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:192
msgid "Appearance"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:195
msgid "Dark theme"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:201
msgid "Render window shadows"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr ""
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr ""
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr ""
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr ""
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr ""
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr ""
@@ -424,15 +445,15 @@ msgstr ""
msgid "Ends at: %s"
msgstr ""
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr ""
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr ""
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr ""

127
po/pl.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2021-09-15 08:41\n"
"Last-Translator: \n"
"Language-Team: Polish\n"
"Language: pl_PL\n"
@@ -41,11 +41,12 @@ msgstr "O programie"
msgid "Speed"
msgstr "Prędkość"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr "Normalny"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr "Główne"
@@ -117,7 +118,7 @@ msgstr "Zmień tryb powtarzania"
msgid "Export to file"
msgstr "Eksportuj do pliku"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr "Odtwarzanie"
@@ -181,183 +182,203 @@ msgstr "Dekodery"
msgid "Return to the preferences"
msgstr "Wróć do preferencji"
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr "Zachowanie"
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr "Automatyczny tryb pełnoekranowy"
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Wejdź do trybu pełnoekranowego, gdy lista odtwarzania zostanie zastąpiona z wyjątkiem trybu pływającego"
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr "Pytaj o wznowienie ostatnich mediów"
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr "Pływaj na wszystkich obszarach roboczych"
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr "Ta opcja działa tylko na GNOME"
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr "Po odtwarzaniu"
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr "Nic nie rób"
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr "Zamroź ostatnią klatkę"
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr "Zamknij aplikację"
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr "Głośność"
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr "Wartość początkowa"
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr "Ustaw własną głośność początkową zamiast ją przywracać"
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr "Procent głośności"
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr "Przewijanie"
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr "Tryb"
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr "Dokładny"
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr "Szybki"
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr "Jednostka"
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr "Sekunda"
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr "Minuta"
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr "Procent"
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr "Wartość"
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr "Audio"
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr "Przesunięcie w milisekundach"
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr "Tylko natywne formaty audio"
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr "Napisy"
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr "Domyślna czcionka"
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr "Sieć"
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr "Klient"
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr "Buforuj pobierając progresywnie"
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr "Serwer"
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr "Zdalne sterowanie odtwarzaczem"
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr "Port połączeń przychodzących"
#: ui/preferences-window.ui:188
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr "Uruchom aplikację webową w tle"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Wymaga GTK skompilowanego z backendem Broadway"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Port aplikacji webowej"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Preferuj adaptacyjne streamowanie"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Maksymalna jakość"
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr "Dostrajanie"
#: ui/preferences-window.ui:192
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr "Wygląd"
#: ui/preferences-window.ui:195
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr "Ciemny motyw"
#: ui/preferences-window.ui:201
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr "Renderuj cienie okna"
#: ui/preferences-window.ui:202
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr "Wyłącz, aby zwiększyć wydajność w trybie okienkowym"
#: ui/preferences-window.ui:213
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr "Ranking pluginów"
#: ui/preferences-window.ui:214
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr "Zmień domyślne rangi pluginów GStreamera"
#: ui/preferences-window.ui:219
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr "Użyj playbin3"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr "Wymaga restartu odtwarzacza"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr "Eksperyment"
#: ui/preferences-window.ui:228
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr "Użyj PipeWire do wyprowadzenia dźwięku"
@@ -424,15 +445,15 @@ msgstr "Rafał Dzięgiel <rafostar.github@gmail.com>"
msgid "Ends at: %s"
msgstr "Koniec o: %s"
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr "Nieokreślony"
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr "Kanały"
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr "Wyłączony"

127
po/pt.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2022-05-01 18:43\n"
"Last-Translator: \n"
"Language-Team: Portuguese\n"
"Language: pt_PT\n"
@@ -41,11 +41,12 @@ msgstr "Sobre o Clapper"
msgid "Speed"
msgstr "Velocidade"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr "Predefinido"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr "Geral"
@@ -117,7 +118,7 @@ msgstr "Alterar modo de repetição"
msgid "Export to file"
msgstr "Exportar para ficheiro"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr "Reproduzir"
@@ -181,183 +182,203 @@ msgstr "Descodificadores"
msgid "Return to the preferences"
msgstr "Voltar para as preferências"
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr "Comportamento"
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr "Ecrã inteiro automático"
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Entrar em ecrã inteiro quando a lista de reprodução é substituída, excepto no modo flutuante"
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr "Pedir para retomar o ficheiro recente"
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr "Flutuar em todas as áreas de trabalho"
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr "Esta opção apenas funciona no GNOME"
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr "Após reprodução"
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr "Não fazer nada"
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr "Suster o fotograma"
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr "Fechar a aplicação"
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr "Volume"
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr "Valor inicial personalizado"
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr "Definir volume personalizado no arranque ao invés de restaurá-lo"
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr "Percentagem de volume"
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr "Procurando"
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr "Modo"
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr "Preciso"
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr "Rápido"
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr "Unidade"
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr "Segundo"
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr "Minuto"
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr "Percentagem"
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr "Valor"
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr "Áudio"
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr "Deslocamento em milissegundos"
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr "Apenas formatos de áudio nativos"
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr "Legendas"
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr "Tipo de letra predefinida"
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr "Rede"
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr "Cliente"
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr "Buffering de transferência progressiva"
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr "Servidor"
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr "Controlar reprodutor remotamente"
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr "Porta de escuta"
#: ui/preferences-window.ui:188
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr "Executar aplicação web em segundo plano"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Requer GTK compilado com backend Broadway"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Porta de aplicação Web"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Preferir transmissão adaptável"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Qualidade máxima"
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr "Ajustes"
#: ui/preferences-window.ui:192
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr "Aparência"
#: ui/preferences-window.ui:195
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr "Tema escuro"
#: ui/preferences-window.ui:201
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr "Renderizar sombras das janelas"
#: ui/preferences-window.ui:202
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr "Desativar para aumentar o desempenho quando em janela"
#: ui/preferences-window.ui:213
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr "Classificação do plugin"
#: ui/preferences-window.ui:214
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr "Altera as classificações predefinidas dos plugins GStreamer"
#: ui/preferences-window.ui:219
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr "Usar playbin3"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr "Requer o reinício do reprodutor"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr "Experimental"
#: ui/preferences-window.ui:228
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr "Usar o PipeWire para a saída áudio"
@@ -424,15 +445,15 @@ msgstr "Hugo Carvalho <hugokarvalho@hotmail.com>"
msgid "Ends at: %s"
msgstr "Termina às: %s"
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr "Indeterminado"
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr "Canais"
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr "Desativado"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2021-10-11 10:33\n"
"Last-Translator: \n"
"Language-Team: Portuguese, Brazilian\n"
"Language: pt_BR\n"
@@ -41,11 +41,12 @@ msgstr "Sobre o Clapper"
msgid "Speed"
msgstr "Velocidade"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr "Normal"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr "Geral"
@@ -117,7 +118,7 @@ msgstr "Alternar modo de repetição"
msgid "Export to file"
msgstr "Exportar arquivo"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr "Reprodução"
@@ -181,183 +182,203 @@ msgstr "Decodificadores"
msgid "Return to the preferences"
msgstr "Voltar para as preferências"
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr "Comportamento"
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr "Tela cheia automaticamente"
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Insira em tela cheia quando a lista de reprodução for substituída, exceto o modo flutuante"
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr "Pedir para retomar o video recente"
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr "Flutuar em todas as áreas de trabalho"
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr "Esta opção só funciona no GNOME"
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr "Pós reprodução"
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr "Não fazer nada"
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr "Congelar o último quadro"
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr "Fechar aplicativo"
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr "Volume"
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr "Valor inicial personalizado"
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr "Definir volume personalizado na inicialização ao invés de restaurá-lo"
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr "Percentual do volume"
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr "Buscando"
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr "Modo"
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr "Preciso"
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr "Rápido"
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr "Unidade"
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr "Segundo"
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr "Minuto"
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr "Porcentagem"
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr "Valor"
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr "Audio"
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr "tempo de desvanecimento em milissegundos"
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr "Apenas formatos de áudio nativos"
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr "Legendas"
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr "Fonte padrão"
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr "Rede"
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr "Cliente"
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr "buffering progressivo de download"
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr "Servidor"
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr "Controle o video remotamente "
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr "Porta de escuta"
#: ui/preferences-window.ui:188
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr "Executar web app em segundo plano"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Requer GTK compilado com backend de Broadway"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Porta do aplicativo Web"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Preferir streaming adaptável"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Qualidade Máxima"
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr "Ajustes"
#: ui/preferences-window.ui:192
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr "Aparência"
#: ui/preferences-window.ui:195
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr "Tema Escuro"
#: ui/preferences-window.ui:201
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr "Renderizar sombras das janelas"
#: ui/preferences-window.ui:202
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr "Desabilite para aumentar o desempenho em placas gráficas mais fracas."
#: ui/preferences-window.ui:213
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr "Classificação do plugin"
#: ui/preferences-window.ui:214
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr "Altera os ranks padrão dos plugins do GStreamer"
#: ui/preferences-window.ui:219
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr "Usar playbin3"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr "Requer reinicialização do Clapper"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr "Experimental"
#: ui/preferences-window.ui:228
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr "Usar PipeWire para saída de áudio"
@@ -424,15 +445,15 @@ msgstr "KevenDoriaLinuxBR"
msgid "Ends at: %s"
msgstr "termina em %s"
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr "Indeterminado"
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr "Canais"
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr "Desabilitado"

165
po/ro.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2021-09-14 15:24\n"
"Last-Translator: \n"
"Language-Team: Romanian\n"
"Language: ro_RO\n"
@@ -41,11 +41,12 @@ msgstr ""
msgid "Speed"
msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr ""
@@ -117,7 +118,7 @@ msgstr ""
msgid "Export to file"
msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr ""
@@ -181,183 +182,203 @@ msgstr ""
msgid "Return to the preferences"
msgstr ""
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr ""
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr ""
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr ""
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr ""
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr ""
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr ""
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr ""
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr ""
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr ""
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr ""
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr ""
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr ""
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr ""
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr ""
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr ""
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr ""
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr ""
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr ""
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr ""
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr ""
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr ""
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr ""
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr ""
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr ""
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr ""
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr ""
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr ""
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr ""
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr ""
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr ""
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr ""
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr ""
#: ui/preferences-window.ui:188
msgid "Tweaks"
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:192
msgid "Appearance"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:195
msgid "Dark theme"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:201
msgid "Render window shadows"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr ""
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr ""
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr ""
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr ""
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr ""
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr ""
@@ -424,15 +445,15 @@ msgstr ""
msgid "Ends at: %s"
msgstr ""
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr ""
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr ""
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr ""

127
po/ru.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2022-01-16 14:15\n"
"Last-Translator: \n"
"Language-Team: Russian\n"
"Language: ru_RU\n"
@@ -41,11 +41,12 @@ msgstr "О приложении"
msgid "Speed"
msgstr "Скорость"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr "Обычная"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr "Общие"
@@ -117,7 +118,7 @@ msgstr "Изменить режим повторения"
msgid "Export to file"
msgstr "Экспорт в файл"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr "Воспроизведение"
@@ -181,183 +182,203 @@ msgstr "Декодеры"
msgid "Return to the preferences"
msgstr "Вернуться к настройкам"
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr "Поведение"
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr "Автоматический полноэкранный режим"
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Переход в полноэкранный режим при замене списка воспроизведения, кроме плавающего режима"
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr "Спрашивать о возобновление недавние медиа"
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr "Показывать «плавающий режим» на всех рабочих столах"
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr "Эта опция работает только в GNOME"
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr "После воспроизведения"
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr "Ничего не делать"
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr "Заморозить последний кадр"
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr "Закрыть приложение"
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr "Громкость"
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr "Пользовательское начальное значение"
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr "Установите настраиваемую громкость при запуске вместо ее восстановления"
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr "Процент громкости"
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr "Перемотка"
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr "Режим"
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr "Точный"
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr "Быстрый"
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr "Ед. изм"
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr "Секунды"
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr "Минуты"
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr "Проценты"
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr "Значение"
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr "Аудио"
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr "Смещение в миллисекундах"
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr "Только нативные аудиоформаты"
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr "Субтитры"
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr "Шрифт по умолчанию"
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr "Сеть"
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr "Клиент"
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr "Прогрессивная буферизация загрузки"
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr "Сервер"
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr "Удаленное управление плеером"
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr "Порт прослушивания"
#: ui/preferences-window.ui:188
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr "Запустить веб-приложение в фоновом режиме"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Требуется GTK, скомпилированный с бэкэндом Broadway"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Порт веб-приложения"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Предпочитайте адаптивную потоковую передачу"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Максимальное качество"
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr "Твики"
#: ui/preferences-window.ui:192
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr "Внешний вид"
#: ui/preferences-window.ui:195
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr "Тёмная тема"
#: ui/preferences-window.ui:201
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr "Рендеринг оконных теней"
#: ui/preferences-window.ui:202
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr "Отключить, чтобы повысить производительность в оконном режиме"
#: ui/preferences-window.ui:213
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr "Рейтинг плагинов"
#: ui/preferences-window.ui:214
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr "Изменить ранги плагинов GStreamer по умолчанию"
#: ui/preferences-window.ui:219
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr "Использовать playbin3"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr "Требуется перезапуск плеера"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr "Экспериментально"
#: ui/preferences-window.ui:228
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr "Использовать PipeWire для вывода звука"
@@ -424,15 +445,15 @@ msgstr "Игорь Дятлов"
msgid "Ends at: %s"
msgstr "Окончание: %s"
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr "Неопределенный"
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr "Каналы"
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr "Отключено"

165
po/sr.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2021-09-14 15:25\n"
"Last-Translator: \n"
"Language-Team: Serbian (Cyrillic)\n"
"Language: sr_SP\n"
@@ -41,11 +41,12 @@ msgstr ""
msgid "Speed"
msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr ""
@@ -117,7 +118,7 @@ msgstr ""
msgid "Export to file"
msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr ""
@@ -181,183 +182,203 @@ msgstr ""
msgid "Return to the preferences"
msgstr ""
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr ""
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr ""
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr ""
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr ""
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr ""
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr ""
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr ""
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr ""
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr ""
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr ""
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr ""
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr ""
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr ""
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr ""
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr ""
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr ""
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr ""
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr ""
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr ""
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr ""
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr ""
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr ""
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr ""
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr ""
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr ""
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr ""
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr ""
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr ""
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr ""
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr ""
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr ""
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr ""
#: ui/preferences-window.ui:188
msgid "Tweaks"
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:192
msgid "Appearance"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:195
msgid "Dark theme"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:201
msgid "Render window shadows"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr ""
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr ""
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr ""
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr ""
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr ""
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr ""
@@ -424,15 +445,15 @@ msgstr ""
msgid "Ends at: %s"
msgstr ""
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr ""
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr ""
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr ""

127
po/sv.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2022-01-16 14:15\n"
"Last-Translator: \n"
"Language-Team: Swedish\n"
"Language: sv_SE\n"
@@ -41,11 +41,12 @@ msgstr "Om Clapper"
msgid "Speed"
msgstr "Hastighet"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr "Normal"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr "Allmänt"
@@ -117,7 +118,7 @@ msgstr "Ändra upprepningsläge"
msgid "Export to file"
msgstr "Exportera till fil"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr "Uppspelning"
@@ -181,183 +182,203 @@ msgstr "Avkodare"
msgid "Return to the preferences"
msgstr "Återgå till inställningarna"
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr "Beteende"
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr "Automatiskt helskärmsläge"
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Växla till fullskärmsläge när en spellista ersätts, förutom i flytande läge"
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr "Be att återuppta senaste media"
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr "Flyt på alla arbetsytor"
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr "Det här alternativet fungerar endast i GNOME"
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr "Efter uppspelning"
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr "Gör ingenting"
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr "Frys sista bildruta"
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr "Stäng appen"
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr "Volym"
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr "Anpassat startvärde"
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr "Ställ in anpassad volym vid start istället för att återställa den"
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr "Volymprocent"
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr "Spolning"
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr "Läge"
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr "Riktig"
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr "Snabbt"
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr "Enhet"
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr "Sekund"
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr "Minut"
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr "Procent"
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr "Värde"
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr "Ljud"
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr "Förskjutning i millisekunder"
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr "Endast inbyggda ljudformat"
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr "Undertexter"
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr "Standardteckensnitt"
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr "Nätverk"
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr "Klient"
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr "Progressiv nedladdningsbuffert"
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr "Server"
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr "Fjärrstyra spelaren"
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr "Lyssningsport"
#: ui/preferences-window.ui:188
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr "Kör webbprogram i bakgrunden"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Kräver GTK kompilerad med Broadway backend"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Port för webbprogram"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Föredra adaptiv streaming"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Max kvalitet"
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr "Tweaks"
#: ui/preferences-window.ui:192
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr "Utseende"
#: ui/preferences-window.ui:195
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr "Mörkt Tema"
#: ui/preferences-window.ui:201
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr "Rendera fönsterskuggor"
#: ui/preferences-window.ui:202
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr "Inaktivera för att öka prestanda när fönsterläge är på"
#: ui/preferences-window.ui:213
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr "Rangordning av plugin"
#: ui/preferences-window.ui:214
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr "Ändra standardrankningar för GStreamer-plugins"
#: ui/preferences-window.ui:219
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr "Använd playbin3"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr "Kräver omstart av spelaren"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr "Exprimentalt"
#: ui/preferences-window.ui:228
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr "Använd PipeWire för Ljudutgång"
@@ -424,15 +445,15 @@ msgstr "SA ST (sastofficial)"
msgid "Ends at: %s"
msgstr "Slutar vid: %s"
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr "Obestämd"
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr "Kanaler"
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr "Avstängd"

299
po/tr.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-06-25 12:42\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2022-04-02 01:43\n"
"Last-Translator: \n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
@@ -19,7 +19,7 @@ msgstr ""
#: ui/clapper.ui:6
msgid "Open Files…"
msgstr "Dosyaları Aç…"
msgstr "Dosya Aç…"
#: ui/clapper.ui:10
msgid "Open URI…"
@@ -41,11 +41,12 @@ msgstr "Clapper Hakkında"
msgid "Speed"
msgstr "Hız"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr "Normal"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr "Genel"
@@ -55,7 +56,7 @@ msgstr "Kısayolları göster"
#: ui/help-overlay.ui:19
msgid "Toggle fullscreen"
msgstr "Tam ekranı aç/kapat"
msgstr "Tam ekran"
#: ui/help-overlay.ui:20
msgid "Double tap | Double click"
@@ -83,7 +84,7 @@ msgstr "Ortam"
#: ui/help-overlay.ui:50
msgid "Open files"
msgstr "Dosyaları aç"
msgstr "Dosyaları Aç"
#: ui/help-overlay.ui:56 src/dialogs.js:137
msgid "Open URI"
@@ -111,19 +112,19 @@ msgstr "Çift tıkla (sol tarafa)"
#: ui/help-overlay.ui:81
msgid "Change repeat mode"
msgstr "Yineleme kipini değiştir"
msgstr "Tekrarlı oynatma modunu değiştir"
#: ui/help-overlay.ui:87
msgid "Export to file"
msgstr "Dosyaya dışa aktar"
msgstr "Dosyaya aktar"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr "Oynatma"
#: ui/help-overlay.ui:98
msgid "Toggle play"
msgstr "Oynatmayı başlat/durdur"
msgstr "Oynatmayı başlat"
#: ui/help-overlay.ui:99
msgid "Long press | Right click"
@@ -163,7 +164,7 @@ msgstr "Aşağı sürükle | Aşağı kaydır"
#: ui/help-overlay.ui:133
msgid "Toggle mute"
msgstr "Sesi kapat/aç"
msgstr "Sesi kapat"
#: ui/help-overlay.ui:139
msgid "Next chapter"
@@ -181,258 +182,278 @@ msgstr "Çözücüler"
msgid "Return to the preferences"
msgstr "Tercihlere geri dön"
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr "Davranış"
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr "Otomatik tam ekran"
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Yüzen kip dışında oynatma listesi değiştirildiğinde tam ekrana geç"
msgstr ""
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr "Son ortamı devam ettirmeyi sor"
#: ui/preferences-window.ui:31
msgid "Float on all workspaces"
msgstr "Tüm çalışma alanlarının üstünde yüz"
msgstr ""
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr ""
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr "Bu seçenek sadece GNOME'da çalışır"
msgstr ""
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr "Oynatma sonrası"
#: ui/preferences-window.ui:43
msgid "Do nothing"
msgstr "Hiçbir şey yapma"
msgstr ""
#: ui/preferences-window.ui:44
msgid "Freeze last frame"
msgstr "Son kareyi dondur"
msgid "Do nothing"
msgstr ""
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr "Uygulamayı kapat"
msgstr ""
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr "Ses"
#: ui/preferences-window.ui:58
msgid "Custom initial value"
msgstr "Özel başlangıç değeri"
msgstr ""
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr ""
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr "Başlangıçta sesi geri yüklemek yerine özel ses ayarla"
msgstr ""
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr "Ses yüzdesi"
msgstr ""
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr "Sarma"
msgstr ""
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr "Kip"
#: ui/preferences-window.ui:83
msgid "Accurate"
msgstr "Hatasız"
msgstr ""
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr "Hızlı"
msgstr ""
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr "Birim"
#: ui/preferences-window.ui:97
msgid "Second"
msgstr "Saniye"
msgstr ""
#: ui/preferences-window.ui:98
msgid "Minute"
msgstr "Dakika"
msgid "Second"
msgstr ""
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr ""
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr "Yüzde"
msgstr ""
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr "Değer"
msgstr ""
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr "Ses"
msgstr ""
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr "Milisaniye cinsinden solma süresi"
msgstr ""
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr "Yalnızca yerel ses biçimleri"
msgstr ""
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr "Altyazılar"
msgstr ""
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr "Öntanımlı yazı tipi"
msgstr ""
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr ""
msgstr ""
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr "İstemci"
msgstr ""
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr "Aşamalı indirme arabelleğe alma"
msgstr ""
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr "Sunucu"
msgstr ""
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr "Oynatıcıyı uzaktan denetle"
msgstr ""
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr "Dinleme portu"
msgstr ""
#: ui/preferences-window.ui:188
msgid "Tweaks"
msgstr "İnce Ayarlar"
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:192
msgid "Appearance"
msgstr "Görünüm"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:195
msgid "Dark theme"
msgstr "Koyu tema"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:201
msgid "Render window shadows"
msgstr "Pencere gölgelerini işle"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed"
msgstr "Pencere açıldığında performansı artırmak için devre dışı bırak"
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr "Eklenti puanı"
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr "GStreamer eklentilerinin öntanımlı sıralarını değiştir"
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr "Playbin3 kullan"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr "Çalıcının yeniden başlatılmasını gerektirir"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
msgstr "Deneysel"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr ""
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr ""
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr ""
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr ""
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr ""
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr "Ses çıktısı için PipeWire kullan"
msgstr ""
#: src/buttons.js:201
#, javascript-format
msgid "Decoder: %s"
msgstr "Çözücü: %s"
msgstr ""
#: src/dialogs.js:152
msgid "Enter or drop URI here"
msgstr "Bağlantıyı buraya gir veya sürükle"
msgstr ""
#: src/dialogs.js:157
msgid "Cancel"
msgstr "İptal Et"
msgstr ""
#: src/dialogs.js:158
msgid "Open"
msgstr ""
msgstr ""
#: src/dialogs.js:226
msgid "Title"
msgstr "Başlık"
msgstr ""
#: src/dialogs.js:227
msgid "Completed"
msgstr "Tamamlandı"
msgstr ""
#: src/dialogs.js:235
msgid "Resume playback?"
msgstr "Oynatmaya devam edilsin mi?"
msgstr ""
#: src/dialogs.js:289
#, javascript-format
msgid "GTK version: %s"
msgstr "GTK sürümü: %s"
msgstr ""
#: src/dialogs.js:290
#, javascript-format
msgid "Adwaita version: %s"
msgstr "Adwaita sürümü: %s"
msgstr ""
#: src/dialogs.js:291
#, javascript-format
msgid "GStreamer version: %s"
msgstr "GStreamer sürümü: %s"
msgstr ""
#: src/dialogs.js:292
#, javascript-format
msgid "GJS version: %s"
msgstr "GJS sürümü: %s"
msgstr ""
#: src/dialogs.js:300
msgid "A GNOME media player powered by GStreamer"
msgstr "GStreamer'dan gücünü alan bir GNOME ortam oynatıcısı"
msgstr ""
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305
msgid "translator-credits"
msgstr "Clapper Çevirilerine Katkıda Bulunan Herkese Çok Teşekkür Ederiz"
msgstr ""
#: src/revealers.js:170
#, javascript-format
msgid "Ends at: %s"
msgstr "Bitiş: %s"
msgstr ""
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr "Belirsiz"
msgstr ""
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr "Kanallar"
msgstr ""
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr "Devre dışı"
msgstr ""

165
po/uk.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2021-09-14 15:24\n"
"Last-Translator: \n"
"Language-Team: Ukrainian\n"
"Language: uk_UA\n"
@@ -41,11 +41,12 @@ msgstr ""
msgid "Speed"
msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr ""
@@ -117,7 +118,7 @@ msgstr ""
msgid "Export to file"
msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr ""
@@ -181,183 +182,203 @@ msgstr ""
msgid "Return to the preferences"
msgstr ""
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr ""
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr ""
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr ""
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr ""
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr ""
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr ""
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr ""
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr ""
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr ""
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr ""
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr ""
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr ""
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr ""
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr ""
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr ""
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr ""
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr ""
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr ""
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr ""
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr ""
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr ""
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr ""
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr ""
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr ""
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr ""
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr ""
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr ""
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr ""
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr ""
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr ""
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr ""
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr ""
#: ui/preferences-window.ui:188
msgid "Tweaks"
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:192
msgid "Appearance"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:195
msgid "Dark theme"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:201
msgid "Render window shadows"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr ""
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr ""
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr ""
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr ""
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr ""
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr ""
@@ -424,15 +445,15 @@ msgstr ""
msgid "Ends at: %s"
msgstr ""
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr ""
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr ""
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr ""

165
po/vi.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2021-09-14 15:24\n"
"Last-Translator: \n"
"Language-Team: Vietnamese\n"
"Language: vi_VN\n"
@@ -41,11 +41,12 @@ msgstr ""
msgid "Speed"
msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr ""
@@ -117,7 +118,7 @@ msgstr ""
msgid "Export to file"
msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr ""
@@ -181,183 +182,203 @@ msgstr ""
msgid "Return to the preferences"
msgstr ""
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr ""
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr ""
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr ""
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr ""
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr ""
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr ""
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr ""
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr ""
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr ""
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr ""
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr ""
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr ""
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr ""
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr ""
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr ""
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr ""
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr ""
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr ""
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr ""
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr ""
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr ""
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr ""
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr ""
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr ""
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr ""
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr ""
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr ""
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr ""
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr ""
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr ""
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr ""
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr ""
#: ui/preferences-window.ui:188
msgid "Tweaks"
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:192
msgid "Appearance"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:195
msgid "Dark theme"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:201
msgid "Render window shadows"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr ""
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr ""
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr ""
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr ""
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr ""
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr ""
@@ -424,15 +445,15 @@ msgstr ""
msgid "Ends at: %s"
msgstr ""
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr ""
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr ""
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-07-18 08:48\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2022-04-20 18:10\n"
"Last-Translator: \n"
"Language-Team: Chinese Simplified\n"
"Language: zh_CN\n"
@@ -27,7 +27,7 @@ msgstr "打开 URI…"
#: ui/clapper.ui:16 ui/preferences-window.ui:4
msgid "Preferences"
msgstr "选项"
msgstr "选项"
#: ui/clapper.ui:20
msgid "Shortcuts"
@@ -41,11 +41,12 @@ msgstr "关于 Claper"
msgid "Speed"
msgstr "速度"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr "一般"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr "常规​​​​​"
@@ -59,7 +60,7 @@ msgstr "切换全屏"
#: ui/help-overlay.ui:20
msgid "Double tap | Double click"
msgstr "轻击两次 | 双击"
msgstr ""
#: ui/help-overlay.ui:26
msgid "Leave fullscreen"
@@ -71,7 +72,7 @@ msgstr "显示 OSD仅全屏"
#: ui/help-overlay.ui:33
msgid "Tap"
msgstr "轻击"
msgstr ""
#: ui/help-overlay.ui:39
msgid "Quit"
@@ -99,7 +100,7 @@ msgstr "下一项"
#: ui/help-overlay.ui:68
msgid "Double tap (right side)"
msgstr "双击(右侧)"
msgstr ""
#: ui/help-overlay.ui:74
msgid "Previous item"
@@ -107,7 +108,7 @@ msgstr "上一项"
#: ui/help-overlay.ui:75
msgid "Double tap (left side)"
msgstr "双击(左侧)"
msgstr ""
#: ui/help-overlay.ui:81
msgid "Change repeat mode"
@@ -117,13 +118,13 @@ msgstr "更改循环模式"
msgid "Export to file"
msgstr "导出至文件"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr "播放"
#: ui/help-overlay.ui:98
msgid "Toggle play"
msgstr "切换播放"
msgstr ""
#: ui/help-overlay.ui:99
msgid "Long press | Right click"
@@ -135,7 +136,7 @@ msgstr "快进"
#: ui/help-overlay.ui:106
msgid "Swipe right | Scroll right"
msgstr "向右滑动 | 向右滚动"
msgstr ""
#: ui/help-overlay.ui:112
msgid "Seek backward"
@@ -143,7 +144,7 @@ msgstr "快退"
#: ui/help-overlay.ui:113
msgid "Swipe left | Scroll left"
msgstr "向左滑动 | 向左滚动"
msgstr ""
#: ui/help-overlay.ui:119
msgid "Volume up"
@@ -167,11 +168,11 @@ msgstr "切换静音"
#: ui/help-overlay.ui:139
msgid "Next chapter"
msgstr "下一章节"
msgstr ""
#: ui/help-overlay.ui:145
msgid "Previous chapter"
msgstr "上一章节"
msgstr ""
#: ui/preferences-plugin-ranking-subpage.ui:11
msgid "Decoders"
@@ -181,183 +182,203 @@ msgstr "解码器"
msgid "Return to the preferences"
msgstr "返回首选项"
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr "行为"
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr "自动全屏"
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "在播放列表被替换时进入全屏模式,除非悬浮模式"
msgstr ""
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr "询问恢复播放最近的媒体"
#: ui/preferences-window.ui:31
msgid "Float on all workspaces"
msgstr "悬浮于所有工作区"
msgstr ""
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr ""
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr "此选项仅适用于 GNOME"
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr "播放结束后"
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr "不执行任何操作"
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr "停留在最后一帧"
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr "关闭应用程序"
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr "音量"
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr "自定义初始值"
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr "设置启动时的自定义音量而非恢复先前"
msgstr ""
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr "音量百分比"
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr "定位播放"
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr "模式"
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr "精确"
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr "快速"
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr "单位"
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr "秒钟"
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr "分钟"
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr "百分比"
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr "值"
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr "音频"
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr "以毫秒为单位的偏移"
msgstr ""
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr "仅原生音频格式"
msgstr ""
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr "字幕"
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr "默认字体"
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr "网络"
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr "客户端"
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr "渐进式下载缓存"
msgstr ""
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr "服务器"
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr "远程控制播放器"
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr "监听端口"
#: ui/preferences-window.ui:188
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Web 应用程序端口"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr "调整"
#: ui/preferences-window.ui:192
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr "界面"
#: ui/preferences-window.ui:195
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr "暗色主题"
#: ui/preferences-window.ui:201
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr "渲染窗口阴影"
#: ui/preferences-window.ui:202
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr "禁用以提升窗口模式时的性能"
msgstr ""
#: ui/preferences-window.ui:213
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr "插件等级"
msgstr ""
#: ui/preferences-window.ui:214
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr "更改 GStreamer 插件的默认等级"
msgstr ""
#: ui/preferences-window.ui:219
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr "使用 playbin3"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr "需要重启播放器"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr "实验性功能"
#: ui/preferences-window.ui:228
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr "使用 PipeWire 输出音频"
@@ -368,7 +389,7 @@ msgstr "解码器:%s"
#: src/dialogs.js:152
msgid "Enter or drop URI here"
msgstr "输入或拖放 URI 到这里"
msgstr ""
#: src/dialogs.js:157
msgid "Cancel"
@@ -412,28 +433,27 @@ msgstr "GJS 版本:%s"
#: src/dialogs.js:300
msgid "A GNOME media player powered by GStreamer"
msgstr "一款基于 GStreamer 的 GNOME 媒体播放器"
msgstr ""
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305
msgid "translator-credits"
msgstr "刘韬\n"
"Tommy He"
msgstr "刘韬"
#: src/revealers.js:170
#, javascript-format
msgid "Ends at: %s"
msgstr "结束于:%s"
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr "未确定"
msgstr ""
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr "声道"
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr "禁用"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n"
"PO-Revision-Date: 2021-09-14 15:24\n"
"Last-Translator: \n"
"Language-Team: Chinese Traditional\n"
"Language: zh_TW\n"
@@ -41,11 +41,12 @@ msgstr ""
msgid "Speed"
msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83
#: ui/preferences-window.ui:215
msgid "Normal"
msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr ""
@@ -117,7 +118,7 @@ msgstr ""
msgid "Export to file"
msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr ""
@@ -181,183 +182,203 @@ msgstr ""
msgid "Return to the preferences"
msgstr ""
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr ""
#: ui/preferences-window.ui:18
#: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr ""
#: ui/preferences-window.ui:19
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr ""
#: ui/preferences-window.ui:25
#: ui/preferences-window.ui:26
msgid "Ask to resume recent media"
msgstr ""
#: ui/preferences-window.ui:31
#: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr ""
#: ui/preferences-window.ui:32
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME"
msgstr ""
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr ""
#: ui/preferences-window.ui:43
#: ui/preferences-window.ui:44
msgid "Do nothing"
msgstr ""
#: ui/preferences-window.ui:44
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:45
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr ""
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr ""
#: ui/preferences-window.ui:58
#: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr ""
#: ui/preferences-window.ui:59
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it"
msgstr ""
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr ""
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr ""
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr ""
#: ui/preferences-window.ui:83
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:84
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr ""
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr ""
#: ui/preferences-window.ui:97
#: ui/preferences-window.ui:98
msgid "Second"
msgstr ""
#: ui/preferences-window.ui:98
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr ""
#: ui/preferences-window.ui:99
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr ""
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr ""
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr ""
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr ""
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr ""
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr ""
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr ""
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr ""
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr ""
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr ""
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr ""
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr ""
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr ""
#: ui/preferences-window.ui:188
msgid "Tweaks"
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:192
msgid "Appearance"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:195
msgid "Dark theme"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:201
msgid "Render window shadows"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr ""
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr ""
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr ""
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr ""
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr ""
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr ""
@@ -424,15 +445,15 @@ msgstr ""
msgid "Ends at: %s"
msgstr ""
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248
msgid "Undetermined"
msgstr ""
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr ""
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr ""

View File

@@ -1,92 +1,27 @@
const { Gio, GObject, Gtk } = imports.gi;
const { Gio, GObject, Gdk, Gtk } = imports.gi;
const { AppBase } = imports.src.appBase;
const { Widget } = imports.src.widget;
const Debug = imports.src.debug;
const FileOps = imports.src.fileOps;
const Misc = imports.src.misc;
const Actions = imports.src.actions;
const { debug } = Debug;
const { settings } = Misc;
var App = GObject.registerClass({
GTypeName: 'ClapperApp',
},
class ClapperApp extends Gtk.Application
class ClapperApp extends AppBase
{
_init()
{
super._init({
application_id: Misc.appId,
flags: Gio.ApplicationFlags.HANDLES_OPEN,
});
super._init();
this.doneFirstActivate = false;
this.isFileAppend = false;
this.mapSignal = null;
this.flags |= Gio.ApplicationFlags.HANDLES_OPEN;
}
vfunc_open(files, hint)
vfunc_startup()
{
super.vfunc_open(files, hint);
this.activate();
this._openFilesAsync(files).catch(debug);
}
vfunc_activate()
{
super.vfunc_activate();
if(!this.doneFirstActivate)
this._onFirstActivate();
this.active_window.present();
}
async _openFilesAsync(files)
{
const urisArr = [];
for(let file of files) {
const uri = file.get_uri();
if(!uri.startsWith('file:')) {
urisArr.push(uri);
continue;
}
/* If file is not a dir its URI will be returned in an array */
const uris = await FileOps.getDirFilesUrisPromise(file).catch(debug);
if(uris && uris.length)
urisArr.push(...uris);
}
const [playlist, subs] = Misc.parsePlaylistFiles(urisArr);
const { player } = this.active_window.get_child();
const action = (this.isFileAppend) ? 'append' : 'set';
if(playlist && playlist.length)
player[`${action}_playlist`](playlist);
if(subs)
player.set_subtitles(subs);
/* Restore default behavior */
this.isFileAppend = false;
}
_onFirstActivate()
{
const window = new Gtk.ApplicationWindow({
application: this,
title: Misc.appName,
});
window.add_css_class('adwrounded');
if(!settings.get_boolean('render-shadows'))
window.add_css_class('gpufriendly');
window.add_css_class('gpufriendlyfs');
super.vfunc_startup();
const window = this.active_window;
const clapperWidget = new Widget();
const dummyHeaderbar = new Gtk.Box({
can_focus: false,
@@ -98,20 +33,14 @@ class ClapperApp extends Gtk.Application
window.set_child(clapperWidget);
window.set_titlebar(dummyHeaderbar);
for(let name in Actions.actions) {
const simpleAction = new Gio.SimpleAction({ name });
simpleAction.connect('activate', (action) =>
Actions.handleAction(action, window)
);
this.add_action(simpleAction);
const accels = Actions.actions[name];
if(accels)
this.set_accels_for_action(`app.${name}`, accels);
}
this.mapSignal = window.connect('map', this._onWindowMap.bind(this));
this.doneFirstActivate = true;
}
vfunc_open(files, hint)
{
super.vfunc_open(files, hint);
this._openFilesAsync(files).then(() => this.activate()).catch(debug);
}
_onWindowMap(window)

101
src/appBase.js Normal file
View File

@@ -0,0 +1,101 @@
const { Gio, GLib, GObject, Gtk } = imports.gi;
const Debug = imports.src.debug;
const FileOps = imports.src.fileOps;
const Misc = imports.src.misc;
const Actions = imports.src.actions;
const { debug } = Debug;
const { settings } = Misc;
var AppBase = GObject.registerClass({
GTypeName: 'ClapperAppBase',
},
class ClapperAppBase extends Gtk.Application
{
_init()
{
super._init({
application_id: Misc.appId,
});
this.doneFirstActivate = false;
this.isFileAppend = false;
}
vfunc_startup()
{
super.vfunc_startup();
const window = new Gtk.ApplicationWindow({
application: this,
title: Misc.appName,
});
/* FIXME: AFAIK there is no way to detect theme rounded corners.
* Having 2/4 corners rounded in floating mode is not good. */
window.add_css_class('adwrounded');
if(!settings.get_boolean('render-shadows'))
window.add_css_class('gpufriendly');
window.add_css_class('gpufriendlyfs');
}
vfunc_activate()
{
super.vfunc_activate();
if(!this.doneFirstActivate)
this._onFirstActivate();
this.active_window.present_with_time(
Math.floor(GLib.get_monotonic_time() / 1000)
);
}
async _openFilesAsync(files)
{
const urisArr = [];
for(let file of files) {
const uri = file.get_uri();
if(!uri.startsWith('file:')) {
urisArr.push(uri);
continue;
}
/* If file is not a dir its URI will be returned in an array */
const uris = await FileOps.getDirFilesUrisPromise(file).catch(debug);
if(uris && uris.length)
urisArr.push(...uris);
}
const [playlist, subs] = Misc.parsePlaylistFiles(urisArr);
const { player } = this.active_window.get_child();
const action = (this.isFileAppend) ? 'append' : 'set';
if(playlist && playlist.length)
player[`${action}_playlist`](playlist);
if(subs)
player.set_subtitles(subs);
/* Restore default behavior */
this.isFileAppend = false;
}
_onFirstActivate()
{
for(let name in Actions.actions) {
const simpleAction = new Gio.SimpleAction({ name });
simpleAction.connect('activate', (action) =>
Actions.handleAction(action, this.active_window)
);
this.add_action(simpleAction);
const accels = Actions.actions[name];
if(accels)
this.set_accels_for_action(`app.${name}`, accels);
}
this.doneFirstActivate = true;
}
});

View File

@@ -165,7 +165,7 @@ class ClapperElapsedTimeButton extends PopoverButtonBase
setInitialState()
{
this.label = `00${Misc.timeColon}0000${Misc.timeColon}00`;
this.label = '00000000';
}
setFullscreenMode(isFullscreen, isMobileMonitor)

2
src/controls.js vendored
View File

@@ -27,7 +27,7 @@ class ClapperControls extends Gtk.Box
this.isMobile = false;
this.showHours = false;
this.durationFormatted = `00${Misc.timeColon}00`;
this.durationFormatted = '0000';
this.revealersArr = [];
this.chapters = null;

View File

@@ -1,233 +1,11 @@
const { GObject, Gtk } = imports.gi;
const Debug = imports.src.debug;
const Misc = imports.src.misc;
const { debug } = Debug;
const { GObject } = imports.gi;
const { HeaderBarBase } = imports.src.headerbarBase;
var HeaderBar = GObject.registerClass({
GTypeName: 'ClapperHeaderBar',
},
class ClapperHeaderBar extends Gtk.Box
class ClapperHeaderBar extends HeaderBarBase
{
_init()
{
super._init({
can_focus: false,
orientation: Gtk.Orientation.HORIZONTAL,
spacing: 6,
margin_top: 6,
margin_start: 6,
margin_end: 6,
});
this.add_css_class('osdheaderbar');
this.isMaximized = false;
this.isMenuOnLeft = true;
const uiBuilder = Misc.getBuilderForName('clapper.ui');
this.menuWidget = new Gtk.Box({
orientation: Gtk.Orientation.HORIZONTAL,
valign: Gtk.Align.CENTER,
spacing: 6,
});
this.menuButton = new Gtk.MenuButton({
icon_name: 'open-menu-symbolic',
valign: Gtk.Align.CENTER,
can_focus: false,
});
const menuToggleButton = this.menuButton.get_first_child();
menuToggleButton.add_css_class('osd');
const mainMenuModel = uiBuilder.get_object('mainMenu');
const mainMenuPopover = new HeaderBarPopover(mainMenuModel);
this.menuButton.set_popover(mainMenuPopover);
this.menuButton.add_css_class('circular');
this.menuWidget.append(this.menuButton);
this.extraButtonsBox = new Gtk.Box({
orientation: Gtk.Orientation.HORIZONTAL,
valign: Gtk.Align.CENTER,
});
this.extraButtonsBox.add_css_class('linked');
const floatButton = new Gtk.Button({
icon_name: 'pip-in-symbolic',
can_focus: false,
});
floatButton.add_css_class('osd');
floatButton.add_css_class('circular');
floatButton.add_css_class('linkedleft');
floatButton.connect('clicked',
this._onFloatButtonClicked.bind(this)
);
this.extraButtonsBox.append(floatButton);
const separator = new Gtk.Separator({
orientation: Gtk.Orientation.VERTICAL,
});
separator.add_css_class('linkseparator');
this.extraButtonsBox.append(separator);
const fullscreenButton = new Gtk.Button({
icon_name: 'view-fullscreen-symbolic',
can_focus: false,
});
fullscreenButton.add_css_class('osd');
fullscreenButton.add_css_class('circular');
fullscreenButton.add_css_class('linkedright');
fullscreenButton.connect('clicked',
this._onFullscreenButtonClicked.bind(this)
);
this.extraButtonsBox.append(fullscreenButton);
this.menuWidget.append(this.extraButtonsBox);
this.spacerWidget = new Gtk.Box({
hexpand: true,
});
this.minimizeWidget = this._getWindowButton('minimize');
this.maximizeWidget = this._getWindowButton('maximize');
this.closeWidget = this._getWindowButton('close');
const gtkSettings = Gtk.Settings.get_default();
this._onLayoutUpdate(gtkSettings);
gtkSettings.connect(
'notify::gtk-decoration-layout',
this._onLayoutUpdate.bind(this)
);
}
setMenuOnLeft(isOnLeft)
{
if(this.isMenuOnLeft === isOnLeft)
return;
if(isOnLeft) {
this.menuWidget.reorder_child_after(
this.extraButtonsBox, this.menuButton
);
}
else {
this.menuWidget.reorder_child_after(
this.menuButton, this.extraButtonsBox
);
}
this.isMenuOnLeft = isOnLeft;
}
setMaximized(isMaximized)
{
if(this.isMaximized === isMaximized)
return;
this.maximizeWidget.icon_name = (isMaximized)
? 'window-restore-symbolic'
: 'window-maximize-symbolic';
this.isMaximized = isMaximized;
}
_onLayoutUpdate(gtkSettings)
{
const gtkLayout = gtkSettings.gtk_decoration_layout;
this._replaceButtons(gtkLayout);
}
_replaceButtons(gtkLayout)
{
const modLayout = gtkLayout.replace(':', ',spacer,');
const layoutArr = modLayout.split(',');
let lastWidget = null;
let showMinimize = false;
let showMaximize = false;
let showClose = false;
let menuAdded = false;
let spacerAdded = false;
debug(`headerbar layout: ${modLayout}`);
for(let name of layoutArr) {
/* Menu might be named "appmenu" */
if(!menuAdded && (!name || name === 'appmenu' || name === 'icon'))
name = 'menu';
const widget = this[`${name}Widget`];
if(!widget) continue;
if(!widget.parent)
this.append(widget);
else
this.reorder_child_after(widget, lastWidget);
switch(name) {
case 'spacer':
spacerAdded = true;
break;
case 'minimize':
showMinimize = true;
break;
case 'maximize':
showMaximize = true;
break;
case 'close':
showClose = true;
break;
case 'menu':
this.setMenuOnLeft(!spacerAdded);
menuAdded = true;
break;
default:
break;
}
lastWidget = widget;
}
this.minimizeWidget.visible = showMinimize;
this.maximizeWidget.visible = showMaximize;
this.closeWidget.visible = showClose;
}
_getWindowButton(name)
{
const button = new Gtk.Button({
icon_name: `window-${name}-symbolic`,
valign: Gtk.Align.CENTER,
can_focus: false,
});
button.add_css_class('osd');
button.add_css_class('circular');
if(name === 'maximize')
name = 'toggle-maximized';
button.connect('clicked',
this._onWindowButtonActivate.bind(this, name)
);
return button;
}
_updateFloatIcon(isFloating)
{
const floatButton = this.extraButtonsBox.get_first_child();
if(!floatButton) return;
const iconName = (isFloating)
? 'pip-out-symbolic'
: 'pip-in-symbolic';
if(floatButton.icon_name !== iconName)
floatButton.icon_name = iconName;
}
_onWindowButtonActivate(action)
{
this.activate_action(`window.${action}`, null);
@@ -251,49 +29,3 @@ class ClapperHeaderBar extends Gtk.Box
this.root.fullscreen();
}
});
var HeaderBarPopover = GObject.registerClass({
GTypeName: 'ClapperHeaderBarPopover',
},
class ClapperHeaderBarPopover extends Gtk.PopoverMenu
{
_init(model)
{
super._init({
menu_model: model,
});
this.connect('map', this._onMap.bind(this));
this.connect('closed', this._onClosed.bind(this));
}
_onMap()
{
const { child } = this.root;
if(
!child
|| !child.player
|| !child.player.widget
)
return;
child.revealControls();
child.isPopoverOpen = true;
}
_onClosed()
{
const { child } = this.root;
if(
!child
|| !child.player
|| !child.player.widget
)
return;
child.revealControls();
child.isPopoverOpen = false;
}
});

288
src/headerbarBase.js Normal file
View File

@@ -0,0 +1,288 @@
const { GObject, Gtk } = imports.gi;
const Debug = imports.src.debug;
const Misc = imports.src.misc;
const { debug } = Debug;
var HeaderBarBase = GObject.registerClass({
GTypeName: 'ClapperHeaderBarBase',
},
class ClapperHeaderBarBase extends Gtk.Box
{
_init()
{
super._init({
can_focus: false,
orientation: Gtk.Orientation.HORIZONTAL,
spacing: 6,
margin_top: 6,
margin_start: 6,
margin_end: 6,
});
this.add_css_class('osdheaderbar');
this.isMaximized = false;
this.isMenuOnLeft = true;
const uiBuilder = Misc.getBuilderForName('clapper.ui');
this.menuWidget = new Gtk.Box({
orientation: Gtk.Orientation.HORIZONTAL,
valign: Gtk.Align.CENTER,
spacing: 6,
});
this.menuButton = new Gtk.MenuButton({
icon_name: 'open-menu-symbolic',
valign: Gtk.Align.CENTER,
can_focus: false,
});
const menuToggleButton = this.menuButton.get_first_child();
menuToggleButton.add_css_class('osd');
const mainMenuModel = uiBuilder.get_object('mainMenu');
const mainMenuPopover = new HeaderBarPopover(mainMenuModel);
this.menuButton.set_popover(mainMenuPopover);
this.menuButton.add_css_class('circular');
this.menuWidget.append(this.menuButton);
this.extraButtonsBox = new Gtk.Box({
orientation: Gtk.Orientation.HORIZONTAL,
valign: Gtk.Align.CENTER,
});
this.extraButtonsBox.add_css_class('linked');
const floatButton = new Gtk.Button({
icon_name: 'pip-in-symbolic',
can_focus: false,
});
floatButton.add_css_class('osd');
floatButton.add_css_class('circular');
floatButton.add_css_class('linkedleft');
floatButton.connect('clicked',
this._onFloatButtonClicked.bind(this)
);
this.extraButtonsBox.append(floatButton);
const separator = new Gtk.Separator({
orientation: Gtk.Orientation.VERTICAL,
});
separator.add_css_class('linkseparator');
this.extraButtonsBox.append(separator);
const fullscreenButton = new Gtk.Button({
icon_name: 'view-fullscreen-symbolic',
can_focus: false,
});
fullscreenButton.add_css_class('osd');
fullscreenButton.add_css_class('circular');
fullscreenButton.add_css_class('linkedright');
fullscreenButton.connect('clicked',
this._onFullscreenButtonClicked.bind(this)
);
this.extraButtonsBox.append(fullscreenButton);
this.menuWidget.append(this.extraButtonsBox);
this.spacerWidget = new Gtk.Box({
hexpand: true,
});
this.minimizeWidget = this._getWindowButton('minimize');
this.maximizeWidget = this._getWindowButton('maximize');
this.closeWidget = this._getWindowButton('close');
const gtkSettings = Gtk.Settings.get_default();
this._onLayoutUpdate(gtkSettings);
gtkSettings.connect(
'notify::gtk-decoration-layout',
this._onLayoutUpdate.bind(this)
);
}
setMenuOnLeft(isOnLeft)
{
if(this.isMenuOnLeft === isOnLeft)
return;
if(isOnLeft) {
this.menuWidget.reorder_child_after(
this.extraButtonsBox, this.menuButton
);
}
else {
this.menuWidget.reorder_child_after(
this.menuButton, this.extraButtonsBox
);
}
this.isMenuOnLeft = isOnLeft;
}
setMaximized(isMaximized)
{
if(this.isMaximized === isMaximized)
return;
this.maximizeWidget.icon_name = (isMaximized)
? 'window-restore-symbolic'
: 'window-maximize-symbolic';
this.isMaximized = isMaximized;
}
_onLayoutUpdate(gtkSettings)
{
const gtkLayout = gtkSettings.gtk_decoration_layout;
this._replaceButtons(gtkLayout);
}
_replaceButtons(gtkLayout)
{
const modLayout = gtkLayout.replace(':', ',spacer,');
const layoutArr = modLayout.split(',');
let lastWidget = null;
let showMinimize = false;
let showMaximize = false;
let showClose = false;
let menuAdded = false;
let spacerAdded = false;
debug(`headerbar layout: ${modLayout}`);
for(let name of layoutArr) {
/* Menu might be named "appmenu" */
if(!menuAdded && (!name || name === 'appmenu' || name === 'icon'))
name = 'menu';
const widget = this[`${name}Widget`];
if(!widget) continue;
if(!widget.parent)
this.append(widget);
else
this.reorder_child_after(widget, lastWidget);
switch(name) {
case 'spacer':
spacerAdded = true;
break;
case 'minimize':
showMinimize = true;
break;
case 'maximize':
showMaximize = true;
break;
case 'close':
showClose = true;
break;
case 'menu':
this.setMenuOnLeft(!spacerAdded);
menuAdded = true;
break;
default:
break;
}
lastWidget = widget;
}
this.minimizeWidget.visible = showMinimize;
this.maximizeWidget.visible = showMaximize;
this.closeWidget.visible = showClose;
}
_getWindowButton(name)
{
const button = new Gtk.Button({
icon_name: `window-${name}-symbolic`,
valign: Gtk.Align.CENTER,
can_focus: false,
});
button.add_css_class('osd');
button.add_css_class('circular');
if(name === 'maximize')
name = 'toggle-maximized';
button.connect('clicked',
this._onWindowButtonActivate.bind(this, name)
);
return button;
}
_updateFloatIcon(isFloating)
{
const floatButton = this.extraButtonsBox.get_first_child();
if(!floatButton) return;
const iconName = (isFloating)
? 'pip-out-symbolic'
: 'pip-in-symbolic';
if(floatButton.icon_name !== iconName)
floatButton.icon_name = iconName;
}
_onWindowButtonActivate(action)
{
}
_onFloatButtonClicked(button)
{
}
_onFullscreenButtonClicked(button)
{
}
});
var HeaderBarPopover = GObject.registerClass({
GTypeName: 'ClapperHeaderBarPopover',
},
class ClapperHeaderBarPopover extends Gtk.PopoverMenu
{
_init(model)
{
super._init({
menu_model: model,
});
this.connect('map', this._onMap.bind(this));
this.connect('closed', this._onClosed.bind(this));
}
_onMap()
{
const { child } = this.root;
if(
!child
|| !child.player
|| !child.player.widget
)
return;
child.revealControls();
child.isPopoverOpen = true;
}
_onClosed()
{
const { child } = this.root;
if(
!child
|| !child.player
|| !child.player.widget
)
return;
child.revealControls();
child.isPopoverOpen = false;
}
});

View File

@@ -10,7 +10,6 @@ Debug.debug('imports');
const { GstClapper, Gtk, Adw } = imports.gi;
const { App } = imports.src.app;
const Misc = imports.src.misc;
function main(argv)
{
@@ -20,10 +19,6 @@ function main(argv)
Gtk.init();
Adw.init();
/* U+2236 seems to break RTL languages, use U+003A instead */
if(Gtk.Widget.get_default_direction() === Gtk.TextDirection.RTL)
Misc.timeColon = ':';
Debug.debug('initialized');
new App().run(argv);

View File

@@ -9,7 +9,6 @@ var subsMimes = [
'application/x-subrip',
'text/x-ssa',
];
var timeColon = '';
var settings = new Gio.Settings({
schema_id: appId,
@@ -162,8 +161,8 @@ function getFormattedTime(time, showHours)
time -= minutes * 60;
const seconds = ('0' + Math.floor(time)).slice(-2);
const parsed = (hours) ? `${hours}${timeColon}` : '';
return parsed + `${minutes}${timeColon}${seconds}`;
const parsed = (hours) ? `${hours}` : '';
return parsed + `${minutes}${seconds}`;
}
function parsePlaylistFiles(filesArray)

View File

@@ -66,6 +66,7 @@ class ClapperPlayer extends GstClapper.Clapper
this.needsTocUpdate = true;
this.set_all_plugins_ranks();
this.set_initial_config();
this.set_and_bind_settings();
this.connect('state-changed', this._onStateChanged.bind(this));
@@ -97,6 +98,13 @@ class ClapperPlayer extends GstClapper.Clapper
settings.bind('subtitle-font', this.pipeline, 'subtitle-font-desc', flag);
}
set_initial_config()
{
/* FIXME: change into option in preferences */
const pipeline = this.get_pipeline();
pipeline.ring_buffer_max_size = 8 * 1024 * 1024;
}
set_all_plugins_ranks()
{
let data = {};

View File

@@ -59,8 +59,8 @@ class ClapperRevealerTop extends CustomRevealer
const initTime = GLib.DateTime.new_now_local().format('%X');
this.timeFormat = (initTime.length > 8)
? `%I${Misc.timeColon}%M %p`
: `%H${Misc.timeColon}%M`;
? '%I%M %p'
: '%H%M';
this.mediaTitle = new Gtk.Label({
ellipsize: Pango.EllipsizeMode.END,