16#include <rtl/string.hxx>
31 =
u"com.sun.star.comp.avmedia.Player_Gtk";
43 , m_nNotifySignalId(0)
44 , m_nInvalidateSizeSignalId(0)
54 g_object_unref(user_data);
73 if (g_main_context_default())
93 xThis->notifyListeners();
94 xThis->uninstallNotify();
101 if (g_str_equal(pspec->name,
"prepared") || g_str_equal(pspec->name,
"error"))
143 GFile* pFile = g_file_new_for_uri(
OUStringToOString(rURL, RTL_TEXTENCODING_UTF8).getStr());
144 m_pStream = gtk_media_file_new_for_file(pFile);
145 g_object_unref(pFile);
147 bRet = gtk_media_stream_get_error(
m_pStream) ==
nullptr;
165 css::lang::EventObject
aEvent;
166 aEvent.Source = getXWeak();
171 css::uno::Reference<css::media::XPlayerListener> xListener(
172 static_cast<css::media::XPlayerListener*
>(pIterator.
next()));
173 xListener->preferredPlayerWindowSizeAvailable(
aEvent);
200 bRet = gtk_media_stream_get_playing(
m_pStream);
209 double duration = 0.0;
212 duration = gtk_media_stream_get_duration(
m_pStream) / 1000000.0;
224 gint64 gst_position = llround(fTime * 1000000);
226 gtk_media_stream_seek(
m_pStream, gst_position);
231 if (gst_position == 0 && gtk_media_stream_is_prepared(
m_pStream))
232 gtk_media_stream_update(
m_pStream, gst_position);
250 gtk_media_stream_set_loop(
m_pStream, bSet);
256 return gtk_media_stream_get_loop(
m_pStream);
266 bool bMuted = gtk_media_stream_get_muted(
m_pStream);
267 if (bMuted ==
static_cast<bool>(bSet))
269 gtk_media_stream_set_muted(
m_pStream, bSet);
277 return gtk_media_stream_get_muted(
m_pStream);
287 gtk_media_stream_set_volume(
m_pStream, fValue);
294 if (gtk_media_stream_get_muted(
m_pStream))
297 double fVolume = gtk_media_stream_get_volume(
m_pStream);
308 awt::Size aSize(0, 0);
312 aSize.Width = gdk_paintable_get_intrinsic_width(GDK_PAINTABLE(
m_pStream));
313 aSize.Height = gdk_paintable_get_intrinsic_height(GDK_PAINTABLE(
m_pStream));
319uno::Reference<::media::XPlayerWindow>
324 uno::Reference<::media::XPlayerWindow> xRet;
326 if (rArguments.getLength() > 1)
329 if (rArguments.getLength() <= 2)
331 xRet = new ::avmedia::gstreamer::Window;
335 sal_IntPtr pIntPtr = 0;
336 rArguments[2] >>= pIntPtr;
346#if GTK_CHECK_VERSION(4, 7, 2)
347 gtk_picture_set_content_fit(GTK_PICTURE(
m_pVideo), GTK_CONTENT_FIT_FILL);
349 gtk_picture_set_keep_aspect_ratio(GTK_PICTURE(
m_pVideo),
false);
351 gtk_widget_set_can_target(
m_pVideo,
false);
352 gtk_widget_set_vexpand(
m_pVideo,
true);
353 gtk_widget_set_hexpand(
m_pVideo,
true);
356 gtk_widget_set_can_target(pParent,
false);
357 gtk_grid_attach(GTK_GRID(pParent),
m_pVideo, 0, 0, 1, 1);
362 gtk_widget_show(pParent);
365 xRet = new ::avmedia::gstreamer::Window;
374 if (gtk_media_stream_is_prepared(
m_pStream))
376 css::lang::EventObject
aEvent;
377 aEvent.Source = getXWeak();
378 rListener->preferredPlayerWindowSizeAvailable(
aEvent);
392class GtkFrameGrabber :
public ::cppu::WeakImplHelper<css::media::XFrameGrabber>
406 virtual ~GtkFrameGrabber()
override { g_object_unref(
m_pStream); }
409 virtual css::uno::Reference<css::graphic::XGraphic>
410 SAL_CALL grabFrame(
double fMediaTime)
override
412 gint64 gst_position = llround(fMediaTime * 1000000);
413 gtk_media_stream_seek(
m_pStream, gst_position);
416 = cairo_image_surface_create(CAIRO_FORMAT_ARGB32,
m_aSize.Width,
m_aSize.Height);
418 GtkSnapshot* snapshot = gtk_snapshot_new();
420 GskRenderNode* node = gtk_snapshot_free_to_node(snapshot);
422 cairo_t* cr = cairo_create(surface);
423 gsk_render_node_draw(node, cr);
426 gsk_render_node_unref(node);
428 std::unique_ptr<BitmapEx> xBitmap(
431 cairo_surface_destroy(surface);
446 if (aPrefSize.Width > 0 && aPrefSize.Height > 0)
447 xFrameGrabber.set(
new GtkFrameGrabber(
m_pStream, aPrefSize));
449 return xFrameGrabber;
struct _cairo_surface cairo_surface_t
css::uno::Reference< css::graphic::XGraphic > GetXGraphic() const
virtual const SystemEnvData * GetSystemData() const override
css::uno::XInterface * next()
bool hasMoreElements() const
OInterfaceContainerHelper2 * getContainer(const css::uno::Type &rKey) const
sal_Int32 removeInterface(const css::uno::Type &rKey, const css::uno::Reference< css::uno::XInterface > &rxIFace)
sal_Int32 addInterface(const css::uno::Type &rKey, const css::uno::Reference< css::uno::XInterface > &r)
mutable::osl::Mutex m_aMutex
constexpr OUStringLiteral AVMEDIA_GTK_PLAYER_IMPLEMENTATIONNAME
constexpr OUStringLiteral AVMEDIA_GTK_PLAYER_SERVICENAME
GtkMediaStream * m_pStream
struct _GtkWidget GtkWidget
struct _GtkMediaStream GtkMediaStream
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
OString OUStringToOString(std::u16string_view str, ConnectionSettings const *settings)
#define SAL_WNODEPRECATED_DECLARATIONS_POP
#define SAL_WNODEPRECATED_DECLARATIONS_PUSH