3 Commits

Author SHA1 Message Date
Rafał Dzięgiel
23b57cd326 Use new "clappersink" element
Use brand new clapper video sink for video output. Also add "CLAPPER_USE_LEGACY_SINK" env
to still allow the usage of old video sink if any problems arise.
2022-04-12 11:48:45 +02:00
Rafał Dzięgiel
9a19e10542 plugin: Add "clapperglimport" element
A Clapper import element that imports GStreamer `GLMemory` into `GdkTexture` for improved performance where OpenGL is available
2022-04-12 09:47:27 +02:00
Rafał Dzięgiel
0061e133f9 plugin: Add clapper GStreamer plugin
Add new GStreamer plugin that consists of multiple elements for Clapper video player.

The main difference is that unlike the old one, this does not operate using `GtkGLArea`
anymore, but processes and displays `GdkTextures` directly through `GtkPicture` widget.
Also this one is installed like any other GStreamer plugin, thus can be used via
`gst-launch-1.0` binary or even used by other GTK4 apps if they wish to integrate it.

This commit adds new video sink that uses a new kind of memory as input, called
`ClapperGdkMemory`. With it comes a simple dedicated memory allocator, buffer pool
and a `clapperimport` element that converts system mapped memory frames into
`GdkTextures` that are later passed in our `ClapperGdkMemory` for the sink to display.
2022-04-12 09:43:20 +02:00
87 changed files with 5671 additions and 5789 deletions

View File

@@ -7,7 +7,6 @@ jobs:
flatpak:
name: "Flatpak"
runs-on: ubuntu-latest
timeout-minutes: 600
container:
image: bilelmoussaoui/flatpak-github-actions:gnome-nightly
options: --privileged

View File

@@ -11,7 +11,6 @@ jobs:
flatpak:
name: "Flatpak"
runs-on: ubuntu-latest
timeout-minutes: 600
container:
image: bilelmoussaoui/flatpak-github-actions:gnome-42
options: --privileged

View File

@@ -1,10 +0,0 @@
rebuild_master:
steps:
- trigger_services:
project: home:Rafostar
package: clapper
filters:
event: push
branches:
only:
- master

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,27 +48,6 @@
</screenshot>
</screenshots>
<releases>
<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

@@ -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;
}
}
@@ -3222,10 +3222,6 @@ gst_clapper_main (gpointer data)
_update_from_env (&self->use_playbin3, "GST_CLAPPER_USE_PLAYBIN3");
/* Takes precedence over `GST_CLAPPER_USE_PLAYBIN3` as it
* influences element factory behavior */
_update_from_env (&self->use_playbin3, "USE_PLAYBIN3");
if (self->use_playbin3) {
GST_DEBUG_OBJECT (self, "playbin3 enabled");
self->playbin = gst_element_factory_make ("playbin3", "playbin3");
@@ -3550,23 +3546,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

@@ -34,40 +34,13 @@ gstclapper_defines = [
'-DGST_USE_UNSTABLE_API',
'-DHAVE_GTK_GL',
]
gtk_deps = [gstgl_dep, gstglproto_dep]
have_gtk_gl_windowing = false
gtk4_dep = dependency('gtk4', required: true)
if not gtk4_dep.version().version_compare('>=4.0.0')
error('GTK4 version on this system is too old')
if not get_option('lib')
subdir_done()
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()
gtk_deps += gtk_x11_dep
if gst_gl_have_platform_glx
gtk_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()
gtk_deps += [gtk_wayland_dep, gstglwayland_dep]
have_gtk_gl_windowing = true
endif
endif
if gst_gl_have_platform_egl
gtk_deps += gstglegl_dep
error('Clapper lib requires GI bindings to be compiled')
endif
if not have_gtk_gl_windowing
@@ -80,18 +53,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 +61,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,

5
lib/gst/meson.build vendored
View File

@@ -1,5 +1,2 @@
if get_option('lib')
subdir('clapper')
endif
subdir('clapper')
subdir('plugin')

374
lib/gst/plugin/gstclapperbaseimport.c vendored Normal file
View File

@@ -0,0 +1,374 @@
/*
* 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 "gstclapperbaseimport.h"
#include "gstclappergdkmemory.h"
#include "gstclappergdkbufferpool.h"
#define GST_CAT_DEFAULT gst_clapper_base_import_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
#define parent_class gst_clapper_base_import_parent_class
G_DEFINE_TYPE (GstClapperBaseImport, gst_clapper_base_import, GST_TYPE_BASE_TRANSFORM);
static void
gst_clapper_base_import_init (GstClapperBaseImport *self)
{
g_mutex_init (&self->lock);
gst_video_info_init (&self->in_info);
gst_video_info_init (&self->out_info);
}
static void
gst_clapper_base_import_finalize (GObject *object)
{
GstClapperBaseImport *self = GST_CLAPPER_BASE_IMPORT_CAST (object);
GST_TRACE ("Finalize");
g_mutex_clear (&self->lock);
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
}
static GstStateChangeReturn
gst_clapper_base_import_change_state (GstElement *element, GstStateChange transition)
{
GST_DEBUG_OBJECT (element, "Changing state: %s => %s",
gst_element_state_get_name (GST_STATE_TRANSITION_CURRENT (transition)),
gst_element_state_get_name (GST_STATE_TRANSITION_NEXT (transition)));
return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
}
static gboolean
gst_clapper_base_import_start (GstBaseTransform *bt)
{
GST_INFO_OBJECT (bt, "Start");
return TRUE;
}
static gboolean
gst_clapper_base_import_stop (GstBaseTransform *bt)
{
GST_INFO_OBJECT (bt, "Stop");
return TRUE;
}
static GstCaps *
gst_clapper_base_import_transform_caps (GstBaseTransform *bt,
GstPadDirection direction, GstCaps *caps, GstCaps *filter)
{
GstCaps *result, *tmp;
tmp = (direction == GST_PAD_SINK)
? gst_pad_get_pad_template_caps (GST_BASE_TRANSFORM_SRC_PAD (bt))
: gst_pad_get_pad_template_caps (GST_BASE_TRANSFORM_SINK_PAD (bt));
if (filter) {
GST_DEBUG ("Intersecting with filter caps: %" GST_PTR_FORMAT, filter);
result = gst_caps_intersect_full (filter, tmp, GST_CAPS_INTERSECT_FIRST);
gst_caps_unref (tmp);
} else {
result = tmp;
}
GST_DEBUG ("Returning %s caps: %" GST_PTR_FORMAT,
(direction == GST_PAD_SINK) ? "src" : "sink", result);
return result;
}
static gboolean
_structure_filter_cb (GQuark field_id, GValue *value,
G_GNUC_UNUSED gpointer user_data)
{
const gchar *str = g_quark_to_string (field_id);
if (!strcmp (str, "format")
|| !strcmp (str, "width")
|| !strcmp (str, "height")
|| !strcmp (str, "pixel-aspect-ratio")
|| !strcmp (str, "framerate"))
return TRUE;
return FALSE;
}
static GstCaps *
gst_clapper_base_import_fixate_caps (GstBaseTransform *bt,
GstPadDirection direction, GstCaps *caps, GstCaps *othercaps)
{
GstCaps *fixated;
fixated = (!gst_caps_is_any (caps))
? gst_caps_fixate (gst_caps_ref (caps))
: gst_caps_copy (caps);
if (direction == GST_PAD_SINK) {
guint i, n = gst_caps_get_size (fixated);
for (i = 0; i < n; i++) {
GstCapsFeatures *features;
GstStructure *structure;
gboolean had_overlay_comp;
features = gst_caps_get_features (fixated, i);
had_overlay_comp = gst_caps_features_contains (features,
GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION);
features = gst_caps_features_new (GST_CAPS_FEATURE_CLAPPER_GDK_MEMORY, NULL);
if (had_overlay_comp)
gst_caps_features_add (features, GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION);
gst_caps_set_features (fixated, i, features);
/* Remove fields that do not apply to our memory */
if ((structure = gst_caps_get_structure (fixated, i))) {
gst_structure_filter_and_map_in_place (structure,
(GstStructureFilterMapFunc) _structure_filter_cb, NULL);
}
}
}
GST_DEBUG ("Fixated %s caps: %" GST_PTR_FORMAT,
(direction == GST_PAD_SRC) ? "sink" : "src", fixated);
return fixated;
}
static gboolean
gst_clapper_base_import_set_caps (GstBaseTransform *bt,
GstCaps *incaps, GstCaps *outcaps)
{
GstClapperBaseImport *self = GST_CLAPPER_BASE_IMPORT_CAST (bt);
gboolean has_sink_info, has_src_info;
if ((has_sink_info = gst_video_info_from_caps (&self->in_info, incaps)))
GST_INFO_OBJECT (self, "Set sink caps: %" GST_PTR_FORMAT, incaps);
if ((has_src_info = gst_video_info_from_caps (&self->out_info, outcaps)))
GST_INFO_OBJECT (self, "Set src caps: %" GST_PTR_FORMAT, outcaps);
return (has_sink_info && has_src_info);
}
static gboolean
gst_clapper_base_import_import_propose_allocation (GstBaseTransform *bt,
GstQuery *decide_query, GstQuery *query)
{
GstClapperBaseImport *self = GST_CLAPPER_BASE_IMPORT_CAST (bt);
GstClapperBaseImportClass *bi_class = GST_CLAPPER_BASE_IMPORT_GET_CLASS (self);
GstBufferPool *pool = NULL;
GstCaps *caps;
GstVideoInfo info;
guint size;
gboolean need_pool;
if (!GST_BASE_TRANSFORM_CLASS (parent_class)->propose_allocation (bt,
decide_query, query))
return FALSE;
/* Passthrough, nothing to do */
if (!decide_query)
return TRUE;
gst_query_parse_allocation (query, &caps, &need_pool);
if (!caps) {
GST_DEBUG_OBJECT (self, "No caps specified");
return FALSE;
}
if (!gst_video_info_from_caps (&info, caps)) {
GST_DEBUG_OBJECT (self, "Invalid caps specified");
return FALSE;
}
/* Normal size of a frame */
size = GST_VIDEO_INFO_SIZE (&info);
if (need_pool) {
GstStructure *config = NULL;
GST_DEBUG_OBJECT (self, "Need to create upstream pool");
pool = bi_class->create_upstream_pool (self, &config);
if (pool) {
/* If we did not get config, use default one */
if (!config)
config = gst_buffer_pool_get_config (pool);
gst_buffer_pool_config_set_params (config, caps, size, 2, 0);
if (!gst_buffer_pool_set_config (pool, config)) {
gst_object_unref (pool);
GST_DEBUG_OBJECT (self, "Failed to set config");
return FALSE;
}
} else if (config) {
GST_WARNING_OBJECT (self, "Got pool config without a pool to apply it!");
gst_structure_free (config);
}
}
gst_query_add_allocation_pool (query, pool, size, 2, 0);
if (pool)
gst_object_unref (pool);
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);
return TRUE;
}
static gboolean
gst_clapper_base_import_decide_allocation (GstBaseTransform *bt, GstQuery *query)
{
GstClapperBaseImport *self = GST_CLAPPER_BASE_IMPORT_CAST (bt);
GstBufferPool *pool = NULL;
GstCaps *caps;
GstVideoInfo info;
guint size = 0, min = 0, max = 0;
gboolean update_pool, need_pool = TRUE;
gst_query_parse_allocation (query, &caps, NULL);
if (!caps) {
GST_DEBUG_OBJECT (self, "No caps specified");
return FALSE;
}
if (!gst_video_info_from_caps (&info, caps)) {
GST_DEBUG_OBJECT (self, "Invalid caps specified");
return FALSE;
}
if ((update_pool = gst_query_get_n_allocation_pools (query) > 0)) {
gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max);
if (pool) {
if ((need_pool = !GST_IS_CLAPPER_GDK_BUFFER_POOL (pool)))
gst_clear_object (&pool);
}
} else {
size = GST_VIDEO_INFO_SIZE (&info);
}
if (need_pool) {
GstStructure *config;
GST_DEBUG_OBJECT (self, "Creating new downstream pool");
pool = gst_clapper_gdk_buffer_pool_new ();
config = gst_buffer_pool_get_config (pool);
gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META);
gst_buffer_pool_config_set_params (config, caps, size, min, max);
if (!gst_buffer_pool_set_config (pool, config)) {
gst_object_unref (pool);
GST_DEBUG_OBJECT (self, "Failed to set config");
return FALSE;
}
}
if (update_pool)
gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max);
else
gst_query_add_allocation_pool (query, pool, size, min, max);
if (pool)
gst_object_unref (pool);
return GST_BASE_TRANSFORM_CLASS (parent_class)->decide_allocation (bt, query);
}
static GstBufferPool *
gst_clapper_base_import_create_upstream_pool (GstClapperBaseImport *self, GstStructure **config)
{
GST_FIXME_OBJECT (self, "Need to create upstream buffer pool");
return NULL;
}
static void
gst_clapper_base_import_class_init (GstClapperBaseImportClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
GstElementClass *gstelement_class = (GstElementClass *) klass;
GstBaseTransformClass *gstbasetransform_class = (GstBaseTransformClass *) klass;
GstClapperBaseImportClass *bi_class = (GstClapperBaseImportClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperbaseimport", 0,
"Clapper Base Import");
gobject_class->finalize = gst_clapper_base_import_finalize;
gstelement_class->change_state = gst_clapper_base_import_change_state;
gstbasetransform_class->passthrough_on_same_caps = TRUE;
gstbasetransform_class->transform_ip_on_passthrough = FALSE;
gstbasetransform_class->start = gst_clapper_base_import_start;
gstbasetransform_class->stop = gst_clapper_base_import_stop;
gstbasetransform_class->transform_caps = gst_clapper_base_import_transform_caps;
gstbasetransform_class->fixate_caps = gst_clapper_base_import_fixate_caps;
gstbasetransform_class->set_caps = gst_clapper_base_import_set_caps;
gstbasetransform_class->propose_allocation = gst_clapper_base_import_import_propose_allocation;
gstbasetransform_class->decide_allocation = gst_clapper_base_import_decide_allocation;
bi_class->create_upstream_pool = gst_clapper_base_import_create_upstream_pool;
}
/*
* Maps input video frame and output memory from in/out buffers
* using flags passed to this method.
*
* Remember to unmap both using `gst_video_frame_unmap` and
* `gst_memory_unmap` when done with the data.
*/
gboolean
gst_clapper_base_import_map_buffers (GstClapperBaseImport *self,
GstBuffer *in_buf, GstBuffer *out_buf, GstMapFlags in_flags, GstMapFlags out_flags,
GstVideoFrame *frame, GstMapInfo *info, GstMemory **mem)
{
GST_LOG_OBJECT (self, "Transforming from %" GST_PTR_FORMAT
" into %" GST_PTR_FORMAT, in_buf, out_buf);
if (G_UNLIKELY (!gst_video_frame_map (frame, &self->in_info, in_buf, in_flags))) {
GST_ERROR_OBJECT (self, "Could not map input buffer for reading");
return FALSE;
}
*mem = gst_buffer_peek_memory (out_buf, 0);
if (G_UNLIKELY (!gst_memory_map (*mem, info, out_flags))) {
GST_ERROR_OBJECT (self, "Could not map output memory for writing");
gst_video_frame_unmap (frame);
return FALSE;
}
return TRUE;
}

69
lib/gst/plugin/gstclapperbaseimport.h vendored Normal file
View File

@@ -0,0 +1,69 @@
/*
* 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/base/gstbasetransform.h>
#include <gst/video/video.h>
G_BEGIN_DECLS
#define GST_TYPE_CLAPPER_BASE_IMPORT (gst_clapper_base_import_get_type())
#define GST_IS_CLAPPER_BASE_IMPORT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_CLAPPER_BASE_IMPORT))
#define GST_IS_CLAPPER_BASE_IMPORT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_CLAPPER_BASE_IMPORT))
#define GST_CLAPPER_BASE_IMPORT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_CLAPPER_BASE_IMPORT, GstClapperBaseImportClass))
#define GST_CLAPPER_BASE_IMPORT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_CLAPPER_BASE_IMPORT, GstClapperBaseImport))
#define GST_CLAPPER_BASE_IMPORT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_CLAPPER_BASE_IMPORT, GstClapperBaseImportClass))
#define GST_CLAPPER_BASE_IMPORT_CAST(obj) ((GstClapperBaseImport *)(obj))
#define GST_CLAPPER_BASE_IMPORT_GET_LOCK(obj) (&GST_CLAPPER_BASE_IMPORT_CAST(obj)->lock)
#define GST_CLAPPER_BASE_IMPORT_LOCK(obj) g_mutex_lock (GST_CLAPPER_BASE_IMPORT_GET_LOCK(obj))
#define GST_CLAPPER_BASE_IMPORT_UNLOCK(obj) g_mutex_unlock (GST_CLAPPER_BASE_IMPORT_GET_LOCK(obj))
typedef struct _GstClapperBaseImport GstClapperBaseImport;
typedef struct _GstClapperBaseImportClass GstClapperBaseImportClass;
#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GstClapperBaseImport, gst_object_unref)
#endif
struct _GstClapperBaseImport
{
GstBaseTransform parent;
GMutex lock;
GstVideoInfo in_info, out_info;
};
struct _GstClapperBaseImportClass
{
GstBaseTransformClass parent_class;
GstBufferPool * (* create_upstream_pool) (GstClapperBaseImport *bi,
GstStructure **config);
};
GType gst_clapper_base_import_get_type (void);
gboolean gst_clapper_base_import_map_buffers (GstClapperBaseImport *bi,
GstBuffer *in_buf, GstBuffer *out_buf, GstMapFlags in_flags, GstMapFlags out_flags,
GstVideoFrame *frame, GstMapInfo *info, GstMemory **mem);
G_END_DECLS

173
lib/gst/plugin/gstclappergdkbufferpool.c vendored Normal file
View File

@@ -0,0 +1,173 @@
/*
* 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 "gstclappergdkbufferpool.h"
#define GST_CAT_DEFAULT gst_clapper_gdk_buffer_pool_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
#define parent_class gst_clapper_gdk_buffer_pool_parent_class
G_DEFINE_TYPE (GstClapperGdkBufferPool, gst_clapper_gdk_buffer_pool, GST_TYPE_BUFFER_POOL);
static void
gst_clapper_gdk_buffer_pool_init (GstClapperGdkBufferPool *pool)
{
}
static const gchar **
gst_clapper_gdk_buffer_pool_get_options (GstBufferPool *pool)
{
static const gchar *options[] = {
GST_BUFFER_POOL_OPTION_VIDEO_META,
NULL
};
return options;
}
static gboolean
gst_clapper_gdk_buffer_pool_set_config (GstBufferPool *pool, GstStructure *config)
{
GstClapperGdkBufferPool *self = GST_CLAPPER_GDK_BUFFER_POOL_CAST (pool);
GstCaps *caps = NULL;
guint size, min_buffers, max_buffers;
GstVideoInfo info;
GstClapperGdkMemory *clapper_mem;
if (!gst_buffer_pool_config_get_params (config, &caps, &size,
&min_buffers, &max_buffers)) {
GST_WARNING_OBJECT (self, "Invalid buffer pool config");
return FALSE;
}
if (!caps || !gst_video_info_from_caps (&info, caps)) {
GST_WARNING_OBJECT (pool, "Could not parse caps into video info");
return FALSE;
}
gst_clear_object (&self->allocator);
self->allocator = GST_CLAPPER_GDK_ALLOCATOR_CAST (
gst_allocator_find (GST_CLAPPER_GDK_MEMORY_TYPE_NAME));
if (G_UNLIKELY (!self->allocator)) {
GST_ERROR_OBJECT (self, "ClapperGdkAllocator is unavailable");
return FALSE;
}
clapper_mem = GST_CLAPPER_GDK_MEMORY_CAST (
gst_clapper_gdk_allocator_alloc (self->allocator, &info));
if (G_UNLIKELY (!clapper_mem)) {
GST_ERROR_OBJECT (self, "Cannot create ClapperGdkMemory");
return FALSE;
}
gst_buffer_pool_config_set_params (config, caps,
GST_VIDEO_INFO_SIZE (&clapper_mem->info), min_buffers, max_buffers);
gst_memory_unref (GST_MEMORY_CAST (clapper_mem));
self->info = info;
GST_DEBUG_OBJECT (self, "Set buffer pool config: %" GST_PTR_FORMAT, config);
return GST_BUFFER_POOL_CLASS (parent_class)->set_config (pool, config);
}
static GstFlowReturn
gst_clapper_gdk_buffer_pool_alloc (GstBufferPool *pool, GstBuffer **buffer,
GstBufferPoolAcquireParams *params)
{
GstClapperGdkBufferPool *self = GST_CLAPPER_GDK_BUFFER_POOL_CAST (pool);
GstMemory *mem;
GstClapperGdkMemory *clapper_mem;
mem = gst_clapper_gdk_allocator_alloc (self->allocator, &self->info);
if (G_UNLIKELY (!mem)) {
GST_ERROR_OBJECT (self, "Cannot create ClapperGdkMemory");
return GST_FLOW_ERROR;
}
clapper_mem = GST_CLAPPER_GDK_MEMORY_CAST (mem);
*buffer = gst_buffer_new ();
gst_buffer_append_memory (*buffer, mem);
gst_buffer_add_video_meta_full (*buffer, GST_VIDEO_FRAME_FLAG_NONE,
GST_VIDEO_INFO_FORMAT (&self->info), GST_VIDEO_INFO_WIDTH (&self->info),
GST_VIDEO_INFO_HEIGHT (&self->info), GST_VIDEO_INFO_N_PLANES (&self->info),
clapper_mem->info.offset, clapper_mem->info.stride);
GST_TRACE_OBJECT (self, "Allocated %" GST_PTR_FORMAT, *buffer);
return GST_FLOW_OK;
}
static void
gst_clapper_gdk_buffer_reset_buffer (GstBufferPool *pool, GstBuffer *buffer)
{
GstClapperGdkMemory *clapper_mem;
GST_TRACE ("Reset %" GST_PTR_FORMAT, buffer);
clapper_mem = GST_CLAPPER_GDK_MEMORY_CAST (gst_buffer_peek_memory (buffer, 0));
g_clear_object (&clapper_mem->texture);
return GST_BUFFER_POOL_CLASS (parent_class)->reset_buffer (pool, buffer);
}
static void
gst_clapper_gdk_buffer_pool_dispose (GObject *object)
{
GstClapperGdkBufferPool *self = GST_CLAPPER_GDK_BUFFER_POOL_CAST (object);
gst_clear_object (&self->allocator);
GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
}
static void
gst_clapper_gdk_buffer_pool_class_init (GstClapperGdkBufferPoolClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
GstBufferPoolClass *bufferpool_class = (GstBufferPoolClass *) klass;
gobject_class->dispose = gst_clapper_gdk_buffer_pool_dispose;
bufferpool_class->get_options = gst_clapper_gdk_buffer_pool_get_options;
bufferpool_class->set_config = gst_clapper_gdk_buffer_pool_set_config;
bufferpool_class->alloc_buffer = gst_clapper_gdk_buffer_pool_alloc;
bufferpool_class->reset_buffer = gst_clapper_gdk_buffer_reset_buffer;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clappergdkbufferpool", 0,
"Clapper Gdk Buffer Pool");
}
GstBufferPool *
gst_clapper_gdk_buffer_pool_new (void)
{
GstClapperGdkBufferPool *self;
self = g_object_new (GST_TYPE_CLAPPER_GDK_BUFFER_POOL, NULL);
gst_object_ref_sink (self);
return GST_BUFFER_POOL_CAST (self);
}

View File

@@ -19,24 +19,26 @@
#pragma once
#include "gstclapperglbaseimporter.h"
#include <gst/gstbufferpool.h>
#include <gst/video/video.h>
#include "gstclappergdkmemory.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, GstClapperGLBaseImporter)
#define GST_TYPE_CLAPPER_GDK_BUFFER_POOL (gst_clapper_gdk_buffer_pool_get_type())
G_DECLARE_FINAL_TYPE (GstClapperGdkBufferPool, gst_clapper_gdk_buffer_pool, GST, CLAPPER_GDK_BUFFER_POOL, GstBufferPool)
#define GST_CLAPPER_GL_UPLOADER_CAST(obj) ((GstClapperGLUploader *)(obj))
#define GST_CLAPPER_GDK_BUFFER_POOL_CAST(obj) ((GstClapperGdkBufferPool *)(obj))
struct _GstClapperGLUploader
struct _GstClapperGdkBufferPool
{
GstClapperGLBaseImporter parent;
GstBufferPool parent;
GstGLUpload *upload;
GstGLColorConvert *color_convert;
GstVideoInfo pending_v_info, v_info;
gboolean has_pending_v_info;
GstClapperGdkAllocator *allocator;
GstVideoInfo info;
};
GstBufferPool * gst_clapper_gdk_buffer_pool_new (void);
G_END_DECLS

141
lib/gst/plugin/gstclappergdkmemory.c vendored Normal file
View File

@@ -0,0 +1,141 @@
/*
* 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 "gstclappergdkmemory.h"
#include "gstgtkutils.h"
#define GST_CAT_DEFAULT gst_clapper_gdk_allocator_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
static GstAllocator *_gst_clapper_gdk_allocator = NULL;
#define parent_class gst_clapper_gdk_allocator_parent_class
G_DEFINE_TYPE (GstClapperGdkAllocator, gst_clapper_gdk_allocator, GST_TYPE_ALLOCATOR);
static void
gst_clapper_gdk_allocator_free (GstAllocator *self, GstMemory *memory)
{
GstClapperGdkMemory *mem = GST_CLAPPER_GDK_MEMORY_CAST (memory);
GST_TRACE_OBJECT (self, "Freeing ClapperGdkMemory: %" GST_PTR_FORMAT, mem);
g_clear_object (&mem->texture);
g_free (mem);
}
static gpointer
gst_clapper_gdk_mem_map_full (GstMemory *memory, GstMapInfo *info, gsize maxsize)
{
GstClapperGdkMemory *mem = GST_CLAPPER_GDK_MEMORY_CAST (memory);
return &mem->texture;
}
static void
gst_clapper_gdk_mem_unmap_full (GstMemory *memory, GstMapInfo *info)
{
/* NOOP */
}
static GstMemory *
gst_clapper_gdk_mem_copy (GstMemory *memory, gssize offset, gssize size)
{
return NULL;
}
static GstMemory *
gst_clapper_gdk_mem_share (GstMemory *memory, gssize offset, gssize size)
{
return NULL;
}
static gboolean
gst_clapper_gdk_mem_is_span (GstMemory *mem1, GstMemory *mem2, gsize *offset)
{
return FALSE;
}
static void
gst_clapper_gdk_allocator_init (GstClapperGdkAllocator *self)
{
GstAllocator *alloc = GST_ALLOCATOR_CAST (self);
alloc->mem_type = GST_CLAPPER_GDK_MEMORY_TYPE_NAME;
alloc->mem_map_full = gst_clapper_gdk_mem_map_full;
alloc->mem_unmap_full = gst_clapper_gdk_mem_unmap_full;
alloc->mem_copy = gst_clapper_gdk_mem_copy;
alloc->mem_share = gst_clapper_gdk_mem_share;
alloc->mem_is_span = gst_clapper_gdk_mem_is_span;
GST_OBJECT_FLAG_SET (self, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC);
}
static void
gst_clapper_gdk_allocator_class_init (GstClapperGdkAllocatorClass *klass)
{
GstAllocatorClass *allocator_class = (GstAllocatorClass *) klass;
allocator_class->alloc = NULL;
allocator_class->free = GST_DEBUG_FUNCPTR (gst_clapper_gdk_allocator_free);
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clappergdkallocator", 0,
"Clapper Gdk Allocator");
}
void
gst_clapper_gdk_memory_init_once (void)
{
static gsize _alloc_init = 0;
if (g_once_init_enter (&_alloc_init)) {
_gst_clapper_gdk_allocator = GST_ALLOCATOR_CAST (
g_object_new (GST_TYPE_CLAPPER_GDK_ALLOCATOR, NULL));
gst_object_ref_sink (_gst_clapper_gdk_allocator);
gst_allocator_register (GST_CLAPPER_GDK_MEMORY_TYPE_NAME, _gst_clapper_gdk_allocator);
g_once_init_leave (&_alloc_init, 1);
}
}
gboolean
gst_is_clapper_gdk_memory (GstMemory *memory)
{
return (memory != NULL && memory->allocator != NULL
&& GST_IS_CLAPPER_GDK_ALLOCATOR (memory->allocator));
}
GstMemory *
gst_clapper_gdk_allocator_alloc (GstClapperGdkAllocator *self, const GstVideoInfo *info)
{
GstClapperGdkMemory *mem;
mem = g_new0 (GstClapperGdkMemory, 1);
mem->info = *info;
gst_memory_init (GST_MEMORY_CAST (mem), 0, GST_ALLOCATOR_CAST (self),
NULL, GST_VIDEO_INFO_SIZE (info), 0, 0, GST_VIDEO_INFO_SIZE (info));
GST_TRACE_OBJECT (self, "Allocated new ClapperGdkMemory: %" GST_PTR_FORMAT, mem);
return GST_MEMORY_CAST (mem);
}

67
lib/gst/plugin/gstclappergdkmemory.h vendored Normal file
View File

@@ -0,0 +1,67 @@
/*
* 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 <gtk/gtk.h>
#include <gst/gstmemory.h>
#include <gst/gstallocator.h>
#include <gst/video/video.h>
G_BEGIN_DECLS
#define GST_TYPE_CLAPPER_GDK_ALLOCATOR (gst_clapper_gdk_allocator_get_type())
G_DECLARE_FINAL_TYPE (GstClapperGdkAllocator, gst_clapper_gdk_allocator, GST, CLAPPER_GDK_ALLOCATOR, GstAllocator)
#define GST_CLAPPER_GDK_ALLOCATOR_CAST(obj) ((GstClapperGdkAllocator *)(obj))
#define GST_CLAPPER_GDK_MEMORY_CAST(mem) ((GstClapperGdkMemory *)(mem))
#define GST_CLAPPER_GDK_MEMORY_TYPE_NAME "gst.clapper.gdk.memory"
#define GST_CAPS_FEATURE_CLAPPER_GDK_MEMORY "memory:ClapperGdkMemory"
#define GST_CLAPPER_GDK_MEMORY_FORMATS \
"RGBA64_LE, RGBA64_BE, ABGR, BGRA, " \
"ARGB, RGBA, BGRx, RGBx, BGR, RGB" \
/* Formats that `GdkGLTexture` supports */
#define GST_CLAPPER_GDK_GL_TEXTURE_FORMATS \
"RGBA64_LE, RGBA64_BE, RGBA, RGBx, RGB" \
typedef struct _GstClapperGdkMemory GstClapperGdkMemory;
struct _GstClapperGdkMemory
{
GstMemory mem;
GdkTexture *texture;
GstVideoInfo info;
};
struct _GstClapperGdkAllocator
{
GstAllocator parent;
};
void gst_clapper_gdk_memory_init_once (void);
gboolean gst_is_clapper_gdk_memory (GstMemory *memory);
GstMemory * gst_clapper_gdk_allocator_alloc (GstClapperGdkAllocator *allocator, const GstVideoInfo *info);
G_END_DECLS

414
lib/gst/plugin/gstclapperglbaseimport.c vendored Normal file
View File

@@ -0,0 +1,414 @@
/*
* 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 <gtk/gtk.h>
#include <gst/gl/gstglfuncs.h>
#include "gstclapperglbaseimport.h"
#include "gstgtkutils.h"
#if GST_CLAPPER_GL_HAVE_WAYLAND
#include <gdk/wayland/gdkwayland.h>
#include <gst/gl/wayland/gstgldisplay_wayland.h>
#endif
#if GST_CLAPPER_GL_HAVE_X11
#include <gdk/x11/gdkx.h>
#endif
#if GST_CLAPPER_GL_HAVE_X11_GLX
#include <gst/gl/x11/gstgldisplay_x11.h>
#endif
#if GST_CLAPPER_GL_HAVE_X11_EGL
#include <gst/gl/egl/gstgldisplay_egl.h>
#endif
#define GST_CAT_DEFAULT gst_clapper_gl_base_import_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
#define parent_class gst_clapper_gl_base_import_parent_class
G_DEFINE_TYPE (GstClapperGLBaseImport, gst_clapper_gl_base_import, GST_TYPE_CLAPPER_BASE_IMPORT);
static void
gst_clapper_gl_base_import_init (GstClapperGLBaseImport *self)
{
g_mutex_init (&self->lock);
}
static void
gst_clapper_gl_base_import_finalize (GObject *object)
{
GstClapperGLBaseImport *self = GST_CLAPPER_GL_BASE_IMPORT_CAST (object);
g_clear_object (&self->gdk_context);
gst_clear_object (&self->gst_context);
gst_clear_object (&self->wrapped_context);
gst_clear_object (&self->gst_display);
g_mutex_clear (&self->lock);
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (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
retrieve_gl_context_on_main (GstClapperGLBaseImport *self)
{
GstClapperGLBaseImportClass *gl_bi_class = GST_CLAPPER_GL_BASE_IMPORT_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;
}
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_CLAPPER_GL_BASE_IMPORT_LOCK (self);
self->gdk_context = gdk_context;
#if GST_CLAPPER_GL_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_HAVE_X11
if (GDK_IS_X11_DISPLAY (gdk_display)) {
gpointer display_ptr;
#if GST_CLAPPER_GL_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_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_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_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_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_CLAPPER_GL_BASE_IMPORT_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_CLAPPER_GL_BASE_IMPORT_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_CLAPPER_GL_BASE_IMPORT_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_CLAPPER_GL_BASE_IMPORT_UNLOCK (self);
return TRUE;
}
static gboolean
ensure_gl_context (GstClapperGLBaseImport *self)
{
GstGLDisplay *gst_display = NULL;
GstGLContext *gst_context = NULL;
GError *error = NULL;
gboolean has_gdk_contexts;
GST_CLAPPER_GL_BASE_IMPORT_LOCK (self);
has_gdk_contexts = (self->gdk_context && self->wrapped_context);
GST_CLAPPER_GL_BASE_IMPORT_UNLOCK (self);
if (!has_gdk_contexts) {
if (!(! !gst_gtk_invoke_on_main (
(GThreadFunc) (GCallback) retrieve_gl_context_on_main, self))) {
GST_ERROR_OBJECT (self, "Could not retrieve Gdk GL context");
return FALSE;
}
}
GST_CLAPPER_GL_BASE_IMPORT_LOCK (self);
gst_display = gst_object_ref (self->gst_display);
/* GstGLDisplay operations require 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_CLAPPER_GL_BASE_IMPORT_UNLOCK (self);
return FALSE;
}
}
gst_context = gst_object_ref (self->gst_context);
GST_CLAPPER_GL_BASE_IMPORT_UNLOCK (self);
/* Calls `set_context` internally, so we cannot be locked here */
gst_gl_display_add_context (gst_display, gst_context);
gst_gl_element_propagate_display_context (GST_ELEMENT_CAST (self), gst_display);
GST_OBJECT_UNLOCK (gst_display);
gst_object_unref (gst_display);
gst_object_unref (gst_context);
return TRUE;
}
static void
gst_clapper_gl_base_import_set_context (GstElement *element, GstContext *context)
{
GstClapperGLBaseImport *self = GST_CLAPPER_GL_BASE_IMPORT_CAST (element);
GST_DEBUG_OBJECT (self, "Set context");
GST_CLAPPER_GL_BASE_IMPORT_LOCK (self);
gst_gl_handle_set_context (element, context, &self->gst_display,
&self->wrapped_context);
GST_CLAPPER_GL_BASE_IMPORT_UNLOCK (self);
GST_ELEMENT_CLASS (parent_class)->set_context (element, context);
}
static GstStateChangeReturn
gst_clapper_gl_base_import_change_state (GstElement *element, GstStateChange transition)
{
GstClapperGLBaseImport *self = GST_CLAPPER_GL_BASE_IMPORT_CAST (element);
GstStateChangeReturn ret;
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
if (ret == GST_STATE_CHANGE_FAILURE)
return ret;
switch (transition) {
case GST_STATE_CHANGE_NULL_TO_READY:
if (!ensure_gl_context (self))
return GST_STATE_CHANGE_FAILURE;
break;
default:
break;
}
return ret;
}
static gboolean
gst_clapper_gl_base_import_query (GstBaseTransform *bt,
GstPadDirection direction, GstQuery *query)
{
GstClapperGLBaseImport *self = GST_CLAPPER_GL_BASE_IMPORT_CAST (bt);
gboolean res;
switch (GST_QUERY_TYPE (query)) {
case GST_QUERY_CONTEXT:
GST_CLAPPER_GL_BASE_IMPORT_LOCK (self);
res = gst_gl_handle_context_query (GST_ELEMENT_CAST (self), query,
self->gst_display, self->gst_context, self->wrapped_context);
GST_CLAPPER_GL_BASE_IMPORT_UNLOCK (self);
break;
default:
res = GST_BASE_TRANSFORM_CLASS (parent_class)->query (bt, direction, query);
break;
}
return res;
}
static gboolean
gst_clapper_gl_base_import_gdk_context_realize (GstClapperGLBaseImport *self, GdkGLContext *gdk_context)
{
GError *error = NULL;
gboolean success;
GST_DEBUG_OBJECT (self, "Realizing GdkGLContext with default implementation");
gdk_gl_context_set_allowed_apis (gdk_context, GDK_GL_API_GLES);
if (!(success = gdk_gl_context_realize (gdk_context, &error))) {
GST_WARNING_OBJECT (self, "Could not realize Gdk context with GLES: %s", error->message);
g_clear_error (&error);
}
if (!success) {
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_import_class_init (GstClapperGLBaseImportClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
GstElementClass *gstelement_class = (GstElementClass *) klass;
GstBaseTransformClass *gstbasetransform_class = (GstBaseTransformClass *) klass;
GstClapperGLBaseImportClass *gl_bi_class = (GstClapperGLBaseImportClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperglbaseimport", 0,
"Clapper GL Base Import");
gobject_class->finalize = gst_clapper_gl_base_import_finalize;
gstelement_class->set_context = gst_clapper_gl_base_import_set_context;
gstelement_class->change_state = gst_clapper_gl_base_import_change_state;
gstbasetransform_class->query = gst_clapper_gl_base_import_query;
gl_bi_class->gdk_context_realize = gst_clapper_gl_base_import_gdk_context_realize;
}

75
lib/gst/plugin/gstclapperglbaseimport.h vendored Normal file
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 <gtk/gtk.h>
#include "gstclapperbaseimport.h"
G_BEGIN_DECLS
#define GST_TYPE_CLAPPER_GL_BASE_IMPORT (gst_clapper_gl_base_import_get_type())
#define GST_IS_CLAPPER_GL_BASE_IMPORT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_CLAPPER_GL_BASE_IMPORT))
#define GST_IS_CLAPPER_GL_BASE_IMPORT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_CLAPPER_GL_BASE_IMPORT))
#define GST_CLAPPER_GL_BASE_IMPORT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_CLAPPER_GL_BASE_IMPORT, GstClapperGLBaseImportClass))
#define GST_CLAPPER_GL_BASE_IMPORT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_CLAPPER_GL_BASE_IMPORT, GstClapperGLBaseImport))
#define GST_CLAPPER_GL_BASE_IMPORT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_CLAPPER_GL_BASE_IMPORT, GstClapperGLBaseImportClass))
#define GST_CLAPPER_GL_BASE_IMPORT_CAST(obj) ((GstClapperGLBaseImport *)(obj))
#define GST_CLAPPER_GL_BASE_IMPORT_GET_LOCK(obj) (&GST_CLAPPER_GL_BASE_IMPORT_CAST(obj)->lock)
#define GST_CLAPPER_GL_BASE_IMPORT_LOCK(obj) g_mutex_lock (GST_CLAPPER_GL_BASE_IMPORT_GET_LOCK(obj))
#define GST_CLAPPER_GL_BASE_IMPORT_UNLOCK(obj) g_mutex_unlock (GST_CLAPPER_GL_BASE_IMPORT_GET_LOCK(obj))
#define GST_CLAPPER_GL_HAVE_WAYLAND (GST_GL_HAVE_WINDOW_WAYLAND && defined (GDK_WINDOWING_WAYLAND))
#define GST_CLAPPER_GL_HAVE_X11 (GST_GL_HAVE_WINDOW_X11 && defined (GDK_WINDOWING_X11))
#define GST_CLAPPER_GL_HAVE_X11_GLX (GST_CLAPPER_GL_HAVE_X11 && GST_GL_HAVE_PLATFORM_GLX)
#define GST_CLAPPER_GL_HAVE_X11_EGL (GST_CLAPPER_GL_HAVE_X11 && GST_GL_HAVE_PLATFORM_EGL)
typedef struct _GstClapperGLBaseImport GstClapperGLBaseImport;
typedef struct _GstClapperGLBaseImportClass GstClapperGLBaseImportClass;
#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GstClapperGLBaseImport, gst_object_unref)
#endif
struct _GstClapperGLBaseImport
{
GstClapperBaseImport parent;
GMutex lock;
GdkGLContext *gdk_context;
GstGLContext *gst_context;
GstGLContext *wrapped_context;
GstGLDisplay *gst_display;
};
struct _GstClapperGLBaseImportClass
{
GstClapperBaseImportClass parent_class;
gboolean (* gdk_context_realize) (GstClapperGLBaseImport *gl_bi,
GdkGLContext *gdk_context);
};
GType gst_clapper_gl_base_import_get_type (void);
G_END_DECLS

178
lib/gst/plugin/gstclapperglimport.c vendored Normal file
View File

@@ -0,0 +1,178 @@
/*
* 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 "gstclapperglimport.h"
#include "gstclappergdkmemory.h"
#define GST_CAT_DEFAULT gst_clapper_gl_import_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
static GstStaticPadTemplate gst_clapper_gl_import_sink_template =
GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
GST_STATIC_CAPS (
GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
"{ " GST_CLAPPER_GDK_GL_TEXTURE_FORMATS " }") ", "
"texture-target = (string) { " GST_GL_TEXTURE_TARGET_2D_STR " }"
"; "
GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_GL_MEMORY ", "
GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION,
"{ " GST_CLAPPER_GDK_GL_TEXTURE_FORMATS " }") ", "
"texture-target = (string) { " GST_GL_TEXTURE_TARGET_2D_STR " }"));
static GstStaticPadTemplate gst_clapper_gl_import_src_template =
GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
GST_STATIC_CAPS (
GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_CLAPPER_GDK_MEMORY,
"{ " GST_CLAPPER_GDK_GL_TEXTURE_FORMATS " }")
"; "
GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_CLAPPER_GDK_MEMORY ", "
GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION,
"{ " GST_CLAPPER_GDK_GL_TEXTURE_FORMATS " }")));
#define parent_class gst_clapper_gl_import_parent_class
G_DEFINE_TYPE (GstClapperGLImport, gst_clapper_gl_import, GST_TYPE_CLAPPER_GL_BASE_IMPORT);
GST_ELEMENT_REGISTER_DEFINE (clapperglimport, "clapperglimport", GST_RANK_NONE,
GST_TYPE_CLAPPER_GL_IMPORT);
static GstBufferPool *
gst_clapper_gl_import_create_upstream_pool (GstClapperBaseImport *bi, GstStructure **config)
{
GstClapperGLBaseImport *gl_bi = GST_CLAPPER_GL_BASE_IMPORT_CAST (bi);
GstBufferPool *pool;
GstGLContext *context;
GST_DEBUG_OBJECT (bi, "Creating new pool");
GST_CLAPPER_GL_BASE_IMPORT_LOCK (gl_bi);
context = gst_object_ref (gl_bi->gst_context);
GST_CLAPPER_GL_BASE_IMPORT_UNLOCK (gl_bi);
pool = gst_gl_buffer_pool_new (context);
gst_object_unref (context);
*config = gst_buffer_pool_get_config (pool);
gst_buffer_pool_config_add_option (*config, GST_BUFFER_POOL_OPTION_GL_SYNC_META);
return pool;
}
static void
video_frame_unmap_and_free (GstVideoFrame *frame)
{
gst_video_frame_unmap (frame);
g_slice_free (GstVideoFrame, frame);
}
static GstFlowReturn
gst_clapper_gl_import_transform (GstBaseTransform *bt,
GstBuffer *in_buf, GstBuffer *out_buf)
{
GstClapperGLBaseImport *gl_bi = GST_CLAPPER_GL_BASE_IMPORT_CAST (bt);
GstClapperBaseImport *bi = GST_CLAPPER_BASE_IMPORT_CAST (bt);
GstVideoFrame *frame;
GstMapInfo info;
GstMemory *memory;
GstClapperGdkMemory *clapper_memory;
GstGLSyncMeta *sync_meta;
frame = g_slice_new (GstVideoFrame);
if (!gst_clapper_base_import_map_buffers (bi, in_buf, out_buf,
GST_MAP_READ | GST_MAP_GL, GST_MAP_WRITE, frame, &info, &memory)) {
g_slice_free (GstVideoFrame, frame);
return GST_FLOW_ERROR;
}
clapper_memory = GST_CLAPPER_GDK_MEMORY_CAST (memory);
GST_CLAPPER_GL_BASE_IMPORT_LOCK (gl_bi);
/* Must have context active here for both sync meta
* and Gdk texture format auto-detection to work */
gdk_gl_context_make_current (gl_bi->gdk_context);
gst_gl_context_activate (gl_bi->wrapped_context, TRUE);
sync_meta = gst_buffer_get_gl_sync_meta (in_buf);
/* 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, gl_bi->gst_context);
gst_gl_sync_meta_wait (sync_meta, gl_bi->wrapped_context);
}
/* Keep input data alive as long as necessary,
* unmap only after texture is destroyed */
clapper_memory->texture = gdk_gl_texture_new (
gl_bi->gdk_context,
*(guint *) GST_VIDEO_FRAME_PLANE_DATA (frame, 0),
GST_VIDEO_FRAME_WIDTH (frame),
GST_VIDEO_FRAME_HEIGHT (frame),
(GDestroyNotify) video_frame_unmap_and_free,
frame);
gst_gl_context_activate (gl_bi->wrapped_context, FALSE);
gdk_gl_context_clear_current ();
GST_CLAPPER_GL_BASE_IMPORT_UNLOCK (gl_bi);
gst_memory_unmap (memory, &info);
return GST_FLOW_OK;
}
static void
gst_clapper_gl_import_init (GstClapperGLImport *self)
{
}
static void
gst_clapper_gl_import_class_init (GstClapperGLImportClass *klass)
{
GstElementClass *gstelement_class = (GstElementClass *) klass;
GstBaseTransformClass *gstbasetransform_class = (GstBaseTransformClass *) klass;
GstClapperBaseImportClass *bi_class = (GstClapperBaseImportClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperglimport", 0,
"Clapper GL Import");
gstbasetransform_class->transform = gst_clapper_gl_import_transform;
bi_class->create_upstream_pool = gst_clapper_gl_import_create_upstream_pool;
gst_element_class_set_metadata (gstelement_class,
"Clapper GL import",
"Filter/Video", "Imports GL memory into ClapperGdkMemory",
"Rafał Dzięgiel <rafostar.github@gmail.com>");
gst_element_class_add_static_pad_template (gstelement_class,
&gst_clapper_gl_import_sink_template);
gst_element_class_add_static_pad_template (gstelement_class,
&gst_clapper_gl_import_src_template);
}

View File

@@ -19,18 +19,20 @@
#pragma once
#include "gst/plugin/gstclapperimporter.h"
#include "gstclapperglbaseimport.h"
G_BEGIN_DECLS
#define GST_TYPE_CLAPPER_RAW_IMPORTER (gst_clapper_raw_importer_get_type())
G_DECLARE_FINAL_TYPE (GstClapperRawImporter, gst_clapper_raw_importer, GST, CLAPPER_RAW_IMPORTER, GstClapperImporter)
#define GST_TYPE_CLAPPER_GL_IMPORT (gst_clapper_gl_import_get_type())
G_DECLARE_FINAL_TYPE (GstClapperGLImport, gst_clapper_gl_import, GST, CLAPPER_GL_IMPORT, GstClapperGLBaseImport)
#define GST_CLAPPER_RAW_IMPORTER_CAST(obj) ((GstClapperRawImporter *)(obj))
#define GST_CLAPPER_GL_IMPORT_CAST(obj) ((GstClapperGLImport *)(obj))
struct _GstClapperRawImporter
struct _GstClapperGLImport
{
GstClapperImporter parent;
GstClapperGLBaseImport parent;
};
GST_ELEMENT_REGISTER_DECLARE (clapperglimport);
G_END_DECLS

128
lib/gst/plugin/gstclapperimport.c vendored Normal file
View File

@@ -0,0 +1,128 @@
/*
* 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 "gstclapperimport.h"
#include "gstclappergdkmemory.h"
#include "gstgtkutils.h"
#define GST_CAT_DEFAULT gst_clapper_import_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
static GstStaticPadTemplate gst_clapper_import_sink_template =
GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
GST_STATIC_CAPS (
GST_VIDEO_CAPS_MAKE ("{ " GST_CLAPPER_GDK_MEMORY_FORMATS " }")));
static GstStaticPadTemplate gst_clapper_import_src_template =
GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
GST_STATIC_CAPS (
GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_CLAPPER_GDK_MEMORY,
"{ " GST_CLAPPER_GDK_MEMORY_FORMATS " }")));
#define parent_class gst_clapper_import_parent_class
G_DEFINE_TYPE (GstClapperImport, gst_clapper_import, GST_TYPE_CLAPPER_BASE_IMPORT);
GST_ELEMENT_REGISTER_DEFINE (clapperimport, "clapperimport", GST_RANK_NONE,
GST_TYPE_CLAPPER_IMPORT);
static GstBufferPool *
gst_clapper_import_create_upstream_pool (GstClapperBaseImport *bi, GstStructure **config)
{
GstClapperImport *self = GST_CLAPPER_IMPORT_CAST (bi);
GstBufferPool *pool;
GST_DEBUG_OBJECT (self, "Creating new upstream pool");
pool = gst_video_buffer_pool_new ();
*config = gst_buffer_pool_get_config (pool);
return pool;
}
static void
video_frame_unmap_and_free (GstVideoFrame *frame)
{
gst_video_frame_unmap (frame);
g_slice_free (GstVideoFrame, frame);
}
static GstFlowReturn
gst_clapper_import_transform (GstBaseTransform *bt,
GstBuffer *in_buf, GstBuffer *out_buf)
{
GstClapperBaseImport *bi = GST_CLAPPER_BASE_IMPORT_CAST (bt);
GstVideoFrame *frame;
GstMapInfo info;
GstMemory *memory;
frame = g_slice_new (GstVideoFrame);
if (!gst_clapper_base_import_map_buffers (bi, in_buf, out_buf,
GST_MAP_READ, GST_MAP_WRITE, frame, &info, &memory)) {
g_slice_free (GstVideoFrame, frame);
return GST_FLOW_ERROR;
}
/* Keep frame data alive as long as necessary,
* unmap only after bytes are destroyed */
GST_CLAPPER_GDK_MEMORY_CAST (memory)->texture = gst_video_frame_into_gdk_texture (
frame, (GDestroyNotify) video_frame_unmap_and_free);
gst_memory_unmap (memory, &info);
return GST_FLOW_OK;
}
static void
gst_clapper_import_init (GstClapperImport *self)
{
}
static void
gst_clapper_import_class_init (GstClapperImportClass *klass)
{
GstElementClass *gstelement_class = (GstElementClass *) klass;
GstBaseTransformClass *gstbasetransform_class = (GstBaseTransformClass *) klass;
GstClapperBaseImportClass *bi_class = (GstClapperBaseImportClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperimport", 0,
"Clapper Import");
gstbasetransform_class->transform = gst_clapper_import_transform;
bi_class->create_upstream_pool = gst_clapper_import_create_upstream_pool;
gst_element_class_set_metadata (gstelement_class,
"Clapper import",
"Filter/Video", "Imports RAW video data into ClapperGdkMemory",
"Rafał Dzięgiel <rafostar.github@gmail.com>");
gst_element_class_add_static_pad_template (gstelement_class,
&gst_clapper_import_sink_template);
gst_element_class_add_static_pad_template (gstelement_class,
&gst_clapper_import_src_template);
}

View File

@@ -19,18 +19,20 @@
#pragma once
#include "gstclapperglbaseimporter.h"
#include "gstclapperbaseimport.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, GstClapperGLBaseImporter)
#define GST_TYPE_CLAPPER_IMPORT (gst_clapper_import_get_type())
G_DECLARE_FINAL_TYPE (GstClapperImport, gst_clapper_import, GST, CLAPPER_IMPORT, GstClapperBaseImport)
#define GST_CLAPPER_GL_IMPORTER_CAST(obj) ((GstClapperGLImporter *)(obj))
#define GST_CLAPPER_IMPORT_CAST(obj) ((GstClapperImport *)(obj))
struct _GstClapperGLImporter
struct _GstClapperImport
{
GstClapperGLBaseImporter parent;
GstClapperBaseImport parent;
};
GST_ELEMENT_REGISTER_DECLARE (clapperimport);
G_END_DECLS

View File

@@ -1,455 +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 "gstclapperimporter.h"
#include "gstgtkutils.h"
#define GST_CAT_DEFAULT gst_clapper_importer_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
#define parent_class gst_clapper_importer_parent_class
G_DEFINE_TYPE (GstClapperImporter, gst_clapper_importer, GST_TYPE_OBJECT);
typedef struct
{
GdkTexture *texture;
GstVideoOverlayRectangle *rectangle;
gint x, y;
guint width, height;
gint index;
gatomicrefcount ref_count;
} GstClapperGdkOverlay;
static GstClapperGdkOverlay *
gst_clapper_gdk_overlay_new (GdkTexture *texture, GstVideoOverlayRectangle *rectangle,
gint x, gint y, guint width, guint height, guint index)
{
GstClapperGdkOverlay *overlay = g_slice_new (GstClapperGdkOverlay);
overlay->texture = g_object_ref (texture);
overlay->rectangle = gst_video_overlay_rectangle_ref (rectangle);
overlay->x = x;
overlay->y = y;
overlay->width = width;
overlay->height = height;
overlay->index = index;
g_atomic_ref_count_init (&overlay->ref_count);
return overlay;
}
static GstClapperGdkOverlay *
gst_clapper_gdk_overlay_ref (GstClapperGdkOverlay *overlay)
{
g_atomic_ref_count_inc (&overlay->ref_count);
return overlay;
}
static void
gst_clapper_gdk_overlay_unref (GstClapperGdkOverlay *overlay)
{
if (g_atomic_ref_count_dec (&overlay->ref_count)) {
GST_TRACE ("Freeing overlay: %" GST_PTR_FORMAT, overlay);
g_object_unref (overlay->texture);
gst_video_overlay_rectangle_unref (overlay->rectangle);
g_slice_free (GstClapperGdkOverlay, overlay);
}
}
static GstBufferPool *
_default_create_pool (GstClapperImporter *self, GstStructure **config)
{
GST_FIXME_OBJECT (self, "Need to create buffer pool");
return NULL;
}
static GdkTexture *
_default_generate_texture (GstClapperImporter *self,
GstBuffer *buffer, GstVideoInfo *v_info)
{
GST_FIXME_OBJECT (self, "GdkTexture generation not implemented");
return NULL;
}
static void
gst_clapper_importer_init (GstClapperImporter *self)
{
gst_video_info_init (&self->pending_v_info);
gst_video_info_init (&self->v_info);
self->pending_overlays = g_ptr_array_new_with_free_func (
(GDestroyNotify) gst_clapper_gdk_overlay_unref);
self->overlays = g_ptr_array_new_with_free_func (
(GDestroyNotify) gst_clapper_gdk_overlay_unref);
gdk_rgba_parse (&self->bg, "black");
}
static void
gst_clapper_importer_finalize (GObject *object)
{
GstClapperImporter *self = GST_CLAPPER_IMPORTER_CAST (object);
GST_TRACE ("Finalize");
gst_clear_caps (&self->pending_caps);
gst_clear_buffer (&self->pending_buffer);
gst_clear_buffer (&self->buffer);
g_ptr_array_unref (self->pending_overlays);
g_ptr_array_unref (self->overlays);
g_clear_object (&self->texture);
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
}
static void
gst_clapper_importer_class_init (GstClapperImporterClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
GstClapperImporterClass *importer_class = (GstClapperImporterClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperimporter", 0,
"Clapper Importer");
gobject_class->finalize = gst_clapper_importer_finalize;
importer_class->create_pool = _default_create_pool;
importer_class->generate_texture = _default_generate_texture;
}
static GstClapperGdkOverlay *
_get_cached_overlay (GPtrArray *overlays, GstVideoOverlayRectangle *rectangle)
{
guint i;
for (i = 0; i < overlays->len; i++) {
GstClapperGdkOverlay *overlay = g_ptr_array_index (overlays, i);
if (overlay->rectangle == rectangle)
return overlay;
}
return NULL;
}
static gint
_sort_overlays_cb (gconstpointer a, gconstpointer b)
{
GstClapperGdkOverlay *overlay_a, *overlay_b;
overlay_a = *((GstClapperGdkOverlay **) a);
overlay_b = *((GstClapperGdkOverlay **) b);
return (overlay_a->index - overlay_b->index);
}
/*
* Prepares overlays to show with the next rendered buffer.
*
* In order for overlays caching to work correctly, this should be called for
* every received buffer (even if its going to be disgarded), also must be
* called together with pending buffer replacement within a single importer
* locking, to make sure prepared overlays always match the pending buffer.
*/
static void
gst_clapper_importer_prepare_overlays_locked (GstClapperImporter *self)
{
GstVideoOverlayCompositionMeta *comp_meta;
guint num_overlays, i;
if (G_UNLIKELY (!self->pending_buffer)
|| !(comp_meta = gst_buffer_get_video_overlay_composition_meta (self->pending_buffer))) {
guint n_pending = self->pending_overlays->len;
/* Remove all cached overlays if new buffer does not have any */
if (n_pending > 0) {
GST_TRACE ("No overlays in buffer, removing all cached ones");
g_ptr_array_remove_range (self->pending_overlays, 0, n_pending);
}
return;
}
GST_LOG_OBJECT (self, "Preparing overlays...");
/* Mark all old overlays as unused by giving them negative index */
for (i = 0; i < self->pending_overlays->len; i++) {
GstClapperGdkOverlay *overlay = g_ptr_array_index (self->pending_overlays, i);
overlay->index = -1;
}
num_overlays = gst_video_overlay_composition_n_rectangles (comp_meta->overlay);
for (i = 0; i < num_overlays; i++) {
GdkTexture *texture;
GstBuffer *comp_buffer;
GstVideoFrame comp_frame;
GstVideoMeta *v_meta;
GstVideoInfo v_info;
GstVideoOverlayRectangle *rectangle;
GstClapperGdkOverlay *overlay;
GstVideoOverlayFormatFlags flags, alpha_flags = 0;
gint comp_x, comp_y;
guint comp_width, comp_height;
rectangle = gst_video_overlay_composition_get_rectangle (comp_meta->overlay, i);
if ((overlay = _get_cached_overlay (self->pending_overlays, rectangle))) {
overlay->index = i;
GST_TRACE ("Reusing cached overlay: %" GST_PTR_FORMAT, overlay);
continue;
}
if (G_UNLIKELY (!gst_video_overlay_rectangle_get_render_rectangle (rectangle,
&comp_x, &comp_y, &comp_width, &comp_height))) {
GST_WARNING ("Invalid overlay rectangle dimensions: %" GST_PTR_FORMAT, rectangle);
continue;
}
flags = gst_video_overlay_rectangle_get_flags (rectangle);
if (flags & GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA)
alpha_flags |= GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA;
comp_buffer = gst_video_overlay_rectangle_get_pixels_unscaled_argb (rectangle, alpha_flags);
/* Update overlay video info from video meta */
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)))
return;
if ((texture = gst_video_frame_into_gdk_texture (&comp_frame))) {
overlay = gst_clapper_gdk_overlay_new (texture, rectangle, comp_x, comp_y,
comp_width, comp_height, i);
g_object_unref (texture);
GST_TRACE_OBJECT (self, "Created overlay: %"
GST_PTR_FORMAT ", x: %i, y: %i, width: %u, height: %u",
overlay, overlay->x, overlay->y, overlay->width, overlay->height);
g_ptr_array_insert (self->pending_overlays, i, overlay);
}
gst_video_frame_unmap (&comp_frame);
}
/* Remove all overlays that are not going to be used */
for (i = self->pending_overlays->len; i > 0; i--) {
GstClapperGdkOverlay *overlay = g_ptr_array_index (self->pending_overlays, i - 1);
if (overlay->index < 0) {
GST_TRACE ("Removing unused cached overlay: %" GST_PTR_FORMAT, overlay);
g_ptr_array_remove (self->pending_overlays, overlay);
}
}
/* Sort remaining overlays */
if (self->pending_overlays->len > 1) {
GST_LOG_OBJECT (self, "Sorting overlays");
g_ptr_array_sort (self->pending_overlays, (GCompareFunc) _sort_overlays_cb);
}
if (G_UNLIKELY (num_overlays != self->pending_overlays->len)) {
GST_WARNING_OBJECT (self, "Some overlays could not be prepared, %u != %u",
num_overlays, self->pending_overlays->len);
}
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);
GST_OBJECT_UNLOCK (self);
if (importer_class->set_caps)
importer_class->set_caps (self, caps);
}
void
gst_clapper_importer_set_buffer (GstClapperImporter *self, GstBuffer *buffer)
{
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);
GST_OBJECT_UNLOCK (self);
}
GstBufferPool *
gst_clapper_importer_create_pool (GstClapperImporter *self, GstStructure **config)
{
GstClapperImporterClass *importer_class = GST_CLAPPER_IMPORTER_GET_CLASS (self);
return importer_class->create_pool (self, config);
}
void
gst_clapper_importer_add_allocation_metas (GstClapperImporter *self, GstQuery *query)
{
GstClapperImporterClass *importer_class = GST_CLAPPER_IMPORTER_GET_CLASS (self);
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)
{
guint i;
gboolean buffer_changed;
/* Collect all data that we need to snapshot pending buffer,
* lock ourselves to make sure everything matches */
GST_OBJECT_LOCK (self);
if (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);
g_ptr_array_insert (self->overlays, i, gst_clapper_gdk_overlay_ref (overlay));
}
GST_OBJECT_UNLOCK (self);
/* Draw black BG when no buffer or imported format has alpha */
if (!self->buffer || GST_VIDEO_INFO_HAS_ALPHA (&self->v_info))
gtk_snapshot_append_color (snapshot, &self->bg, &GRAPHENE_RECT_INIT (0, 0, width, height));
if (self->buffer) {
if (buffer_changed || !self->texture) {
GstClapperImporterClass *importer_class = GST_CLAPPER_IMPORTER_GET_CLASS (self);
GST_TRACE_OBJECT (self, "Importing %" GST_PTR_FORMAT, self->buffer);
g_clear_object (&self->texture);
self->texture = importer_class->generate_texture (self, self->buffer, &self->v_info);
} else {
GST_TRACE_OBJECT (self, "Reusing texture from %" GST_PTR_FORMAT, self->buffer);
}
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;
/* 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));
}
}
} else {
GST_ERROR_OBJECT (self, "Failed import of %" GST_PTR_FORMAT, self->buffer);
/* Draw black instead of texture on failure if not drawn already */
if (!GST_VIDEO_INFO_HAS_ALPHA (&self->v_info))
gtk_snapshot_append_color (snapshot, &self->bg, &GRAPHENE_RECT_INIT (0, 0, width, height));
}
}
/* Unref all used overlays */
if (self->overlays->len > 0)
g_ptr_array_remove_range (self->overlays, 0, self->overlays->len);
}

View File

@@ -1,104 +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 <gtk/gtk.h>
#include <gst/gst.h>
#include <gst/video/video.h>
G_BEGIN_DECLS
#define GST_TYPE_CLAPPER_IMPORTER (gst_clapper_importer_get_type())
#define GST_IS_CLAPPER_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_CLAPPER_IMPORTER))
#define GST_IS_CLAPPER_IMPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_CLAPPER_IMPORTER))
#define GST_CLAPPER_IMPORTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_CLAPPER_IMPORTER, GstClapperImporterClass))
#define GST_CLAPPER_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_CLAPPER_IMPORTER, GstClapperImporter))
#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 (void); \
G_MODULE_EXPORT GstCaps *make_caps (gboolean is_template, \
GstRank *rank, GStrv *context_types);
typedef struct _GstClapperImporter GstClapperImporter;
typedef struct _GstClapperImporterClass GstClapperImporterClass;
#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GstClapperImporter, gst_object_unref)
#endif
struct _GstClapperImporter
{
GstObject parent;
GstCaps *pending_caps;
GstBuffer *pending_buffer, *buffer;
GPtrArray *pending_overlays, *overlays;
GstVideoInfo pending_v_info, v_info;
gboolean has_pending_v_info;
GdkTexture *texture;
GdkRGBA bg;
};
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);
void (* add_allocation_metas) (GstClapperImporter *importer,
GstQuery *query);
GdkTexture * (* generate_texture) (GstClapperImporter *importer,
GstBuffer *buffer,
GstVideoInfo *v_info);
};
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);
G_END_DECLS

View File

@@ -1,429 +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 <gmodule.h>
#include "gstclapperimporterloader.h"
#include "gstclapperimporter.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) (void);
typedef GstCaps* (* MakeCaps) (gboolean is_template, GstRank *rank, GStrv *context_types);
typedef struct
{
GModule *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);
gst_clear_caps (&data->caps);
g_strfreev (data->context_types);
g_free (data);
}
static GstClapperImporterData *
_obtain_importer_data (GModule *module, gboolean is_template)
{
MakeCaps make_caps;
GstClapperImporterData *data;
if (!g_module_symbol (module, "make_caps", (gpointer *) &make_caps)
|| make_caps == NULL) {
GST_WARNING ("Make caps function missing in importer");
return NULL;
}
data = g_new0 (GstClapperImporterData, 1);
data->module = module;
data->caps = make_caps (is_template, &data->rank, &data->context_types);
GST_TRACE ("Created importer data: %" GST_PTR_FORMAT, data);
if (G_UNLIKELY (!data->caps)) {
GST_ERROR ("Invalid importer without caps: %s",
g_module_name (data->module));
gst_clapper_importer_data_free (data);
return NULL;
}
GST_DEBUG ("Found importer: %s, caps: %" GST_PTR_FORMAT,
g_module_name (data->module), data->caps);
return data;
}
static GstClapperImporter *
_obtain_importer_internal (GModule *module)
{
MakeImporter make_importer;
GstClapperImporter *importer;
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 ();
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;
}
static gint
_sort_importers_cb (gconstpointer a, gconstpointer b)
{
GstClapperImporterData *data_a, *data_b;
data_a = *((GstClapperImporterData **) a);
data_b = *((GstClapperImporterData **) b);
return (data_b->rank - data_a->rank);
}
static GPtrArray *
_obtain_available_importers (gboolean is_template)
{
const GPtrArray *modules;
GPtrArray *importers;
guint i;
GST_DEBUG ("Checking available importers");
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;
if ((data = _obtain_importer_data (module, is_template)))
g_ptr_array_add (importers, data);
}
g_ptr_array_sort (importers, (GCompareFunc) _sort_importers_cb);
GST_DEBUG ("Found %i available importers", importers->len);
return importers;
}
GstClapperImporterLoader *
gst_clapper_importer_loader_new (void)
{
return g_object_new (GST_TYPE_CLAPPER_IMPORTER_LOADER, NULL);
}
static GstCaps *
_make_caps_for_importers (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));
}
return caps;
}
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_available_importers (TRUE);
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);
}
static const GstClapperImporterData *
_get_importer_data_for_caps (const GPtrArray *importers, const GstCaps *caps)
{
guint i;
for (i = 0; i < importers->len; i++) {
GstClapperImporterData *data = g_ptr_array_index (importers, i);
if (!gst_caps_is_always_compatible (caps, data->caps))
continue;
return data;
}
return NULL;
}
static const GstClapperImporterData *
_get_importer_data_for_context_type (const GPtrArray *importers, const gchar *context_type)
{
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;
}
static gboolean
_find_importer_internal (GstClapperImporterLoader *self,
GstCaps *caps, GstQuery *query, GstClapperImporter **importer)
{
const GstClapperImporterData *data = NULL;
GstClapperImporter *found_importer = NULL;
GST_OBJECT_LOCK (self);
if (caps) {
GST_DEBUG_OBJECT (self, "Requested importer for caps: %" GST_PTR_FORMAT, caps);
data = _get_importer_data_for_caps (self->importers, caps);
} else if (query) {
const gchar *context_type;
gst_query_parse_context_type (query, &context_type);
GST_DEBUG_OBJECT (self, "Requested importer for context: %s", context_type);
data = _get_importer_data_for_context_type (self->importers, 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);
if (!data) {
/* In case of missing importer for context query, leave the old one.
* We should allow some queries to go through unresponded */
if (query)
GST_DEBUG_OBJECT (self, "No importer for query, leaving old one");
else
gst_clear_object (importer);
goto finish;
}
if (*importer && (self->last_module == data->module)) {
GST_DEBUG_OBJECT (self, "No importer change");
if (caps)
gst_clapper_importer_set_caps (*importer, caps);
goto finish;
}
found_importer = _obtain_importer_internal (data->module);
if (*importer && found_importer)
gst_clapper_importer_share_data (*importer, found_importer);
gst_clear_object (importer);
if (!found_importer || !gst_clapper_importer_prepare (found_importer)) {
gst_clear_object (&found_importer);
goto finish;
}
if (caps)
gst_clapper_importer_set_caps (found_importer, caps);
*importer = found_importer;
finish:
self->last_module = (*importer && data)
? data->module
: NULL;
GST_OBJECT_UNLOCK (self);
return (*importer != NULL);
}
gboolean
gst_clapper_importer_loader_find_importer_for_caps (GstClapperImporterLoader *self,
GstCaps *caps, GstClapperImporter **importer)
{
return _find_importer_internal (self, caps, NULL, importer);
}
gboolean
gst_clapper_importer_loader_find_importer_for_context_query (GstClapperImporterLoader *self,
GstQuery *query, GstClapperImporter **importer)
{
return _find_importer_internal (self, NULL, query, importer);
}
static void
gst_clapper_importer_loader_init (GstClapperImporterLoader *self)
{
}
static void
gst_clapper_importer_loader_constructed (GObject *object)
{
GstClapperImporterLoader *self = GST_CLAPPER_IMPORTER_LOADER_CAST (object);
self->importers = _obtain_available_importers (FALSE);
GST_CALL_PARENT (G_OBJECT_CLASS, constructed, (object));
}
static void
gst_clapper_importer_loader_finalize (GObject *object)
{
GstClapperImporterLoader *self = GST_CLAPPER_IMPORTER_LOADER_CAST (object);
GST_TRACE ("Finalize");
g_ptr_array_unref (self->importers);
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->constructed = gst_clapper_importer_loader_constructed;
gobject_class->finalize = gst_clapper_importer_loader_finalize;
}

View File

@@ -1,51 +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 "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)
#define GST_CLAPPER_IMPORTER_LOADER_CAST(obj) ((GstClapperImporterLoader *)(obj))
struct _GstClapperImporterLoader
{
GstObject parent;
GModule *last_module;
GPtrArray *importers;
};
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_find_importer_for_caps (GstClapperImporterLoader *loader, GstCaps *caps, GstClapperImporter **importer);
gboolean gst_clapper_importer_loader_find_importer_for_context_query (GstClapperImporterLoader *loader, GstQuery *query, GstClapperImporter **importer);
G_END_DECLS

View File

@@ -22,6 +22,8 @@
#endif
#include "gstclapperpaintable.h"
#include "gstclappergdkmemory.h"
#include "gstgtkutils.h"
#define DEFAULT_PAR_N 1
#define DEFAULT_PAR_D 1
@@ -29,6 +31,27 @@
#define GST_CAT_DEFAULT gst_clapper_paintable_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
typedef struct
{
GdkTexture *texture;
GstVideoOverlayRectangle *rectangle;
gint x, y;
guint width, height;
gboolean used;
} GstClapperGdkOverlay;
static void
gst_clapper_gdk_overlay_free (GstClapperGdkOverlay *overlay)
{
GST_TRACE ("Freeing overlay: %" GST_PTR_FORMAT, overlay);
g_object_unref (overlay->texture);
gst_video_overlay_rectangle_unref (overlay->rectangle);
g_slice_free (GstClapperGdkOverlay, overlay);
}
static void gst_clapper_paintable_iface_init (GdkPaintableInterface *iface);
static void gst_clapper_paintable_dispose (GObject *object);
static void gst_clapper_paintable_finalize (GObject *object);
@@ -53,19 +76,16 @@ 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;
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);
self->overlays = g_ptr_array_new_with_free_func (
(GDestroyNotify) gst_clapper_gdk_overlay_free);
gdk_rgba_parse (&self->bg, "black");
}
@@ -83,10 +103,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));
}
@@ -97,16 +113,24 @@ gst_clapper_paintable_finalize (GObject *object)
GST_TRACE ("Finalize");
GST_CLAPPER_PAINTABLE_LOCK (self);
g_weak_ref_clear (&self->widget);
gst_clear_buffer (&self->pending_buffer);
gst_clear_buffer (&self->buffer);
g_ptr_array_unref (self->overlays);
GST_CLAPPER_PAINTABLE_UNLOCK (self);
g_mutex_clear (&self->lock);
g_mutex_clear (&self->importer_lock);
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
}
static gboolean
calculate_display_par (GstClapperPaintable *self, const GstVideoInfo *info)
calculate_display_par (GstClapperPaintable *self, GstVideoInfo *info)
{
gint width, height, par_n, par_d, req_par_n, req_par_d;
gboolean success;
@@ -200,6 +224,152 @@ invalidate_paintable_size_on_main_cb (GstClapperPaintable *self)
return G_SOURCE_REMOVE;
}
static void
comp_frame_unmap_and_free (GstVideoFrame *frame)
{
gst_video_frame_unmap (frame);
g_slice_free (GstVideoFrame, frame);
}
static GstClapperGdkOverlay *
_get_cached_overlay (GPtrArray *overlays, GstVideoOverlayRectangle *rectangle, guint *index)
{
guint i;
for (i = 0; i < overlays->len; i++) {
GstClapperGdkOverlay *overlay = g_ptr_array_index (overlays, i);
if (overlay->rectangle != rectangle)
continue;
*index = i;
return overlay;
}
return NULL;
}
static void
gst_clapper_paintable_prepare_overlays (GstClapperPaintable *self)
{
GstVideoOverlayCompositionMeta *comp_meta;
guint num_overlays, i;
/* As long as this is called from main thread, no need to lock here */
if (G_UNLIKELY (!self->buffer)
|| !(comp_meta = gst_buffer_get_video_overlay_composition_meta (self->buffer))) {
guint n_pending = self->overlays->len;
/* Remove all cached overlays if new buffer does not have any */
if (n_pending > 0) {
GST_TRACE ("No overlays in buffer, removing all cached ones");
g_ptr_array_remove_range (self->overlays, 0, n_pending);
}
return;
}
GST_LOG_OBJECT (self, "Preparing overlays...");
/* Mark all old overlays as unused */
for (i = 0; i < self->overlays->len; i++) {
GstClapperGdkOverlay *overlay = g_ptr_array_index (self->overlays, i);
overlay->used = FALSE;
}
num_overlays = gst_video_overlay_composition_n_rectangles (comp_meta->overlay);
for (i = 0; i < num_overlays; i++) {
GdkTexture *texture;
GstBuffer *comp_buffer;
GstVideoFrame *comp_frame;
GstVideoMeta *vmeta;
GstVideoInfo vinfo;
GstVideoOverlayRectangle *rectangle;
GstClapperGdkOverlay *overlay;
GstVideoOverlayFormatFlags flags, alpha_flags = 0;
gint comp_x, comp_y;
guint comp_width, comp_height, cached_index;
rectangle = gst_video_overlay_composition_get_rectangle (comp_meta->overlay, i);
if ((overlay = _get_cached_overlay (self->overlays, rectangle, &cached_index))) {
overlay->used = TRUE;
/* Place overlay at expected position */
if (i != cached_index) {
GST_LOG ("Rearranging overlay position: %u => %u", cached_index, i);
overlay = g_ptr_array_steal_index_fast (self->overlays, cached_index);
g_ptr_array_insert (self->overlays, i, overlay);
}
GST_TRACE ("Reusing cached overlay: %" GST_PTR_FORMAT, overlay);
continue;
}
if (G_UNLIKELY (!gst_video_overlay_rectangle_get_render_rectangle (rectangle,
&comp_x, &comp_y, &comp_width, &comp_height))) {
GST_WARNING ("Invalid overlay rectangle dimensions: %" GST_PTR_FORMAT, rectangle);
continue;
}
flags = gst_video_overlay_rectangle_get_flags (rectangle);
if (flags & GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA)
alpha_flags |= GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA;
comp_buffer = gst_video_overlay_rectangle_get_pixels_unscaled_argb (rectangle, alpha_flags);
comp_frame = g_slice_new (GstVideoFrame);
/* Update overlay video info from video meta */
if ((vmeta = gst_buffer_get_video_meta (comp_buffer))) {
gst_video_info_set_format (&vinfo, vmeta->format, vmeta->width, vmeta->height);
vinfo.stride[0] = vmeta->stride[0];
}
if (G_UNLIKELY (!gst_video_frame_map (comp_frame, &vinfo, comp_buffer, GST_MAP_READ))) {
g_slice_free (GstVideoFrame, comp_frame);
return;
}
if ((texture = gst_video_frame_into_gdk_texture (
comp_frame, (GDestroyNotify) comp_frame_unmap_and_free))) {
overlay = g_slice_new (GstClapperGdkOverlay);
overlay->texture = texture;
overlay->rectangle = gst_video_overlay_rectangle_ref (rectangle);
overlay->x = comp_x;
overlay->y = comp_y;
overlay->width = comp_width;
overlay->height = comp_height;
overlay->used = TRUE;
GST_TRACE ("Created overlay: %"
GST_PTR_FORMAT ", x: %i, y: %i, width: %u, height: %u",
overlay, overlay->x, overlay->y, overlay->width, overlay->height);
g_ptr_array_insert (self->overlays, i, overlay);
}
}
/* Remove all overlays that are not going to be used */
for (i = self->overlays->len; i > 0; i--) {
GstClapperGdkOverlay *overlay = g_ptr_array_index (self->overlays, i - 1);
if (!overlay->used) {
GST_TRACE ("Removing unused cached overlay: %" GST_PTR_FORMAT, overlay);
g_ptr_array_remove (self->overlays, overlay);
}
}
if (G_UNLIKELY (num_overlays != self->overlays->len)) {
GST_WARNING_OBJECT (self, "Some overlays could not be prepared, %u != %u",
num_overlays, self->overlays->len);
}
GST_LOG_OBJECT (self, "Prepared overlays: %u", self->overlays->len);
}
static gboolean
update_paintable_on_main_cb (GstClapperPaintable *self)
{
@@ -211,10 +381,16 @@ update_paintable_on_main_cb (GstClapperPaintable *self)
if ((size_changed = self->pending_resize))
self->pending_resize = FALSE;
gst_clear_buffer (&self->buffer);
self->buffer = self->pending_buffer;
self->pending_buffer = NULL;
self->draw_id = 0;
GST_CLAPPER_PAINTABLE_UNLOCK (self);
gst_clapper_paintable_prepare_overlays (self);
if (size_changed)
invalidate_paintable_size_internal (self);
@@ -237,25 +413,18 @@ 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);
}
void
gst_clapper_paintable_queue_draw (GstClapperPaintable *self)
gst_clapper_paintable_set_buffer (GstClapperPaintable *self, GstBuffer *buffer)
{
GST_CLAPPER_PAINTABLE_LOCK (self);
if (self->draw_id > 0) {
GST_CLAPPER_PAINTABLE_UNLOCK (self);
GST_TRACE ("Already have pending draw");
GST_TRACE ("Already have pending buffer, skipping %" GST_PTR_FORMAT, buffer);
return;
}
gst_buffer_replace (&self->pending_buffer, buffer);
self->draw_id = g_idle_add_full (G_PRIORITY_DEFAULT,
(GSourceFunc) update_paintable_on_main_cb, self, NULL);
@@ -263,7 +432,7 @@ gst_clapper_paintable_queue_draw (GstClapperPaintable *self)
}
gboolean
gst_clapper_paintable_set_video_info (GstClapperPaintable *self, const GstVideoInfo *v_info)
gst_clapper_paintable_set_video_info (GstClapperPaintable *self, GstVideoInfo *v_info)
{
GST_CLAPPER_PAINTABLE_LOCK (self);
@@ -310,9 +479,7 @@ gst_clapper_paintable_set_pixel_aspect_ratio (GstClapperPaintable *self,
/* If paintable update is queued, wait for it, otherwise invalidate
* size only for change to be applied even when paused */
if (!success || self->draw_id > 0) {
self->pending_resize = success;
GST_CLAPPER_PAINTABLE_UNLOCK (self);
return;
}
@@ -320,6 +487,8 @@ gst_clapper_paintable_set_pixel_aspect_ratio (GstClapperPaintable *self,
(GSourceFunc) invalidate_paintable_size_on_main_cb, self, NULL);
GST_CLAPPER_PAINTABLE_UNLOCK (self);
return;
}
/*
@@ -330,9 +499,10 @@ gst_clapper_paintable_snapshot_internal (GstClapperPaintable *self,
GdkSnapshot *snapshot, gdouble width, gdouble height,
gint widget_width, gint widget_height)
{
GstMemory *memory;
GstMapInfo info;
gfloat scale_x, scale_y;
GST_LOG_OBJECT (self, "Snapshot");
guint i;
scale_x = (gfloat) width / self->display_width;
scale_y = (gfloat) height / self->display_height;
@@ -340,31 +510,52 @@ gst_clapper_paintable_snapshot_internal (GstClapperPaintable *self,
/* Apply black borders when keeping aspect ratio */
if (scale_x == scale_y || abs (scale_x - scale_y) <= FLT_EPSILON) {
if (widget_height - height > 0) {
/* XXX: Top uses integer to work with GTK rounding (not going offscreen) */
gint top_bar_height = (widget_height - height) / 2;
gdouble bottom_bar_height = (widget_height - top_bar_height - height);
gdouble bar_height = (widget_height - height) / 2;
gtk_snapshot_append_color (snapshot, &self->bg, &GRAPHENE_RECT_INIT (0, 0, width, -top_bar_height));
gtk_snapshot_append_color (snapshot, &self->bg, &GRAPHENE_RECT_INIT (0, height, width, bottom_bar_height));
gtk_snapshot_append_color (snapshot, &self->bg, &GRAPHENE_RECT_INIT (0, 0, width, -bar_height));
gtk_snapshot_append_color (snapshot, &self->bg, &GRAPHENE_RECT_INIT (0, height, width, bar_height + 0.5));
} else if (widget_width - width > 0) {
gint left_bar_width = (widget_width - width) / 2;
gdouble right_bar_width = (widget_width - left_bar_width - width);
gdouble bar_width = (widget_width - width) / 2;
gtk_snapshot_append_color (snapshot, &self->bg, &GRAPHENE_RECT_INIT (0, 0, -left_bar_width, height));
gtk_snapshot_append_color (snapshot, &self->bg, &GRAPHENE_RECT_INIT (width, 0, right_bar_width, height));
gtk_snapshot_append_color (snapshot, &self->bg, &GRAPHENE_RECT_INIT (0, 0, -bar_width, height));
gtk_snapshot_append_color (snapshot, &self->bg, &GRAPHENE_RECT_INIT (width, 0, bar_width + 0.5, height));
}
}
GST_CLAPPER_PAINTABLE_IMPORTER_LOCK (self);
if (self->importer) {
gst_clapper_importer_snapshot (self->importer, snapshot, width, height);
} else {
GST_LOG_OBJECT (self, "No texture importer, drawing black");
/* Buffer is accessed only from main thread, so no locking required */
if (!self->buffer) {
gtk_snapshot_append_color (snapshot, &self->bg, &GRAPHENE_RECT_INIT (0, 0, width, height));
return;
}
GST_CLAPPER_PAINTABLE_IMPORTER_UNLOCK (self);
GST_TRACE ("Snapshot %" GST_PTR_FORMAT, self->buffer);
memory = gst_buffer_peek_memory (self->buffer, 0);
/* If we cannot map, just draw black */
if (G_UNLIKELY (!gst_memory_map (memory, &info, GST_MAP_READ))) {
gtk_snapshot_append_color (snapshot, &self->bg, &GRAPHENE_RECT_INIT (0, 0, width, height));
GST_WARNING_OBJECT (self, "Could not map %" GST_PTR_FORMAT, self->buffer);
return;
}
gtk_snapshot_append_texture (snapshot,
GST_CLAPPER_GDK_MEMORY_CAST (memory)->texture,
&GRAPHENE_RECT_INIT (0, 0, width, height));
gst_memory_unmap (memory, &info);
/* FIXME: Draw black BG here when import format has-alpha */
//gtk_snapshot_append_color (snapshot, &self->bg, &GRAPHENE_RECT_INIT (0, 0, width, height));
/* Finally append prepared overlays */
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));
}
}
static void
@@ -376,11 +567,8 @@ gst_clapper_paintable_snapshot (GdkPaintable *paintable,
gint widget_width = 0, widget_height = 0;
if ((widget = g_weak_ref_get (&self->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;
widget_width = gtk_widget_get_width (widget);
widget_height = gtk_widget_get_height (widget);
g_object_unref (widget);
}
@@ -393,14 +581,23 @@ static GdkPaintable *
gst_clapper_paintable_get_current_image (GdkPaintable *paintable)
{
GstClapperPaintable *self = GST_CLAPPER_PAINTABLE_CAST (paintable);
GtkSnapshot *snapshot = gtk_snapshot_new ();
/* Snapshot without widget size in order to get
* paintable without black borders */
gst_clapper_paintable_snapshot_internal (self, snapshot,
self->display_width, self->display_height, 0, 0);
if (self->buffer) {
GtkSnapshot *snapshot;
GdkPaintable *ret;
return gtk_snapshot_free_to_paintable (snapshot, NULL);
snapshot = gtk_snapshot_new ();
/* Snapshot without widget size in order to get
* paintable without black borders */
gst_clapper_paintable_snapshot_internal (self, snapshot,
self->display_width, self->display_height, 0, 0);
if ((ret = gtk_snapshot_free_to_paintable (snapshot, NULL)))
return ret;
}
return gdk_paintable_new_empty (0, 0);
}
static gint

View File

@@ -23,8 +23,6 @@
#include <gst/gst.h>
#include <gst/video/video.h>
#include "gstclapperimporter.h"
G_BEGIN_DECLS
#define GST_TYPE_CLAPPER_PAINTABLE (gst_clapper_paintable_get_type())
@@ -36,23 +34,19 @@ 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;
GstBuffer *pending_buffer, *buffer;
GPtrArray *overlays;
GstVideoInfo v_info;
GdkRGBA bg;
GWeakRef widget;
GstClapperImporter *importer;
/* Sink properties */
gint par_n, par_d;
@@ -72,10 +66,9 @@ struct _GstClapperPaintable
};
GstClapperPaintable * gst_clapper_paintable_new (void);
void gst_clapper_paintable_queue_draw (GstClapperPaintable *paintable);
void gst_clapper_paintable_set_widget (GstClapperPaintable *paintable, GtkWidget *widget);
void gst_clapper_paintable_set_importer (GstClapperPaintable *paintable, GstClapperImporter *importer);
gboolean gst_clapper_paintable_set_video_info (GstClapperPaintable *paintable, const GstVideoInfo *v_info);
void gst_clapper_paintable_set_buffer (GstClapperPaintable *paintable, GstBuffer *buffer);
gboolean gst_clapper_paintable_set_video_info (GstClapperPaintable *paintable, GstVideoInfo *v_info);
void gst_clapper_paintable_set_pixel_aspect_ratio (GstClapperPaintable *paintable, gint par_n, gint par_d);
G_END_DECLS

View File

@@ -22,6 +22,8 @@
#endif
#include "gstclappersink.h"
#include "gstclappergdkmemory.h"
#include "gstclappergdkbufferpool.h"
#include "gstgtkutils.h"
#define DEFAULT_FORCE_ASPECT_RATIO TRUE
@@ -44,6 +46,18 @@ enum
#define GST_CAT_DEFAULT gst_clapper_sink_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
static GstStaticPadTemplate gst_clapper_sink_template =
GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
GST_STATIC_CAPS (
GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_CLAPPER_GDK_MEMORY,
"{ " GST_CLAPPER_GDK_MEMORY_FORMATS " }")
"; "
GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_CLAPPER_GDK_MEMORY ", "
GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION,
"{ " GST_CLAPPER_GDK_MEMORY_FORMATS " }")));
static void gst_clapper_sink_navigation_interface_init (
GstNavigationInterface *iface);
@@ -67,7 +81,6 @@ window_clear_no_lock (GstClapperSink *self)
self->window_destroy_id = 0;
}
self->window = NULL;
self->presented_window = FALSE;
}
static void
@@ -169,16 +182,9 @@ gst_clapper_sink_widget_motion_event (GtkEventControllerMotion *motion,
{
GtkWidget *widget;
gdouble stream_x, stream_y;
gboolean is_inactive;
if (x == self->last_pos_x && y == self->last_pos_y)
return;
GST_OBJECT_LOCK (self);
is_inactive = (GST_STATE (self) < GST_STATE_PLAYING);
GST_OBJECT_UNLOCK (self);
if (is_inactive)
if ((x == self->last_pos_x && y == self->last_pos_y)
|| GST_STATE (self) < GST_STATE_PLAYING)
return;
self->last_pos_x = x;
@@ -198,16 +204,11 @@ gst_clapper_sink_widget_button_event (GtkGestureClick *click,
{
GtkWidget *widget;
GdkEvent *event;
gdouble stream_x, stream_y;
GdkEventType event_type;
const gchar *event_name;
gdouble stream_x, stream_y;
gboolean is_inactive;
GST_OBJECT_LOCK (self);
is_inactive = (GST_STATE (self) < GST_STATE_PLAYING);
GST_OBJECT_UNLOCK (self);
if (is_inactive)
if (GST_STATE (self) < GST_STATE_PLAYING)
return;
event = gtk_event_controller_get_current_event ((GtkEventController *) click);
@@ -275,7 +276,7 @@ gst_clapper_sink_get_widget (GstClapperSink *self)
/* Take floating ref */
g_object_ref_sink (self->widget);
/* Set widget back pointer */
/* Set back pointer */
gst_clapper_paintable_set_widget (self->paintable, self->widget);
/* Set earlier remembered property */
@@ -412,9 +413,10 @@ 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;
guint size;
gboolean need_pool;
gst_query_parse_allocation (query, &caps, &need_pool);
@@ -432,79 +434,38 @@ gst_clapper_sink_propose_allocation (GstBaseSink *bsink, GstQuery *query)
/* Normal size of a frame */
size = GST_VIDEO_INFO_SIZE (&info);
/* We keep around current buffer and a pending one */
min_buffers = 3;
if (need_pool) {
GstBufferPool *pool;
GstStructure *config = NULL;
GstStructure *config;
GST_DEBUG_OBJECT (self, "Need to create buffer pool");
GST_DEBUG_OBJECT (self, "Creating new pool");
GST_CLAPPER_SINK_LOCK (self);
pool = gst_clapper_importer_create_pool (self->importer, &config);
GST_CLAPPER_SINK_UNLOCK (self);
pool = gst_clapper_gdk_buffer_pool_new ();
config = gst_buffer_pool_get_config (pool);
if (pool) {
/* If we did not get config, use default one */
if (!config)
config = gst_buffer_pool_get_config (pool);
gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META);
gst_buffer_pool_config_set_params (config, caps, size, 2, 0);
gst_buffer_pool_config_set_params (config, caps, size, min_buffers, 0);
if (!gst_buffer_pool_set_config (pool, config)) {
gst_object_unref (pool);
GST_ERROR_OBJECT (self, "Failed to set config");
return FALSE;
}
gst_query_add_allocation_pool (query, pool, size, min_buffers, 0);
if (!gst_buffer_pool_set_config (pool, config)) {
gst_object_unref (pool);
} else if (config) {
GST_WARNING_OBJECT (self, "Got config without a pool to apply it");
gst_structure_free (config);
GST_DEBUG_OBJECT (self, "Failed to set config");
return FALSE;
}
}
GST_CLAPPER_SINK_LOCK (self);
gst_clapper_importer_add_allocation_metas (self->importer, query);
GST_CLAPPER_SINK_UNLOCK (self);
gst_query_add_allocation_pool (query, pool, size, 2, 0);
if (pool)
gst_object_unref (pool);
gst_query_add_allocation_meta (query,
GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, NULL);
/* We also support various metadata */
gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL);
return TRUE;
}
static gboolean
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) {
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 (self->loader, 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;
return GST_BASE_SINK_CLASS (parent_class)->query (bsink, query);
}
static gboolean
gst_clapper_sink_start_on_main (GstClapperSink *self)
{
@@ -549,9 +510,7 @@ gst_clapper_sink_start_on_main (GstClapperSink *self)
gtk_get_minor_version (),
gtk_get_micro_version ());
/* Set some common default size, adding stock headerbar height
* to it in order to display 4:3 aspect video widget */
gtk_window_set_default_size (self->window, 640, 480 + 37);
gtk_window_set_default_size (self->window, 640, 480);
gtk_window_set_title (self->window, win_title);
gtk_window_set_child (self->window, toplevel);
@@ -643,10 +602,8 @@ gst_clapper_sink_change_state (GstElement *element, GstStateChange transition)
switch (transition) {
case GST_STATE_CHANGE_PAUSED_TO_READY:
GST_CLAPPER_SINK_LOCK (self);
if (!self->keep_last_frame && self->importer) {
gst_clapper_importer_set_buffer (self->importer, NULL);
gst_clapper_paintable_queue_draw (self->paintable);
}
if (!self->keep_last_frame)
gst_clapper_paintable_set_buffer (self->paintable, NULL);
GST_CLAPPER_SINK_UNLOCK (self);
break;
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
@@ -694,10 +651,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);
@@ -715,10 +671,16 @@ static gboolean
gst_clapper_sink_set_caps (GstBaseSink *bsink, GstCaps *caps)
{
GstClapperSink *self = GST_CLAPPER_SINK_CAST (bsink);
gboolean res;
GST_INFO_OBJECT (self, "Set caps: %" GST_PTR_FORMAT, caps);
GST_CLAPPER_SINK_LOCK (self);
if (!gst_video_info_from_caps (&self->v_info, caps)) {
GST_CLAPPER_SINK_UNLOCK (self);
return FALSE;
}
if (G_UNLIKELY (!self->widget)) {
GST_CLAPPER_SINK_UNLOCK (self);
GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND,
@@ -727,32 +689,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)) {
GST_CLAPPER_SINK_UNLOCK (self);
GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND,
("No importer for given caps found"), (NULL));
return FALSE;
}
gst_clapper_paintable_set_importer (self->paintable, self->importer);
GST_CLAPPER_SINK_UNLOCK (self);
return GST_BASE_SINK_CLASS (parent_class)->set_caps (bsink, caps);
}
static gboolean
gst_clapper_sink_set_info (GstVideoSink *vsink, GstCaps *caps, const GstVideoInfo *info)
{
GstClapperSink *self = GST_CLAPPER_SINK_CAST (vsink);
gboolean res;
GST_CLAPPER_SINK_LOCK (self);
self->v_info = *info;
GST_DEBUG_OBJECT (self, "Video info changed");
res = gst_clapper_paintable_set_video_info (self->paintable, info);
res = gst_clapper_paintable_set_video_info (self->paintable, &self->v_info);
GST_CLAPPER_SINK_UNLOCK (self);
return res;
@@ -774,9 +711,7 @@ gst_clapper_sink_show_frame (GstVideoSink *vsink, GstBuffer *buffer)
return GST_FLOW_ERROR;
}
gst_clapper_importer_set_buffer (self->importer, buffer);
gst_clapper_paintable_queue_draw (self->paintable);
gst_clapper_paintable_set_buffer (self->paintable, buffer);
GST_CLAPPER_SINK_UNLOCK (self);
return GST_FLOW_OK;
@@ -807,7 +742,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
@@ -821,7 +755,6 @@ gst_clapper_sink_dispose (GObject *object)
widget_clear_no_lock (self);
g_clear_object (&self->paintable);
gst_clear_object (&self->importer);
GST_CLAPPER_SINK_UNLOCK (self);
@@ -835,7 +768,6 @@ gst_clapper_sink_finalize (GObject *object)
GST_TRACE ("Finalize");
gst_clear_object (&self->loader);
g_mutex_clear (&self->lock);
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
@@ -844,8 +776,6 @@ gst_clapper_sink_finalize (GObject *object)
static void
gst_clapper_sink_class_init (GstClapperSinkClass *klass)
{
GstPadTemplate *sink_pad_templ;
GObjectClass *gobject_class = (GObjectClass *) klass;
GstElementClass *gstelement_class = (GstElementClass *) klass;
GstBaseSinkClass *gstbasesink_class = (GstBaseSinkClass *) klass;
@@ -883,11 +813,9 @@ gst_clapper_sink_class_init (GstClapperSinkClass *klass)
gstbasesink_class->set_caps = gst_clapper_sink_set_caps;
gstbasesink_class->get_times = gst_clapper_sink_get_times;
gstbasesink_class->propose_allocation = gst_clapper_sink_propose_allocation;
gstbasesink_class->query = gst_clapper_sink_query;
gstbasesink_class->start = gst_clapper_sink_start;
gstbasesink_class->stop = gst_clapper_sink_stop;
gstvideosink_class->set_info = gst_clapper_sink_set_info;
gstvideosink_class->show_frame = gst_clapper_sink_show_frame;
gst_element_class_set_metadata (gstelement_class,
@@ -895,8 +823,8 @@ gst_clapper_sink_class_init (GstClapperSinkClass *klass)
"Sink/Video", "A GTK4 video sink used by Clapper media player",
"Rafał Dzięgiel <rafostar.github@gmail.com>");
sink_pad_templ = gst_clapper_importer_loader_make_sink_pad_template ();
gst_element_class_add_pad_template (gstelement_class, sink_pad_templ);
gst_element_class_add_static_pad_template (gstelement_class,
&gst_clapper_sink_template);
}
/*

View File

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

View File

@@ -1,37 +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.
*/
#include <glib.h>
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
#define GST_GDK_MEMORY_ENDIAN_FORMATS "RGBA64_LE"
#define GST_GDK_GL_TEXTURE_ENDIAN_FORMATS "RGBA64_LE"
#elif G_BYTE_ORDER == G_BIG_ENDIAN
#define GST_GDK_MEMORY_ENDIAN_FORMATS "RGBA64_BE"
#define GST_GDK_GL_TEXTURE_ENDIAN_FORMATS "RGBA64_BE"
#endif
#define GST_GDK_MEMORY_FORMATS \
GST_GDK_MEMORY_ENDIAN_FORMATS ", " \
"ABGR, BGRA, ARGB, RGBA, BGRx, RGBx, BGR, RGB"
/* Formats that `GdkGLTexture` supports */
#define GST_GDK_GL_TEXTURE_FORMATS \
GST_GDK_GL_TEXTURE_ENDIAN_FORMATS ", " \
"RGBA, RGBx, RGB"

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;
@@ -118,7 +108,7 @@ gst_gdk_memory_format_from_frame (GstVideoFrame *frame)
}
GdkTexture *
gst_video_frame_into_gdk_texture (GstVideoFrame *frame)
gst_video_frame_into_gdk_texture (GstVideoFrame *frame, GDestroyNotify free_func)
{
GdkTexture *texture;
GBytes *bytes;
@@ -126,13 +116,12 @@ gst_video_frame_into_gdk_texture (GstVideoFrame *frame)
bytes = g_bytes_new_with_free_func (
GST_VIDEO_FRAME_PLANE_DATA (frame, 0),
GST_VIDEO_FRAME_HEIGHT (frame) * GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0),
(GDestroyNotify) gst_buffer_unref,
gst_buffer_ref (frame->buffer));
free_func, 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

@@ -26,10 +26,8 @@
#include <gtk/gtk.h>
#include <gst/video/video.h>
G_BEGIN_DECLS
gpointer gst_gtk_invoke_on_main (GThreadFunc func, gpointer data);
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
GdkTexture * gst_video_frame_into_gdk_texture (GstVideoFrame *frame, GDestroyNotify free_func);

View File

@@ -21,21 +21,24 @@
#include "config.h"
#endif
#include <gmodule.h>
#include "gstclapperimport.h"
#include "gstclapperglimport.h"
#include "gstclappersink.h"
#include "gstclappergdkmemory.h"
static gboolean
plugin_init (GstPlugin *plugin)
{
if (!g_module_supported ())
return FALSE;
gboolean res = FALSE;
gst_plugin_add_dependency_simple (plugin,
NULL, CLAPPER_SINK_IMPORTER_PATH, NULL,
GST_PLUGIN_DEPENDENCY_FLAG_NONE);
res |= GST_ELEMENT_REGISTER (clapperimport, plugin);
res |= GST_ELEMENT_REGISTER (clapperglimport, plugin);
res |= GST_ELEMENT_REGISTER (clappersink, plugin);
return GST_ELEMENT_REGISTER (clappersink, plugin);
if (res)
gst_clapper_gdk_memory_init_once ();
return res;
}
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR,

View File

@@ -1,658 +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 "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 || GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WIN32_EGL
#include <gst/gl/egl/gstgldisplay_egl.h>
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WIN32
#include <gdk/win32/gdkwin32.h>
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_MACOS
#include <gdk/macos/gdkmacos.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 (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_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_CLAPPER_GL_BASE_IMPORTER_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
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WIN32
if (GDK_IS_WIN32_DISPLAY (gdk_display)) {
#if GST_CLAPPER_GL_BASE_IMPORTER_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_BASE_IMPORTER_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_BASE_IMPORTER_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_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)
&& 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_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
#if GST_CLAPPER_GL_BASE_IMPORTER_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_BASE_IMPORTER_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_BASE_IMPORTER_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_CLAPPER_GL_BASE_IMPORTER_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_CLAPPER_GL_BASE_IMPORTER_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_CLAPPER_GL_BASE_IMPORTER_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_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
return TRUE;
}
static gboolean
retrieve_gst_context (GstClapperGLBaseImporter *self)
{
GstGLDisplay *gst_display = NULL;
GstGLContext *gst_context = NULL;
GError *error = NULL;
GST_CLAPPER_GL_BASE_IMPORTER_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_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
return FALSE;
}
}
gst_context = gst_object_ref (self->gst_context);
GST_CLAPPER_GL_BASE_IMPORTER_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_CLAPPER_GL_BASE_IMPORTER_LOCK (self);
need_invoke = (!self->gdk_context || !self->gst_display || !self->wrapped_context);
GST_CLAPPER_GL_BASE_IMPORTER_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_CLAPPER_GL_BASE_IMPORTER_LOCK (self);
GST_CLAPPER_GL_BASE_IMPORTER_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_CLAPPER_GL_BASE_IMPORTER_UNLOCK (dest);
GST_CLAPPER_GL_BASE_IMPORTER_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_CLAPPER_GL_BASE_IMPORTER_LOCK (self);
res = gst_gl_handle_context_query (GST_ELEMENT_CAST (bsink), query,
self->gst_display, self->gst_context, self->wrapped_context);
GST_CLAPPER_GL_BASE_IMPORTER_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_CLAPPER_GL_BASE_IMPORTER_LOCK (self);
pool = gst_gl_buffer_pool_new (self->gst_context);
GST_CLAPPER_GL_BASE_IMPORTER_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_CLAPPER_GL_BASE_IMPORTER_LOCK (self);
if (self->gst_context->gl_vtable->FenceSync)
gst_query_add_allocation_meta (query, GST_GL_SYNC_META_API_TYPE, NULL);
GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
}
static gboolean
_realize_gdk_context_with_api (GdkGLContext *gdk_context, GdkGLAPI api)
{
GError *error = NULL;
gboolean success;
gdk_gl_context_set_allowed_apis (gdk_context, api);
if (!(success = gdk_gl_context_realize (gdk_context, &error))) {
GST_WARNING ("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
gst_clapper_gl_base_importer_gdk_context_realize (GstClapperGLBaseImporter *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);
}
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_BASE_IMPORTER_HAVE_WAYLAND
if (GDK_IS_WAYLAND_DISPLAY (gdk_display))
preferred_api = GDK_GL_API_GLES;
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_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_BASE_IMPORTER_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_BASE_IMPORTER_HAVE_WAYLAND || GST_CLAPPER_GL_BASE_IMPORTER_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
if (!(success = _realize_gdk_context_with_api (gdk_context, preferred_api))) {
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);
}
return success;
}
static void
gst_clapper_gl_base_importer_init (GstClapperGLBaseImporter *self)
{
g_mutex_init (&self->lock);
}
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);
g_mutex_clear (&self->lock);
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_CLAPPER_GL_BASE_IMPORTER_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_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
gst_video_frame_unmap (&frame);
return texture;
}

View File

@@ -1,85 +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/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_GET_LOCK(obj) (&GST_CLAPPER_GL_BASE_IMPORTER_CAST(obj)->lock)
#define GST_CLAPPER_GL_BASE_IMPORTER_LOCK(obj) g_mutex_lock (GST_CLAPPER_GL_BASE_IMPORTER_GET_LOCK(obj))
#define GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK(obj) g_mutex_unlock (GST_CLAPPER_GL_BASE_IMPORTER_GET_LOCK(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)
#define GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WIN32 (GST_GL_HAVE_WINDOW_WIN32 && defined (GDK_WINDOWING_WIN32))
#define GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WIN32_WGL (GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WIN32 && GST_GL_HAVE_PLATFORM_WGL)
#define GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WIN32_EGL (GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WIN32 && GST_GL_HAVE_PLATFORM_EGL)
#define GST_CLAPPER_GL_BASE_IMPORTER_HAVE_MACOS (GST_GL_HAVE_WINDOW_COCOA && defined (GDK_WINDOWING_MACOS) && GST_GL_HAVE_PLATFORM_CGL)
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;
GMutex lock;
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

@@ -1,70 +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 "gstclapperglimporter.h"
#define GST_CAT_DEFAULT gst_clapper_gl_importer_debug
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_GL_BASE_IMPORTER);
static GdkTexture *
gst_clapper_gl_importer_generate_texture (GstClapperImporter *importer,
GstBuffer *buffer, GstVideoInfo *v_info)
{
GstClapperGLBaseImporter *gl_bi = GST_CLAPPER_GL_BASE_IMPORTER_CAST (importer);
return gst_clapper_gl_base_importer_make_gl_texture (gl_bi, buffer, v_info);
}
static void
gst_clapper_gl_importer_init (GstClapperGLImporter *self)
{
}
static void
gst_clapper_gl_importer_class_init (GstClapperGLImporterClass *klass)
{
GstClapperImporterClass *importer_class = (GstClapperImporterClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperglimporter", 0,
"Clapper GL Importer");
importer_class->generate_texture = gst_clapper_gl_importer_generate_texture;
}
GstClapperImporter *
make_importer (void)
{
return g_object_new (GST_TYPE_CLAPPER_GL_IMPORTER, NULL);
}
GstCaps *
make_caps (gboolean is_template, GstRank *rank, GStrv *context_types)
{
*rank = GST_RANK_SECONDARY;
*context_types = gst_clapper_gl_base_importer_make_gl_context_types ();
return gst_clapper_gl_base_importer_make_supported_gdk_gl_caps ();
}

View File

@@ -1,312 +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 "gstclappergluploader.h"
#include "gst/plugin/gstgtkutils.h"
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11
#include <gdk/x11/gdkx.h>
#endif
#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_GL_BASE_IMPORTER);
static void
_update_elements_caps_locked (GstClapperGLUploader *self, GstCaps *upload_sink_caps)
{
GstClapperGLBaseImporter *gl_bi = GST_CLAPPER_GL_BASE_IMPORTER_CAST (self);
GstCaps *upload_src_caps, *color_sink_caps, *color_src_caps, *gdk_sink_caps;
GST_INFO_OBJECT (self, "Input caps: %" GST_PTR_FORMAT, upload_sink_caps);
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_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 (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);
gst_gl_color_convert_set_caps (self->color_convert, upload_src_caps, color_src_caps);
self->has_pending_v_info = gst_video_info_from_caps (&self->pending_v_info, color_src_caps);
gst_caps_unref (upload_src_caps);
gst_caps_unref (color_src_caps);
}
static void
gst_clapper_gl_uploader_set_caps (GstClapperImporter *importer, GstCaps *caps)
{
GstClapperGLUploader *self = GST_CLAPPER_GL_UPLOADER_CAST (importer);
GST_CLAPPER_GL_BASE_IMPORTER_LOCK (self);
_update_elements_caps_locked (self, caps);
GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
}
static void
_uploader_reconfigure_locked (GstClapperGLUploader *self)
{
GstCaps *in_caps = NULL;
GST_DEBUG_OBJECT (self, "Reconfiguring upload");
gst_gl_upload_get_caps (self->upload, &in_caps, NULL);
if (G_LIKELY (in_caps)) {
_update_elements_caps_locked (self, in_caps);
gst_caps_unref (in_caps);
}
}
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_CLAPPER_GL_BASE_IMPORTER_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_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
}
return res;
}
static GstBuffer *
_upload_perform_locked (GstClapperGLUploader *self, GstBuffer *buffer)
{
GstBuffer *upload_buf = NULL;
GstGLUploadReturn ret;
ret = gst_gl_upload_perform_with_buffer (self->upload, buffer, &upload_buf);
if (G_UNLIKELY (ret != GST_GL_UPLOAD_DONE)) {
switch (ret) {
case GST_GL_UPLOAD_RECONFIGURE:
_uploader_reconfigure_locked (self);
/* Retry with the same buffer after reconfiguring */
return _upload_perform_locked (self, buffer);
default:
GST_ERROR_OBJECT (self, "Could not upload input buffer, returned: %i", ret);
break;
}
}
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_BASE_IMPORTER_LOCK (self);
upload = gst_object_ref (self->upload);
GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
gst_gl_upload_propose_allocation (upload, NULL, query);
gst_object_unref (upload);
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;
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. */
GST_LOG_OBJECT (self, "Uploading %" GST_PTR_FORMAT, buffer);
GST_CLAPPER_GL_BASE_IMPORTER_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_BASE_IMPORTER_UNLOCK (self);
return NULL;
}
GST_LOG_OBJECT (self, "Uploaded into %" GST_PTR_FORMAT, upload_buf);
color_buf = gst_gl_color_convert_perform (self->color_convert, upload_buf);
gst_buffer_unref (upload_buf);
/* Use video info associated with converted buffer */
if (self->has_pending_v_info) {
self->v_info = self->pending_v_info;
self->has_pending_v_info = FALSE;
}
GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
if (G_UNLIKELY (!color_buf)) {
GST_ERROR_OBJECT (self, "Could not perform color conversion on input buffer");
return NULL;
}
GST_LOG_OBJECT (self, "Color converted into %" GST_PTR_FORMAT, color_buf);
texture = gst_clapper_gl_base_importer_make_gl_texture (gl_bi, color_buf, &self->v_info);
gst_buffer_unref (color_buf);
return texture;
}
static void
gst_clapper_gl_uploader_init (GstClapperGLUploader *self)
{
gst_video_info_init (&self->pending_v_info);
gst_video_info_init (&self->v_info);
}
static void
gst_clapper_gl_uploader_finalize (GObject *object)
{
GstClapperGLUploader *self = GST_CLAPPER_GL_UPLOADER_CAST (object);
gst_clear_object (&self->upload);
gst_clear_object (&self->color_convert);
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
}
static void
gst_clapper_gl_uploader_class_init (GstClapperGLUploaderClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
GstClapperImporterClass *importer_class = (GstClapperImporterClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clappergluploader", 0,
"Clapper GL Uploader");
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 (void)
{
return g_object_new (GST_TYPE_CLAPPER_GL_UPLOADER, NULL);
}
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_GLX
static gboolean
_filter_glx_caps_cb (GstCapsFeatures *features,
GstStructure *structure, gpointer user_data)
{
return !gst_caps_features_contains (features, "memory:DMABuf");
}
static gboolean
_update_glx_caps_on_main (GstCaps *caps)
{
GdkDisplay *gdk_display;
if (!gtk_init_check ())
return FALSE;
gdk_display = gdk_display_get_default ();
if (G_UNLIKELY (!gdk_display))
return FALSE;
if (GDK_IS_X11_DISPLAY (gdk_display)) {
gboolean using_glx = TRUE;
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_EGL
using_glx = (gdk_x11_display_get_egl_display (gdk_display) == NULL);
#endif
if (using_glx) {
gst_caps_filter_and_map_in_place (caps,
(GstCapsFilterMapFunc) _filter_glx_caps_cb, NULL);
}
}
return TRUE;
}
#endif
GstCaps *
make_caps (gboolean is_template, GstRank *rank, GStrv *context_types)
{
GstCaps *caps = gst_gl_upload_get_input_template_caps ();
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_GLX
if (!is_template && !(! !gst_gtk_invoke_on_main ((GThreadFunc) (GCallback)
_update_glx_caps_on_main, caps)))
gst_clear_caps (&caps);
#endif
if (G_UNLIKELY (!caps))
return NULL;
*rank = GST_RANK_MARGINAL + 1;
*context_types = gst_clapper_gl_base_importer_make_gl_context_types ();
return caps;
}

View File

@@ -1,111 +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 "gstclapperrawimporter.h"
#include "gst/plugin/gstgtkutils.h"
#include "gst/plugin/gstgdkformats.h"
#define GST_CAT_DEFAULT gst_clapper_raw_importer_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
#define parent_class gst_clapper_raw_importer_parent_class
GST_CLAPPER_IMPORTER_DEFINE (GstClapperRawImporter, gst_clapper_raw_importer, GST_TYPE_CLAPPER_IMPORTER);
static GstBufferPool *
gst_clapper_raw_importer_create_pool (GstClapperImporter *importer, GstStructure **config)
{
GstClapperRawImporter *self = GST_CLAPPER_RAW_IMPORTER_CAST (importer);
GstBufferPool *pool;
GST_DEBUG_OBJECT (self, "Creating new buffer pool");
pool = gst_video_buffer_pool_new ();
*config = gst_buffer_pool_get_config (pool);
gst_buffer_pool_config_add_option (*config, GST_BUFFER_POOL_OPTION_VIDEO_META);
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)
{
GdkTexture *texture;
GstVideoFrame frame;
if (G_UNLIKELY (!gst_video_frame_map (&frame, v_info, buffer, GST_MAP_READ))) {
GST_ERROR_OBJECT (importer, "Could not map input buffer for reading");
return NULL;
}
texture = gst_video_frame_into_gdk_texture (&frame);
gst_video_frame_unmap (&frame);
return texture;
}
static void
gst_clapper_raw_importer_init (GstClapperRawImporter *self)
{
}
static void
gst_clapper_raw_importer_class_init (GstClapperRawImporterClass *klass)
{
GstClapperImporterClass *importer_class = (GstClapperImporterClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperrawimporter", 0,
"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 (void)
{
return g_object_new (GST_TYPE_CLAPPER_RAW_IMPORTER, NULL);
}
GstCaps *
make_caps (gboolean is_template, GstRank *rank, GStrv *context_types)
{
*rank = GST_RANK_MARGINAL;
return gst_caps_from_string (
GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY ", "
GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION,
"{ " GST_GDK_MEMORY_FORMATS " }")
"; "
GST_VIDEO_CAPS_MAKE (
"{ " GST_GDK_MEMORY_FORMATS " }"));
}

View File

@@ -1,151 +0,0 @@
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
if get_option(imp).enabled()
error('"@0@" option was enabled, but it requires building gstreamer plugin'.format(imp))
endif
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 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_base_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_base_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_glbase = false
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_base_importer_dep.found()
)
if build_glimporter
library(
'gstclapperglimporter',
'gstclapperglimporter.c',
dependencies: gst_clapper_gl_base_importer_dep,
include_directories: configinc,
c_args: gst_clapper_plugin_args,
install: true,
install_dir: gst_clapper_importers_libdir,
)
endif
build_gluploader = (
not get_option('gluploader').disabled()
and gst_clapper_gl_base_importer_dep.found()
)
if build_gluploader
library(
'gstclappergluploader',
'gstclappergluploader.c',
dependencies: gst_clapper_gl_base_importer_dep,
include_directories: configinc,
c_args: gst_clapper_plugin_args,
install: true,
install_dir: gst_clapper_importers_libdir,
)
endif
# No need to auto build rawimporter if we are building gluploader
build_rawimporter = (
not get_option('rawimporter').disabled()
and (not build_gluploader or get_option('rawimporter').enabled())
and gst_clapper_sink_dep.found()
)
if build_rawimporter
library(
'gstclapperrawimporter',
'gstclapperrawimporter.c',
dependencies: gst_clapper_sink_dep,
include_directories: configinc,
c_args: gst_clapper_plugin_args,
install: true,
install_dir: gst_clapper_importers_libdir,
)
endif

View File

@@ -4,60 +4,66 @@ gst_clapper_plugin_args = [
'-DHAVE_CONFIG_H',
'-DGST_USE_UNSTABLE_API',
]
gst_clapper_sink_dep = dependency('', required: false)
gtk4_dep = dependency('gtk4', version: '>=4.6.0', required: false)
gmodule_dep = dependency('gmodule-2.0',
version: glib_req,
required: false,
fallback: ['glib', 'libgmodule_dep'],
)
gst_clapper_plugin_deps = [
gtk4_dep,
gst_dep,
gstbase_dep,
gstvideo_dep,
gmodule_dep,
gstallocators_dep,
]
build_gst_plugin = not get_option('gst-plugin').disabled()
foreach dep : gst_clapper_plugin_deps
if not dep.found()
if get_option('gst-plugin').enabled()
error('GStreamer plugin was enabled, but required dependencies were not found')
endif
build_gst_plugin = false
endif
endforeach
if get_option('default_library') == 'static'
gst_clapper_plugin_args += ['-DGST_STATIC_COMPILATION']
endif
gst_clapper_plugin_option = get_option('gst-plugin')
if gst_clapper_plugin_option.disabled()
subdir_done()
endif
foreach dep : gst_clapper_plugin_deps
if not dep.found()
if gst_clapper_plugin_option.enabled()
error('GStreamer plugin was enabled, but required dependencies were not found')
endif
subdir_done()
endif
endforeach
if not have_gtk_gl_windowing
if gst_clapper_plugin_option.enabled()
error('GTK4 widget requires GL windowing')
else
subdir_done()
endif
endif
if not gtk4_dep.version().version_compare('>=4.6.0')
if gst_clapper_plugin_option.enabled()
error('GTK4 version on this system is too old, plugin needs 4.6.0+')
else
subdir_done()
endif
endif
gst_clapper_plugin_sources = [
'gstclappergdkmemory.c',
'gstclappergdkbufferpool.c',
'gstclapperbaseimport.c',
'gstclapperglbaseimport.c',
'gstclapperimport.c',
'gstclapperglimport.c',
'gstclappersink.c',
'gstclapperpaintable.c',
'gstgtkutils.c',
'gstplugin.c',
'gstclapperimporter.c',
'gstclapperimporterloader.c',
]
if build_gst_plugin
gst_clapper_sink_dep = declare_dependency(
link_with: library('gstclapper',
gst_clapper_plugin_sources,
c_args: gst_clapper_plugin_args,
include_directories: configinc,
dependencies: gst_clapper_plugin_deps,
install: true,
install_dir: gst_plugins_libdir,
),
include_directories: configinc,
dependencies: gst_clapper_plugin_deps,
)
endif
subdir('importers')
library('gstclapper',
gst_clapper_plugin_sources,
c_args: gst_clapper_plugin_args,
include_directories: configinc,
dependencies: gst_clapper_plugin_deps + gtk_deps,
install: true,
install_dir: gst_plugins_libdir,
)

53
lib/meson.build vendored
View File

@@ -1,4 +1,4 @@
glib_req = '>= 2.68.0'
glib_req = '>= 2.56.0'
gst_req = '>= 1.20.0'
api_version = '1.0'
@@ -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
@@ -44,6 +42,10 @@ endif
# Symbol visibility
if cc.get_id() == 'msvc'
export_define = '__declspec(dllexport) extern'
elif cc.has_argument('-fvisibility=hidden')
add_project_arguments('-fvisibility=hidden', language: 'c')
add_project_arguments('-fvisibility=hidden', language: 'cpp')
export_define = 'extern __attribute__ ((visibility ("default")))'
else
export_define = 'extern'
endif
@@ -198,6 +200,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 +249,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 +257,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);' + \
@@ -266,9 +265,37 @@ gir_init_section = ['--add-init-section=extern void gst_init(gint*,gchar**);' +
'gst_init(NULL,NULL);', '--quiet'
]
gst_clapper_plugin_libdir = join_paths(get_option('prefix'), libdir, 'clapper-@0@'.format(api_version), 'gst', 'plugin')
gst_clapper_importers_libdir = join_paths(gst_clapper_plugin_libdir, 'importers')
cdata.set_quoted('CLAPPER_SINK_IMPORTER_PATH', gst_clapper_importers_libdir)
gtk_deps = [gstgl_dep, gstglproto_dep]
have_gtk_gl_windowing = false
gtk4_dep = dependency('gtk4', required: true)
if not gtk4_dep.version().version_compare('>=4.0.0')
error('GTK4 version on this system is too old')
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()
gtk_deps += gtk_x11_dep
if gst_gl_have_platform_glx
gtk_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()
gtk_deps += [gtk_wayland_dep, gstglwayland_dep]
have_gtk_gl_windowing = true
endif
endif
if gst_gl_have_platform_egl
gtk_deps += gstglegl_dep
endif
subdir('gst')
configure_file(output: 'config.h', configuration: cdata)

View File

@@ -1,5 +1,5 @@
project('com.github.rafostar.Clapper', 'c', 'cpp',
version: '0.5.0',
version: '0.4.1',
meson_version: '>= 0.50.0',
license: 'GPL-3.0-or-later',
default_options: [
@@ -19,7 +19,9 @@ datadir = join_paths(get_option('prefix'), get_option('datadir'))
pkglibdir = join_paths(libdir, meson.project_name())
pkgdatadir = join_paths(datadir, meson.project_name())
subdir('lib')
if get_option('lib') or not get_option('gst-plugin').disabled()
subdir('lib')
endif
if get_option('player')
subdir('bin')

View File

@@ -10,26 +10,9 @@ option('lib',
)
option('gst-plugin',
type: 'feature',
value: 'auto',
value: 'enabled',
description: 'Build GStreamer plugin (includes GTK video sink element)'
)
option('glimporter',
type: 'feature',
value: 'auto',
description: 'Build GL memory importer for clappersink'
)
option('gluploader',
type: 'feature',
value: 'auto',
description: 'Build GL uploader for clappersink'
)
option('rawimporter',
type: 'feature',
value: 'auto',
description: 'Build RAW system memory importer for clappersink'
)
option('devel-checks',
type: 'boolean',
value: false,

View File

@@ -21,6 +21,7 @@
],
"modules": [
"flathub/shared-modules/gudev/gudev.json",
"flathub/lib/pango.json",
"flathub/lib/libsass.json",
"flathub/lib/sassc.json",
"flathub/lib/liba52.json",
@@ -34,7 +35,7 @@
"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",

View File

@@ -0,0 +1,31 @@
From b413ee2c7d458c7005d3d3d1da8822cd86893ac0 Mon Sep 17 00:00:00 2001
From: Rafostar <40623528+Rafostar@users.noreply.github.com>
Date: Fri, 4 Dec 2020 19:25:34 +0100
Subject: [PATCH] popover: Call unrealize on hide
When popover is shown "realize" method is called which creates a new
surface for popup. Unfortunately this causes performance drop on Wayland until that
surface is destroyed what happens inside "unrealize" method during popover destruction.
This commit changes default behavior in a way that surface will be destroyed
when popover is closed and app will ragain the performance it lost when
popover was shown.
---
gtk/gtkpopover.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c
index 504dcd6cc1..a7a764d483 100644
--- a/gtk/gtkpopover.c
+++ b/gtk/gtkpopover.c
@@ -951,6 +951,7 @@ gtk_popover_hide (GtkWidget *widget)
gtk_popover_set_mnemonics_visible (GTK_POPOVER (widget), FALSE);
_gtk_widget_set_visible_flag (widget, FALSE);
+ gtk_widget_unrealize (widget);
gtk_widget_unmap (widget);
g_signal_emit (widget, signals[CLOSED], 0);
}
--
GitLab

View File

@@ -26,8 +26,12 @@
{
"type": "git",
"url": "https://gitlab.gnome.org/GNOME/gtk.git",
"tag": "4.6.4",
"commit": "1e6bad6c4f412dc0eb7b2f508cb4465929a04303"
"tag": "4.6.2",
"commit": "aec7ca82007dbe07faee6be084d20758ebac2b91"
},
{
"type": "patch",
"path": "gtk4-popover-unrealize.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.1.1",
"commit": "5ec9f624b23bf78b29dd708e77ccdfcee0a9867a"
}
]
}

View File

@@ -1 +1 @@
ar ca cs de es eu fr hu it ja nl pl pt pt_BR ru sv tr zh_CN
ca cs de es fr hu it nl pl pt pt_BR ru sv 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 ""

373
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: 2021-09-14 15:25\n"
"Last-Translator: \n"
"Language-Team: Arabic\n"
"Language: ar_SA\n"
@@ -19,420 +19,441 @@ msgstr ""
#: ui/clapper.ui:6
msgid "Open Files…"
msgstr "فتح الملفات…"
msgstr ""
#: ui/clapper.ui:10
msgid "Open URI…"
msgstr "فتح عنوان URL…"
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 "فتح عنوان URL"
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 "أدخل أو الصق URI هنا"
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 "Yousef Fawaz"
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/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 ""

129
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-05-27 16: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"
@@ -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"

373
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-01-16 16:58\n"
"Last-Translator: \n"
"Language-Team: Basque\n"
"Language: eu_ES\n"
@@ -19,420 +19,441 @@ msgstr ""
#: ui/clapper.ui:6
msgid "Open Files…"
msgstr "Artxiboak ireki…"
msgstr ""
#: ui/clapper.ui:10
msgid "Open URI…"
msgstr "Ireki URI…"
msgstr ""
#: ui/clapper.ui:16 ui/preferences-window.ui:4
msgid "Preferences"
msgstr "Hobespenak"
msgstr ""
#: ui/clapper.ui:20
msgid "Shortcuts"
msgstr "Lasterbideak"
msgstr ""
#: ui/clapper.ui:26
msgid "About Clapper"
msgstr "Clapperi buruz"
msgstr ""
#: ui/elapsed-time-button.ui:27
msgid "Speed"
msgstr "Abiadura"
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 "Normala"
msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12
msgid "General"
msgstr "Orokorra"
msgstr ""
#: ui/help-overlay.ui:13
msgid "Show shortcuts"
msgstr "Erakutsi lasterbideak"
msgstr ""
#: ui/help-overlay.ui:19
msgid "Toggle fullscreen"
msgstr "Aktibatu pantaila osoa"
msgstr ""
#: ui/help-overlay.ui:20
msgid "Double tap | Double click"
msgstr "Ukitu bikoitza / Bikoitza klik"
msgstr ""
#: ui/help-overlay.ui:26
msgid "Leave fullscreen"
msgstr "Pantaila osoa utzi"
msgstr ""
#: ui/help-overlay.ui:32
msgid "Reveal OSD (fullscreen only)"
msgstr "OSD errebelatu (pantaila osoan bakarrik)"
msgstr ""
#: ui/help-overlay.ui:33
msgid "Tap"
msgstr "Ukitu"
msgstr ""
#: ui/help-overlay.ui:39
msgid "Quit"
msgstr "Irten"
msgstr ""
#: ui/help-overlay.ui:47
msgid "Media"
msgstr "Media"
msgstr ""
#: ui/help-overlay.ui:50
msgid "Open files"
msgstr "Artxiboak ireki"
msgstr ""
#: ui/help-overlay.ui:56 src/dialogs.js:137
msgid "Open URI"
msgstr "Ireki URI"
msgstr ""
#: ui/help-overlay.ui:64
msgid "Playlist"
msgstr "Erreprodukzio-zerrenda"
msgstr ""
#: ui/help-overlay.ui:67
msgid "Next item"
msgstr "Hurrengo elementua"
msgstr ""
#: ui/help-overlay.ui:68
msgid "Double tap (right side)"
msgstr "Ukitu bikoitza (eskuineko aldea)"
msgstr ""
#: ui/help-overlay.ui:74
msgid "Previous item"
msgstr "Aurreko elementua"
msgstr ""
#: ui/help-overlay.ui:75
msgid "Double tap (left side)"
msgstr "Ukitu bikoitza (ezkerreko aldea)"
msgstr ""
#: ui/help-overlay.ui:81
msgid "Change repeat mode"
msgstr "Errepikapen modua aldatu"
msgstr ""
#: ui/help-overlay.ui:87
msgid "Export to file"
msgstr "Esportatu fitxategira"
msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr "Erreprodukzioa"
msgstr ""
#: ui/help-overlay.ui:98
msgid "Toggle play"
msgstr "Erreprodukzioa aktibatu"
msgstr ""
#: ui/help-overlay.ui:99
msgid "Long press | Right click"
msgstr "Pultsazio luzea / Eskuineko klik"
msgstr ""
#: ui/help-overlay.ui:105
msgid "Seek forward"
msgstr "Aurrerapena bilatu"
msgstr ""
#: ui/help-overlay.ui:106
msgid "Swipe right | Scroll right"
msgstr "Eskuinera irristatu / Eskuinera joan"
msgstr ""
#: ui/help-overlay.ui:112
msgid "Seek backward"
msgstr "Atzerantz bilatu"
msgstr ""
#: ui/help-overlay.ui:113
msgid "Swipe left | Scroll left"
msgstr "Ezkerrera irristatu / Ezkerrera mugitu"
msgstr ""
#: ui/help-overlay.ui:119
msgid "Volume up"
msgstr "Bolumena igo"
msgstr ""
#: ui/help-overlay.ui:120
msgid "Swipe up | Scroll up"
msgstr "Gorantz irristatu / Gorantz mugitu"
msgstr ""
#: ui/help-overlay.ui:126
msgid "Volume down"
msgstr "Bolumena jeitsi"
msgstr ""
#: ui/help-overlay.ui:127
msgid "Swipe down | Scroll down"
msgstr "Beherantz irristatu / Beherantz mugitu"
msgstr ""
#: ui/help-overlay.ui:133
msgid "Toggle mute"
msgstr "Aktibatu isiltasuna"
msgstr ""
#: ui/help-overlay.ui:139
msgid "Next chapter"
msgstr "Hurrengo kapitulua"
msgstr ""
#: ui/help-overlay.ui:145
msgid "Previous chapter"
msgstr "Aurreko kapitulua"
msgstr ""
#: ui/preferences-plugin-ranking-subpage.ui:11
msgid "Decoders"
msgstr "Deskodetzaileak"
msgstr ""
#: ui/preferences-plugin-ranking-subpage.ui:18
msgid "Return to the preferences"
msgstr "Itzuli ezarpenetara"
msgstr ""
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr "Portaera"
#: ui/preferences-window.ui:18
msgid "Auto fullscreen"
msgstr "Pantaila osoa automatikoa"
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 "Pantaila osoan sartu erreprodukzio-zerrenda ordezten denean, flotatzeko modua izan ezik"
msgstr ""
#: 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
msgid "Float on all workspaces"
msgstr "Laneko espazio guztietan flotatzea"
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 "Aukera honek GNOMEn bakarrik funtzionatzen du"
msgstr ""
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr "Erreprodukzioaren ondoren"
#: ui/preferences-window.ui:43
msgid "Do nothing"
msgstr "Ez egin ezer"
msgstr ""
#: ui/preferences-window.ui:44
msgid "Freeze last frame"
msgstr "Izoztu azken fotograma"
msgid "Do nothing"
msgstr ""
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr "Aplikazioa itxi"
msgstr ""
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr "Bolumena"
#: ui/preferences-window.ui:58
msgid "Custom initial value"
msgstr "Hasierako balio pertsonalizatua"
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 "Hasieran bolumen pertsonalizatua ezartzea, lehengoratu beharrean"
msgstr ""
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr "Bolumenaren ehunekoa"
msgstr ""
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr "Bilaketa"
msgstr ""
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr "Modua"
#: ui/preferences-window.ui:83
msgid "Accurate"
msgstr "Zehatza"
msgstr ""
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr "Azkarra"
msgstr ""
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr "Unitatea"
#: ui/preferences-window.ui:97
msgid "Second"
msgstr "Segundu"
msgstr ""
#: ui/preferences-window.ui:98
msgid "Minute"
msgstr "Minutu"
msgid "Second"
msgstr ""
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr ""
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr "Ehunekoa"
msgstr ""
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr "Balioa"
msgstr ""
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr "Audioa"
msgstr ""
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr "Desplazamendua milisegundotan"
msgstr ""
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr "Jatorrizko audio-formatuak bakarrik"
msgstr ""
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr "Azpitituluak"
msgstr ""
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr "Hizki lehenetsia"
msgstr ""
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr "Sarea"
msgstr ""
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr "Bezeroa"
msgstr ""
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr "Deskargak pixkanaka bufferizatzea"
msgstr ""
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr "Zerbitzaria"
msgstr ""
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr "Urrutiko erreproduzitzailea kontrolatzea"
msgstr ""
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr "Entzuteko ataka"
msgstr ""
#: ui/preferences-window.ui:188
msgid "Tweaks"
msgstr "Ukituak"
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:192
msgid "Appearance"
msgstr "Itxura"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:195
msgid "Dark theme"
msgstr "Gai iluna"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:201
msgid "Render window shadows"
msgstr "Leihoetako itzalak errenderizatzea"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed"
msgstr "Desaktibatu leihoa erabiltzen denean errendimendua handitzeko"
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr "Pluginen sailkapena"
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr "Aldatu GStreamer-en pluginen lehenetsitako mailak"
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr "Playbin3 erabili"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr "Berrabiaraztea eskatzen du"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
msgstr "Esperimentala"
#: 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 "Erabili PipeWire audio-irteerarako"
msgstr ""
#: src/buttons.js:201
#, javascript-format
msgid "Decoder: %s"
msgstr "Deskodetzailea: %s"
msgstr ""
#: src/dialogs.js:152
msgid "Enter or drop URI here"
msgstr "Sartu edo utzi URIa erortzen hemen"
msgstr ""
#: src/dialogs.js:157
msgid "Cancel"
msgstr "Ezeztatu"
msgstr ""
#: src/dialogs.js:158
msgid "Open"
msgstr "Ireki"
msgstr ""
#: src/dialogs.js:226
msgid "Title"
msgstr "Titulua"
msgstr ""
#: src/dialogs.js:227
msgid "Completed"
msgstr "Osatuta"
msgstr ""
#: src/dialogs.js:235
msgid "Resume playback?"
msgstr "Jarraitu erreprodukzioarekin?"
msgstr ""
#: src/dialogs.js:289
#, javascript-format
msgid "GTK version: %s"
msgstr "GTK bertsioa: %s"
msgstr ""
#: src/dialogs.js:290
#, javascript-format
msgid "Adwaita version: %s"
msgstr "Adwaitaren bertsioa: %s"
msgstr ""
#: src/dialogs.js:291
#, javascript-format
msgid "GStreamer version: %s"
msgstr "GStreamer-en bertsioa: %s"
msgstr ""
#: src/dialogs.js:292
#, javascript-format
msgid "GJS version: %s"
msgstr "GJS bertsioa: %s"
msgstr ""
#: src/dialogs.js:300
msgid "A GNOME media player powered by GStreamer"
msgstr "GNOMEren multimedia erreproduzitzaile bat GStreamer-ekin"
msgstr ""
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305
msgid "translator-credits"
msgstr "Sergio Varela (@IngrownMink4)"
msgstr ""
#: src/revealers.js:170
#, javascript-format
msgid "Ends at: %s"
msgstr "Amaiera: %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 "Zehaztugabea"
msgstr ""
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr "Kanalak"
msgstr ""
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr "Desgaituta"
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é"

165
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-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: Hebrew\n"
"Language: he_IL\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/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"

373
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: 2021-09-14 15:25\n"
"Last-Translator: \n"
"Language-Team: Japanese\n"
"Language: ja_JP\n"
@@ -19,420 +19,441 @@ msgstr ""
#: ui/clapper.ui:6
msgid "Open Files…"
msgstr "ファイルを開く…"
msgstr ""
#: ui/clapper.ui:10
msgid "Open URI…"
msgstr "URIを開く…"
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 "OSDを表示 (全画面表示の場合のみ)"
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 "URIを開く"
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 "Long press | Right click"
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 "ここにURIを入力またはドロップ"
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 "GStreamerを使用したGNOME向けのメディアプレーヤー"
msgstr ""
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305
msgid "translator-credits"
msgstr "翻訳者"
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 "Disabled"
msgstr ""

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 ""

169
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: 2021-09-14 16:21\n"
"Last-Translator: \n"
"Language-Team: Dutch\n"
"Language: nl_NL\n"
@@ -39,13 +39,14 @@ msgstr "Over Clapper"
#: ui/elapsed-time-button.ui:27
msgid "Speed"
msgstr "Snelheid"
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 "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"
@@ -163,7 +164,7 @@ msgstr "Omlaag vegen/scrollen"
#: ui/help-overlay.ui:133
msgid "Toggle mute"
msgstr "Geluid dempen"
msgstr ""
#: ui/help-overlay.ui:139
msgid "Next chapter"
@@ -181,238 +182,258 @@ 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"
msgstr ""
#: 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"
msgstr ""
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr "Experimenteel"
msgstr ""
#: ui/preferences-window.ui:228
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output"
msgstr "PipeWire gebruiken voor audio-uitvoer"
msgstr ""
#: src/buttons.js:201
#, javascript-format
msgid "Decoder: %s"
msgstr "Decoder: %s"
msgstr ""
#: src/dialogs.js:152
msgid "Enter or drop URI here"
msgstr "Voer een uri in of sleep een uri hierheen"
msgstr ""
#: src/dialogs.js:157
msgid "Cancel"
msgstr "Annuleren"
msgstr ""
#: src/dialogs.js:158
msgid "Open"
msgstr "Openen"
msgstr ""
#: src/dialogs.js:226
msgid "Title"
msgstr "Titel"
msgstr ""
#: src/dialogs.js:227
msgid "Completed"
msgstr "Voltooid"
msgstr ""
#: src/dialogs.js:235
msgid "Resume playback?"
msgstr "Afspelen hervatten?"
msgstr ""
#: src/dialogs.js:289
#, javascript-format
msgid "GTK version: %s"
msgstr "GTK versie: %s"
msgstr ""
#: src/dialogs.js:290
#, javascript-format
msgid "Adwaita version: %s"
msgstr "Adwaita-versie: %s"
msgstr ""
#: src/dialogs.js:291
#, javascript-format
msgid "GStreamer version: %s"
msgstr "GStreamer-versie: %s"
msgstr ""
#: src/dialogs.js:292
#, javascript-format
msgid "GJS version: %s"
msgstr "GJS-versie: %s"
msgstr ""
#: src/dialogs.js:300
msgid "A GNOME media player powered by GStreamer"
msgstr "Een door GStreamer aangedreven GNOME-mediaspeler"
msgstr ""
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305
@@ -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"
msgstr ""
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr "Kanalen"
msgstr ""
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr "Uitgeschakeld"
msgstr ""

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"

333
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: 2021-10-21 00:29\n"
"Last-Translator: \n"
"Language-Team: Portuguese\n"
"Language: pt_PT\n"
@@ -19,7 +19,7 @@ msgstr ""
#: ui/clapper.ui:6
msgid "Open Files…"
msgstr "Abrir ficheiros…"
msgstr "Abrir Arquivos…"
#: ui/clapper.ui:10
msgid "Open URI…"
@@ -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"
@@ -103,336 +104,356 @@ msgstr "Toque duplo (lado direito)"
#: ui/help-overlay.ui:74
msgid "Previous item"
msgstr "Item anterior"
msgstr ""
#: ui/help-overlay.ui:75
msgid "Double tap (left side)"
msgstr "Toque duplo (lado esquerdo)"
msgstr ""
#: ui/help-overlay.ui:81
msgid "Change repeat mode"
msgstr "Alterar modo de repetição"
msgstr ""
#: ui/help-overlay.ui:87
msgid "Export to file"
msgstr "Exportar para ficheiro"
msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr "Reproduzir"
msgstr ""
#: ui/help-overlay.ui:98
msgid "Toggle play"
msgstr "Alternar reprodução"
msgstr ""
#: ui/help-overlay.ui:99
msgid "Long press | Right click"
msgstr "Toque longo | Clique com o botão direito"
msgstr ""
#: ui/help-overlay.ui:105
msgid "Seek forward"
msgstr "Procurar para a frente"
msgstr ""
#: ui/help-overlay.ui:106
msgid "Swipe right | Scroll right"
msgstr "Deslizar para a direita | Deslocar para direita"
msgstr ""
#: ui/help-overlay.ui:112
msgid "Seek backward"
msgstr "Procurar para trás"
msgstr ""
#: ui/help-overlay.ui:113
msgid "Swipe left | Scroll left"
msgstr "Deslizar para a esquerda | Deslocar para a esquerda"
msgstr ""
#: ui/help-overlay.ui:119
msgid "Volume up"
msgstr "Aumentar o volume"
msgstr ""
#: ui/help-overlay.ui:120
msgid "Swipe up | Scroll up"
msgstr "Deslizar para cima | Deslocar para cima"
msgstr ""
#: ui/help-overlay.ui:126
msgid "Volume down"
msgstr "Diminuir o volume"
msgstr ""
#: ui/help-overlay.ui:127
msgid "Swipe down | Scroll down"
msgstr "Deslizar para baixo | Deslocar para baixo"
msgstr ""
#: ui/help-overlay.ui:133
msgid "Toggle mute"
msgstr "Ativar/Desativar Som"
msgstr ""
#: ui/help-overlay.ui:139
msgid "Next chapter"
msgstr "Capítulo seguinte"
msgstr ""
#: ui/help-overlay.ui:145
msgid "Previous chapter"
msgstr "Capítulo anterior"
msgstr ""
#: ui/preferences-plugin-ranking-subpage.ui:11
msgid "Decoders"
msgstr "Descodificadores"
msgstr ""
#: ui/preferences-plugin-ranking-subpage.ui:18
msgid "Return to the preferences"
msgstr "Voltar para as preferências"
msgstr ""
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr "Comportamento"
#: ui/preferences-window.ui:18
msgid "Auto fullscreen"
msgstr "Ecrã inteiro automático"
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 "Entrar em ecrã inteiro quando a lista de reprodução é substituída, excepto no modo flutuante"
msgstr ""
#: 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
msgid "Float on all workspaces"
msgstr "Flutuar em todas as áreas de trabalho"
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 "Esta opção apenas funciona no GNOME"
msgstr ""
#: ui/preferences-window.ui:38
#: ui/preferences-window.ui:39
msgid "After playback"
msgstr "Após reprodução"
#: ui/preferences-window.ui:43
msgid "Do nothing"
msgstr "Não fazer nada"
msgstr ""
#: ui/preferences-window.ui:44
msgid "Freeze last frame"
msgstr "Suster o fotograma"
msgid "Do nothing"
msgstr ""
#: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:46
msgid "Close the app"
msgstr "Fechar a aplicação"
msgstr ""
#: ui/preferences-window.ui:55
#: ui/preferences-window.ui:56
msgid "Volume"
msgstr "Volume"
#: ui/preferences-window.ui:58
msgid "Custom initial value"
msgstr "Valor inicial personalizado"
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 "Definir volume personalizado no arranque ao invés de restaurá-lo"
msgstr ""
#: ui/preferences-window.ui:63
#: ui/preferences-window.ui:64
msgid "Volume percentage"
msgstr "Percentagem de volume"
msgstr ""
#: ui/preferences-window.ui:74
#: ui/preferences-window.ui:75
msgid "Seeking"
msgstr "Procurando"
msgstr ""
#: ui/preferences-window.ui:77
#: ui/preferences-window.ui:78
msgid "Mode"
msgstr "Modo"
#: ui/preferences-window.ui:83
msgid "Accurate"
msgstr "Preciso"
msgstr ""
#: ui/preferences-window.ui:84
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:85
msgid "Fast"
msgstr "Rápido"
msgstr ""
#: ui/preferences-window.ui:92
#: ui/preferences-window.ui:93
msgid "Unit"
msgstr "Unidade"
#: ui/preferences-window.ui:97
msgid "Second"
msgstr "Segundo"
msgstr ""
#: ui/preferences-window.ui:98
msgid "Minute"
msgstr "Minuto"
msgid "Second"
msgstr ""
#: ui/preferences-window.ui:99
msgid "Minute"
msgstr ""
#: ui/preferences-window.ui:100
msgid "Percentage"
msgstr "Percentagem"
msgstr ""
#: ui/preferences-window.ui:107
#: ui/preferences-window.ui:108
msgid "Value"
msgstr "Valor"
msgstr ""
#: ui/preferences-window.ui:122
#: ui/preferences-window.ui:123
msgid "Audio"
msgstr "Áudio"
msgstr ""
#: ui/preferences-window.ui:125
#: ui/preferences-window.ui:126
msgid "Offset in milliseconds"
msgstr "Deslocamento em milissegundos"
msgstr ""
#: ui/preferences-window.ui:132
#: ui/preferences-window.ui:133
msgid "Only native audio formats"
msgstr "Apenas formatos de áudio nativos"
msgstr ""
#: ui/preferences-window.ui:140
#: ui/preferences-window.ui:141
msgid "Subtitles"
msgstr "Legendas"
msgstr ""
#: ui/preferences-window.ui:143
#: ui/preferences-window.ui:144
msgid "Default font"
msgstr "Tipo de letra predefinida"
msgstr ""
#: ui/preferences-window.ui:153
#: ui/preferences-window.ui:154
msgid "Network"
msgstr "Rede"
msgstr ""
#: ui/preferences-window.ui:157
#: ui/preferences-window.ui:158
msgid "Client"
msgstr "Cliente"
msgstr ""
#: ui/preferences-window.ui:160
#: ui/preferences-window.ui:161
msgid "Progressive download buffering"
msgstr "Buffering de transferência progressiva"
msgstr ""
#: ui/preferences-window.ui:168
#: ui/preferences-window.ui:169
msgid "Server"
msgstr "Servidor"
msgstr ""
#: ui/preferences-window.ui:171
#: ui/preferences-window.ui:172
msgid "Control player remotely"
msgstr "Controlar reprodutor remotamente"
msgstr ""
#: ui/preferences-window.ui:175
#: ui/preferences-window.ui:176
msgid "Listening port"
msgstr "Porta de escuta"
msgstr ""
#: ui/preferences-window.ui:188
msgid "Tweaks"
msgstr "Ajustes"
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:192
msgid "Appearance"
msgstr "Aparência"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:195
msgid "Dark theme"
msgstr "Tema escuro"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:201
msgid "Render window shadows"
msgstr "Renderizar sombras das janelas"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed"
msgstr "Desativar para aumentar o desempenho quando em janela"
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr "Classificação do plugin"
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr "Altera as classificações predefinidas dos plugins GStreamer"
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr "Usar playbin3"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr "Requer o reinício do reprodutor"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
msgstr "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 "Usar o PipeWire para a saída áudio"
msgstr ""
#: src/buttons.js:201
#, javascript-format
msgid "Decoder: %s"
msgstr "Descodificador: %s"
msgstr ""
#: src/dialogs.js:152
msgid "Enter or drop URI here"
msgstr "Introduzir ou largar o URI aqui"
msgstr ""
#: src/dialogs.js:157
msgid "Cancel"
msgstr "Cancelar"
msgstr ""
#: src/dialogs.js:158
msgid "Open"
msgstr "Abrir"
msgstr ""
#: src/dialogs.js:226
msgid "Title"
msgstr "Título"
msgstr ""
#: src/dialogs.js:227
msgid "Completed"
msgstr "Concluído"
msgstr ""
#: src/dialogs.js:235
msgid "Resume playback?"
msgstr "Retomar a reprodução?"
msgstr ""
#: src/dialogs.js:289
#, javascript-format
msgid "GTK version: %s"
msgstr "Versão do GTK: %s"
msgstr ""
#: src/dialogs.js:290
#, javascript-format
msgid "Adwaita version: %s"
msgstr "Versão do Adwaita: %s"
msgstr ""
#: src/dialogs.js:291
#, javascript-format
msgid "GStreamer version: %s"
msgstr "Versão do GStreamer: %s"
msgstr ""
#: src/dialogs.js:292
#, javascript-format
msgid "GJS version: %s"
msgstr "Versão do GJS: %s"
msgstr ""
#: src/dialogs.js:300
msgid "A GNOME media player powered by GStreamer"
msgstr "Um reprodutor multimédia GNOME desenvolvido por GStreamer"
msgstr ""
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305
msgid "translator-credits"
msgstr "Hugo Carvalho <hugokarvalho@hotmail.com>"
msgstr ""
#: src/revealers.js:170
#, javascript-format
msgid "Ends at: %s"
msgstr "Termina às: %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 "Indeterminado"
msgstr ""
#: src/widget.js:242
#: src/widget.js:243
msgid "Channels"
msgstr "Canais"
msgstr ""
#: src/widget.js:260
#: src/widget.js:261
msgid "Disabled"
msgstr "Desativado"
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-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"

253
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-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: Turkish\n"
"Language: tr_TR\n"
@@ -19,345 +19,366 @@ msgstr ""
#: ui/clapper.ui:6
msgid "Open Files…"
msgstr "Dosya Aç…"
msgstr ""
#: ui/clapper.ui:10
msgid "Open URI…"
msgstr "URL Aç…"
msgstr ""
#: ui/clapper.ui:16 ui/preferences-window.ui:4
msgid "Preferences"
msgstr "Tercihler"
msgstr ""
#: ui/clapper.ui:20
msgid "Shortcuts"
msgstr "Kısayollar"
msgstr ""
#: ui/clapper.ui:26
msgid "About Clapper"
msgstr "Clapper Hakkında"
msgstr ""
#: ui/elapsed-time-button.ui:27
msgid "Speed"
msgstr "Hız"
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 "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 "Genel"
msgstr ""
#: ui/help-overlay.ui:13
msgid "Show shortcuts"
msgstr "Kısayolları göster"
msgstr ""
#: ui/help-overlay.ui:19
msgid "Toggle fullscreen"
msgstr "Tam ekran"
msgstr ""
#: ui/help-overlay.ui:20
msgid "Double tap | Double click"
msgstr "Çift dokun | Çift tıkla"
msgstr ""
#: ui/help-overlay.ui:26
msgid "Leave fullscreen"
msgstr "Tam ekrandan çık"
msgstr ""
#: ui/help-overlay.ui:32
msgid "Reveal OSD (fullscreen only)"
msgstr "Pencere Düğmelerini Göster (yalnızca tam ekran)"
msgstr ""
#: ui/help-overlay.ui:33
msgid "Tap"
msgstr "Dokun"
msgstr ""
#: ui/help-overlay.ui:39
msgid "Quit"
msgstr "Çık"
msgstr ""
#: ui/help-overlay.ui:47
msgid "Media"
msgstr "Ortam"
msgstr ""
#: ui/help-overlay.ui:50
msgid "Open files"
msgstr "Dosyaları"
msgstr ""
#: ui/help-overlay.ui:56 src/dialogs.js:137
msgid "Open URI"
msgstr "URL Aç"
msgstr ""
#: ui/help-overlay.ui:64
msgid "Playlist"
msgstr "Oynatma listesi"
msgstr ""
#: ui/help-overlay.ui:67
msgid "Next item"
msgstr "Sonraki öğe"
msgstr ""
#: ui/help-overlay.ui:68
msgid "Double tap (right side)"
msgstr "Çift tıkla (sağ tarafa)"
msgstr ""
#: ui/help-overlay.ui:74
msgid "Previous item"
msgstr "Önceki öğe"
msgstr ""
#: ui/help-overlay.ui:75
msgid "Double tap (left side)"
msgstr "Çift tıkla (sol tarafa)"
msgstr ""
#: ui/help-overlay.ui:81
msgid "Change repeat mode"
msgstr "Tekrarlı oynatma modunu değiştir"
msgstr ""
#: ui/help-overlay.ui:87
msgid "Export to file"
msgstr "Dosyaya aktar"
msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119
msgid "Playback"
msgstr "Oynatma"
msgstr ""
#: ui/help-overlay.ui:98
msgid "Toggle play"
msgstr "Oynatmayı başlat"
msgstr ""
#: ui/help-overlay.ui:99
msgid "Long press | Right click"
msgstr "Uzun bas | Sağ tıkla"
msgstr ""
#: ui/help-overlay.ui:105
msgid "Seek forward"
msgstr "İleri sar"
msgstr ""
#: ui/help-overlay.ui:106
msgid "Swipe right | Scroll right"
msgstr "Sağa sürükle | Sağa kaydır"
msgstr ""
#: ui/help-overlay.ui:112
msgid "Seek backward"
msgstr "Geri sar"
msgstr ""
#: ui/help-overlay.ui:113
msgid "Swipe left | Scroll left"
msgstr "Sola sürükle | Sola kaydır"
msgstr ""
#: ui/help-overlay.ui:119
msgid "Volume up"
msgstr "Sesi artır"
msgstr ""
#: ui/help-overlay.ui:120
msgid "Swipe up | Scroll up"
msgstr "Yukarı sürükle | Yukarı kaydır"
msgstr ""
#: ui/help-overlay.ui:126
msgid "Volume down"
msgstr "Sesi kıs"
msgstr ""
#: ui/help-overlay.ui:127
msgid "Swipe down | Scroll down"
msgstr "Aşağı sürükle | Aşağı kaydır"
msgstr ""
#: ui/help-overlay.ui:133
msgid "Toggle mute"
msgstr "Sesi kapat"
msgstr ""
#: ui/help-overlay.ui:139
msgid "Next chapter"
msgstr "Sonraki parça"
msgstr ""
#: ui/help-overlay.ui:145
msgid "Previous chapter"
msgstr "Önceki parça"
msgstr ""
#: ui/preferences-plugin-ranking-subpage.ui:11
msgid "Decoders"
msgstr "Çözücüler"
msgstr ""
#: ui/preferences-plugin-ranking-subpage.ui:18
msgid "Return to the preferences"
msgstr "Tercihlere geri dön"
msgstr ""
#: ui/preferences-window.ui:15
#: ui/preferences-window.ui:16
msgid "Behavior"
msgstr "Davranış"
#: ui/preferences-window.ui:18
msgid "Auto fullscreen"
msgstr "Otomatik tam ekran"
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 ""
#: 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/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-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: Chinese Simplified\n"
"Language: zh_CN\n"
@@ -41,21 +41,22 @@ 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 "常规​​​​​"
#: 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"
@@ -115,11 +116,11 @@ 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"
@@ -163,7 +164,7 @@ msgstr "向下滑动 | 向下滚动"
#: ui/help-overlay.ui:133
msgid "Toggle mute"
msgstr "切换静音"
msgstr ""
#: ui/help-overlay.ui:139
msgid "Next chapter"
@@ -179,185 +180,205 @@ 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
#: 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
msgid "Tweaks"
msgstr "调整"
#: ui/preferences-window.ui:183
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:192
#: 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: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 ""
#: 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 输出音频"
@@ -417,22 +438,22 @@ msgstr ""
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305
msgid "translator-credits"
msgstr "刘韬"
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 ""
#: 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

@@ -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

@@ -20,8 +20,11 @@ class ClapperPlayer extends GstClapper.Clapper
const use_legacy_sink = GLib.getenv('CLAPPER_USE_LEGACY_SINK');
if(!use_legacy_sink || use_legacy_sink != '1') {
vsink = Gst.ElementFactory.make('clappersink', null);
this.clappersink = vsink;
vsink = Gst.parse_bin_from_description('glupload ! glcolorconvert'
+ ' ! clapperglimport ! clappersink name=clappersink', true);
if(vsink)
this.clappersink = vsink.get_by_name('clappersink');
}
if(!vsink) {
@@ -66,6 +69,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 +101,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 = {};