XV-Display: start a research project to port the existing code (see #1403)

- initial assessment shows that the Design of the **Displayer** framework is adequate
 - for context: this code originates from the »Kino« video editor 20 years ago
 - notably the `XvDisplayer` contains almost no GTK(2)-code
 - so it seems feasible to attempt a port to GTK-3

This is a limited research project, and the setup shall be based mostly on existing code.
In the early stage of the Lumiera application, we did some architecture studies
regarding ongoing video generation and display, resulting in a `DemoVideoPlayer`.

This code was broken by the GTK-3 transition, but kept in-tree for later referral.
For this research project, we can mostly short-circuit all of the layer separation
and service communication stuff and build a minimal invocation directly hooked-up
behind the GUI widget. In preparation for such a setup, the existing
demo player code is partially forked by this changeset, pushing aside
the (defunct) !DummyPlayer pseudo-subsystem.
This commit is contained in:
Fischlurch 2025-05-02 23:19:55 +02:00
parent 998e225490
commit 0ae96294e8
17 changed files with 778 additions and 71 deletions

View file

@ -0,0 +1,113 @@
/*
DemoController - playback controller object
Copyright (C)
2008, Joel Holdsworth <joel@airwebreathe.org.uk>
2025, Hermann Vosseler <Ichthyostega@web.de>
  **Lumiera** is free software; you can redistribute it and/or modify it
  under the terms of the GNU General Public License as published by the
  Free Software Foundation; either version 2 of the License, or (at your
  option) any later version. See the file COPYING for further details.
* *****************************************************************/
/** @file demo-controller.cpp
** Implementation parts of PlaybackController.
** @todo 5/2025 now used for a research project for XV video display ////////////////////////////////////TICKET #1403 : attempt to upgrade the XV displayer
*/
#include "stage/ctrl/demo-controller.hpp"
#include "stage/display-service.hpp"
#include "lib/error.hpp"
#include "include/logging.h"
namespace stage {
namespace ctrl {
namespace error = lumiera::error;
DemoController::DemoController()
: playing_(false)
, viewerHandle_(0)
{
instance = this; ////////////////////////////////////////////////////////TICKET #1067 shitty workaround to allow disentangling of top-level
}
DemoController::~DemoController()
{
instance = nullptr; ////////////////////////////////////////////////////////TICKET #1067 shitty workaround to allow disentangling of top-level
}
DemoController* DemoController::instance; ////////////////////////////////////////////////////////TICKET #1067 shitty workaround to allow disentangling of top-level
DemoController&
DemoController::get() ////////////////////////////////////////////////////////TICKET #1067 shitty workaround to allow disentangling of top-level
{
if (not instance)
throw error::Logic ("GTK UI is not in running state"
, LERR_(LIFECYCLE));
return *instance;
}
void
DemoController::play()
{
if (playHandle_)
{
playHandle_.play(true);
playing_ = true;
}
else if (viewerHandle_)
try
{
playHandle_ = lumiera::DummyPlayer::facade().start (viewerHandle_);
playing_ = true;
}
catch (lumiera::error::State& err)
{
WARN (stage, "failed to start playback: %s" ,err.what());
lumiera_error();
playing_ = false;
}
}
void
DemoController::pause()
{
if (playHandle_)
playHandle_.play(false);
playing_ = false;
}
void
DemoController::stop()
{
playHandle_.close();
playing_ = false;
}
bool
DemoController::is_playing()
{
return playing_;
}
void
DemoController::useDisplay (LumieraDisplaySlot display)
{
viewerHandle_ = display;
}
}} // namespace stage::ctrl

View file

@ -0,0 +1,83 @@
/*
DEMO-CONTROLLER.hpp - playback controller object
Copyright (C)
2009, Joel Holdsworth <joel@airwebreathe.org.uk>
2025, Hermann Vosseler <Ichthyostega@web.de>
  **Lumiera** is free software; you can redistribute it and/or modify it
  under the terms of the GNU General Public License as published by the
  Free Software Foundation; either version 2 of the License, or (at your
  option) any later version. See the file COPYING for further details.
*/
/** @file demo-controller.hpp
** This file contains the definition of the playback controller object.
**
** @deprecated this represents an early design of playback and will be reworked
** @remarks what we actually need is a PlaybackController as a shell or proxy
** to maintain a flexible link to ongoing processes in the core. But note,
** this is also related to the Displayer service, which needs to be offered
** by the UI, so we create a mutual dependency here, and there is not much
** that can be done about this.
** @todo as a temporary solution, 1/2017 the playback controller was moved
** into the viewer panel. Of course it can not work that way....
** @todo 5/2025 now used for a research project for XV video display ////////////////////////////////////TICKET #1403 : attempt to upgrade the XV displayer
*/
#ifndef DEMO_CONTROLLER_H
#define DEMO_CONTROLLER_H
#include "stage/gtk-base.hpp"
#include "include/dummy-player-facade.h"
#include "include/display-facade.h"
#include "lib/nocopy.hpp"
namespace stage {
namespace ctrl {
/** @deprecated we need a durable design for the playback process */
class DemoController
: util::NonCopyable
{
volatile bool playing_;
lumiera::DummyPlayer::Process playHandle_;
LumieraDisplaySlot viewerHandle_;
static DemoController* instance; /////////////////////////////////////////////////////////////////////TICKET #1067 shitty workaround to allow disentangling of top-level
public:
DemoController();
~DemoController();
static DemoController& get(); /////////////////////////////////////////////////////////////////////TICKET #1067 shitty workaround to allow disentangling of top-level
void play();
void pause();
void stop();
bool is_playing();
void useDisplay (LumieraDisplaySlot display);
private:
void on_frame();
};
}} // namespace stage::ctrl
#endif /*DEMO_CONTROLLER_H*/

View file

@ -20,7 +20,7 @@
*/
#include "stage/ctrl/playback-controller.hpp"
#include "stage/ctrl/player-controller.hpp"
#include "stage/display-service.hpp"
#include "lib/error.hpp"
#include "include/logging.h"
@ -33,23 +33,23 @@ namespace ctrl {
PlaybackController::PlaybackController()
PlayerController::PlayerController()
: playing_(false)
, viewerHandle_(0)
{
instance = this; ////////////////////////////////////////////////////////TICKET #1067 shitty workaround to allow disentangling of top-level
}
PlaybackController::~PlaybackController()
PlayerController::~PlayerController()
{
instance = nullptr; ////////////////////////////////////////////////////////TICKET #1067 shitty workaround to allow disentangling of top-level
}
PlaybackController* PlaybackController::instance; ////////////////////////////////////////////////////////TICKET #1067 shitty workaround to allow disentangling of top-level
PlayerController* PlayerController::instance; ////////////////////////////////////////////////////////TICKET #1067 shitty workaround to allow disentangling of top-level
PlaybackController&
PlaybackController::get() ////////////////////////////////////////////////////////TICKET #1067 shitty workaround to allow disentangling of top-level
PlayerController&
PlayerController::get() ////////////////////////////////////////////////////////TICKET #1067 shitty workaround to allow disentangling of top-level
{
if (not instance)
throw error::Logic ("GTK UI is not in running state"
@ -59,7 +59,7 @@ namespace ctrl {
}
void
PlaybackController::play()
PlayerController::play()
{
if (playHandle_)
{
@ -81,7 +81,7 @@ namespace ctrl {
}
void
PlaybackController::pause()
PlayerController::pause()
{
if (playHandle_)
playHandle_.play(false);
@ -89,14 +89,14 @@ namespace ctrl {
}
void
PlaybackController::stop()
PlayerController::stop()
{
playHandle_.close();
playing_ = false;
}
bool
PlaybackController::is_playing()
PlayerController::is_playing()
{
return playing_;
}
@ -104,7 +104,7 @@ namespace ctrl {
void
PlaybackController::useDisplay (LumieraDisplaySlot display)
PlayerController::useDisplay (LumieraDisplaySlot display)
{
viewerHandle_ = display;
}

View file

@ -21,14 +21,15 @@
** this is also related to the Displayer service, which needs to be offered
** by the UI, so we create a mutual dependency here, and there is not much
** that can be done about this.
** @warning as a temporary solution, 1/2017 the playback controller was moved
** @todo as a temporary solution, 1/2017 the playback controller was moved
** into the viewer panel. Of course it can not work that way....
** @todo 5/2025 now pushed aside in preparation for the »Playback Vertical Slice« //////////////////////TICKET #1273 : develop a Viewer-Connection concept
** @todo create a durable PlaybacController design //////////////////////////////////////////////////////TICKET #1072
*/
#ifndef PLAYBACK_CONTROLLER_HPP
#define PLAYBACK_CONTROLLER_HPP
#ifndef PLAYER_CONTROLLER_H
#define PLAYER_CONTROLLER_H
#include "stage/gtk-base.hpp"
#include "include/dummy-player-facade.h"
@ -43,7 +44,7 @@ namespace ctrl {
/** @deprecated we need a durable design for the playback process */
class PlaybackController
class PlayerController
: util::NonCopyable
{
@ -53,14 +54,14 @@ namespace ctrl {
LumieraDisplaySlot viewerHandle_;
static PlaybackController* instance; ///////////////////////////////////////////////////////////////////TICKET #1067 shitty workaround to allow disentangling of top-level
static PlayerController* instance; ///////////////////////////////////////////////////////////////////TICKET #1067 shitty workaround to allow disentangling of top-level
public:
PlaybackController();
~PlaybackController();
PlayerController();
~PlayerController();
static PlaybackController& get(); ///////////////////////////////////////////////////////////////////TICKET #1067 shitty workaround to allow disentangling of top-level
static PlayerController& get(); ///////////////////////////////////////////////////////////////////TICKET #1067 shitty workaround to allow disentangling of top-level
void play();
void pause();
@ -78,5 +79,5 @@ namespace ctrl {
}} // namespace stage::ctrl
#endif // PLAYBACK_CONTROLLER_HPP
#endif /*PLAYER_CONTROLLER_H*/

View file

@ -28,7 +28,7 @@
#include "stage/gtk-base.hpp"
#include "stage/output/displayer.hpp"
#include "stage/output/xvdisplayer.hpp"
#include "stage/output/xv-displayer.hpp"
#include "stage/output/gdkdisplayer.hpp"
namespace stage {

View file

@ -0,0 +1,92 @@
/*
NullDisplayer.hpp - fallback video displayer to not display video at all
Copyright (C)
2025, Hermann Vosseler <Ichthyostega@web.de>
  **Lumiera** is free software; you can redistribute it and/or modify it
  under the terms of the GNU General Public License as published by the
  Free Software Foundation; either version 2 of the License, or (at your
  option) any later version. See the file COPYING for further details.
* *****************************************************************/
/** @file null-displayer.hpp
** Passive deactivated video displayer.
** @deprecated obsolete since GTK-3
** @todo WIP as of 5/2025 attempt to accommodate to GTK-3 ////////////////////////////////////////////////TICKET #1403
*/
#include "stage/gtk-base.hpp"
#include "stage/output/null-displayer.hpp"
#if false ///////////////////////////////////////////////////////////////////////////////////////////////////TICKET #950 : new solution for video display
#include <gdk/gdkx.h>
#endif ///////////////////////////////////////////////////////////////////////////////////////////////////TICKET #950 : new solution for video display
#include <iostream>
using std::cerr;
using std::endl;
namespace stage {
namespace output {
NullDisplayer::NullDisplayer (Gtk::Widget* drawing_area,
int width, int height)
: drawingArea( drawing_area )
{
REQUIRE (drawing_area != NULL);
REQUIRE (width > 0);
REQUIRE (height > 0);
imageWidth = width,
imageHeight = height;
}
bool
NullDisplayer::usable()
{
return false; /////////////////////////////////////////////////////////////////////////////////////////////TICKET #950 : new solution for video display
}
void
NullDisplayer::put (void* const image)
{
int video_x = 0,
video_y = 0,
video_width = 0,
video_height = 0;
calculateVideoLayout(
drawingArea->get_width(),
drawingArea->get_height(),
preferredWidth(), preferredHeight(),
video_x, video_y, video_width, video_height);
GdkWindow *window = drawingArea->get_window()->gobj();
REQUIRE (window != NULL);
#if false ///////////////////////////////////////////////////////////////////////////////////////////////////TICKET #950 : new solution for video display
GdkGC *gc = gdk_gc_new( window );
REQUIRE(gc != NULL);
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_data( (const guchar*)image, GDK_COLORSPACE_RGB, FALSE, 8,
preferredWidth(), preferredHeight(), preferredWidth() * 3, NULL, NULL );
REQUIRE(pixbuf != NULL);
GdkPixbuf *scaled_image = gdk_pixbuf_scale_simple( pixbuf, video_width, video_height, GDK_INTERP_NEAREST );
REQUIRE(scaled_image != NULL);
gdk_draw_pixbuf( window, gc, scaled_image, 0, 0, video_x, video_y, -1, -1, GDK_RGB_DITHER_NORMAL, 0, 0 );
g_object_unref( scaled_image );
g_object_unref( pixbuf );
g_object_unref( gc );
#endif ///////////////////////////////////////////////////////////////////////////////////////////////////TICKET #950 : new solution for video display
}
}} // namespace stage::output

View file

@ -0,0 +1,87 @@
/*
NULL-DISPLAYER.hpp - fallback video displayer to not display video at all
Copyright (C)
2025, Hermann Vosseler <Ichthyostega@web.de>
  **Lumiera** is free software; you can redistribute it and/or modify it
  under the terms of the GNU General Public License as published by the
  Free Software Foundation; either version 2 of the License, or (at your
  option) any later version. See the file COPYING for further details.
*/
/** @file null-displayer.hpp
** Passive deactivated video displayer.
**
** @deprecated obsolete since GTK-3
** @todo WIP as of 5/2025 attempt to accommodate to GTK-3 ////////////////////////////////////////////////TICKET #1403
** @see displayer.hpp
*/
#ifndef STAGE_OUTPUT_NULL_DISPLAYER_H
#define STAGE_OUTPUT_NULL_DISPLAYER_H
#include "stage/gtk-base.hpp"
#include "stage/output/displayer.hpp"
namespace Gtk {
class Widget;
}
namespace stage {
namespace output {
/**
* NullDisplayer implements the Displayer interface without any actual display.
*
* @todo the GdkDisplayer class is not supported anymore in Gtk3.
* This is due to Gtk3 only supporting drawing with Cairo
* ////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #950 : new solution for video display
* @todo WIP as of 5/2025 attempt to accommodate to GTK-3 /////////////////////////////////////////////////TICKET #1403
*/
class NullDisplayer
: public Displayer
{
public:
/**
* Constructor
* @param[in] drawing_area The widget into which the video image will
* be drawn. This value must not be NULL.
* @param[in] width The width of the video image in pixels. This value
* must be greater than zero.
* @param[in] height The height of the video image in pixels. This
* value must be greater than zero.
*/
NullDisplayer (Gtk::Widget* drawing_area, int width, int height );
/**
* Put an image of a given width and height with the expected input
* format (as indicated by the format method).
* @param[in] image The video image array to draw.
*/
void put (void* const image);
protected:
/**
* Indicates if this object can be used to render images on the
* running system.
*/
bool usable();
private:
/**
* The widget that video will be drawn into.
* @remarks This value must be a valid pointer.
*/
Gtk::Widget* drawingArea;
};
}} // namespace stage::output
#endif /*STAGE_OUTPUT_NULL_DISPLAYER_H*/

View file

@ -1,5 +1,5 @@
/*
GgdkDisplayer - displaying video via GDK
GdkDisplayer - displaying video via GDK
Copyright (C)
2000, Arne Schirmacher <arne@schirmacher.de>
@ -14,15 +14,16 @@
* *****************************************************************/
/** @file gdkdisplayer.cpp
/** @file pixbuf-displayer.cpp
** Dysfunctional implementation code, formerly used to
** create a video display based on GDK
** @deprecated obsolete since GTK-3
** @todo WIP as of 5/2025 attempt to accommodate to GTK-3 ////////////////////////////////////////////////TICKET #1403
*/
#include "stage/gtk-base.hpp"
#include "stage/output/gdkdisplayer.hpp"
#include "stage/output/pixbuf-displayer.hpp"
#if false ///////////////////////////////////////////////////////////////////////////////////////////////////TICKET #950 : new solution for video display
#include <gdk/gdkx.h>

View file

@ -14,15 +14,16 @@
*/
/** @file gdkdisplayer.hpp
/** @file pixbuf-displayer.hpp
** Display video via GDK
**
** @deprecated obsolete since GTK-3
** @todo WIP as of 5/2025 attempt to accommodate to GTK-3 ////////////////////////////////////////////////TICKET #1403
** @see displayer.hpp
*/
#ifndef STAGE_OUTPUT_GDKDISPLAYER_H
#define STAGE_OUTPUT_GDKDISPLAYER_H
#ifndef STAGE_OUTPUT_PIXBUF_DISPLAYER_H
#define STAGE_OUTPUT_PIXBUF_DISPLAYER_H
#include "stage/gtk-base.hpp"
#include "stage/output/displayer.hpp"
@ -40,7 +41,8 @@ namespace output {
*
* @todo the GdkDisplayer class is not supported anymore in Gtk3.
* This is due to Gtk3 only supporting drawing with Cairo
* /////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #950 : new solution for video display
* ////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #950 : new solution for video display
* @todo WIP as of 5/2025 attempt to accommodate to GTK-3 /////////////////////////////////////////////////TICKET #1403
*/
class GdkDisplayer
: public Displayer
@ -85,4 +87,4 @@ class GdkDisplayer
}} // namespace stage::output
#endif /*STAGE_OUTPUT_GDKDISPLAYER_H*/
#endif /*STAGE_OUTPUT_PIXBUF_DISPLAYER_H*/

View file

@ -16,16 +16,12 @@
/** @file xvdisplayer.cpp
** Implementation of video output via XVideo
** @warning as of 2016 it is not clear, if this code will be
** evolved into the actual display facility, or be
** replaced and rewritten, when we're about to
** create a functional video display connected
** to the render engine.
** @todo WIP as of 5/2025 -- attempt to port this component to GTK-3 ///////////////////////////////////////TICKET #1403
*/
#include "stage/gtk-base.hpp"
#include "stage/output/xvdisplayer.hpp"
#include "stage/output/xv-displayer.hpp"
#include "include/logging.h"
#include <gdk/gdkx.h>

View file

@ -1,5 +1,5 @@
/*
XVDISPLAYER.hpp - XVideo display
XV-DISPLAYER.hpp - XVideo display
Copyright (C)
2000, Arne Schirmacher <arne@schirmacher.de>
@ -14,19 +14,15 @@
*/
/** @file xvdisplayer.hpp
/** @file xv-displayer.hpp
** Implementation of video output via XVideo
** @warning as of 2016 it is not clear, if this code will be
** evolved into the actual display facility, or be
** replaced and rewritten, when we're about to
** create a functional video display connected
** to the render engine.
** @todo WIP as of 5/2025 -- attempt to port this component to GTK-3 ///////////////////////////////////////TICKET #1403
** @see displayer.hpp
*/
#ifndef STAGE_OUTPUT_XVDISPLAYER_H
#define STAGE_OUTPUT_XVDISPLAYER_H
#ifndef STAGE_OUTPUT_XV_DISPLAYER_H
#define STAGE_OUTPUT_XV_DISPLAYER_H
#include "stage/output/displayer.hpp"
@ -127,4 +123,4 @@ namespace output {
}} // namespace stage::output
#endif // XVDISPLAYER_HPP
#endif /*STAGE_OUTPUT_XV_DISPLAYER_H*/

View file

@ -34,13 +34,13 @@ namespace panel {
ViewerPanel::ViewerPanel (workspace::PanelManager& panelManager
,Gdl::DockItem& dockItem)
: Panel(panelManager, dockItem, getTitle(), getStockID())
, playbackController_{}
, demoPlayback_{}
{
//----- Pack in the Widgets -----//
pack_start(display_, PACK_EXPAND_WIDGET);
FrameDestination outputDestination (sigc::mem_fun(this, &ViewerPanel::on_frame));
playbackController_.useDisplay (DisplayService::setUp (outputDestination));
demoPlayback_.useDisplay (DisplayService::setUp (outputDestination));
}
const char*

View file

@ -22,7 +22,7 @@
#include "stage/panel/panel.hpp"
#include "stage/widget/video-display-widget.hpp"
#include "stage/ctrl/playback-controller.hpp"
#include "stage/ctrl/demo-controller.hpp"
namespace stage {
namespace panel {
@ -33,7 +33,7 @@ namespace panel {
class ViewerPanel
: public Panel
{
ctrl::PlaybackController playbackController_;
ctrl::DemoController demoPlayback_;
public:
ViewerPanel (workspace::PanelManager&, Gdl::DockItem&);

View file

@ -42,7 +42,7 @@ namespace controller {
ctrl::PlaybackController& Controller::get_playback_controller()
ctrl::PlayerController& Controller::get_playback_controller()
{
return playback_;
}

View file

@ -95,7 +95,7 @@
#include "stage/gtk-base.hpp" //////////////////////////////////////////////////////TODO remove any GTK dependency if possible
#include "stage/ctrl/playback-controller.hpp"
#include "stage/ctrl/player-controller.hpp"
#include "lib/nocopy.hpp"
#include <memory>
@ -119,12 +119,12 @@ namespace stage {
class Controller
{
model::Project& project_;
ctrl::PlaybackController playback_;
ctrl::PlayerController playback_;
public:
Controller (model::Project&);
ctrl::PlaybackController& get_playback_controller();
ctrl::PlayerController& get_playback_controller();
};
}// namespace stage::controller

View file

@ -19,10 +19,12 @@
#include "stage/gtk-base.hpp"
#include "stage/output/xvdisplayer.hpp"
#include "stage/output/gdkdisplayer.hpp"
#include "stage/output/xv-displayer.hpp"
#include "stage/output/pixbuf-displayer.hpp"
#include "stage/output/null-displayer.hpp"
#include "stage/widget/video-display-widget.hpp"
#include "stage/style-scheme.hpp"
#include "video-display-widget.hpp"
namespace stage {
namespace widget {

View file

@ -129646,6 +129646,136 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<linktarget COLOR="#fe160d" DESTINATION="ID_920789803" ENDARROW="Default" ENDINCLINATION="435;-485;" ID="Arrow_ID_370130803" SOURCE="ID_738125022" STARTARROW="None" STARTINCLINATION="-1332;116;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1746196449003" ID="ID_1070775068" MODIFIED="1746196453932" TEXT="Video-Display">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1746196482500" ID="ID_1819581335" LINK="https://issues.lumiera.org/ticket/1403" MODIFIED="1746226359001" TEXT=" #1403 Invesitgate if XV displayer can be revived ">
<linktarget COLOR="#fefeb4" DESTINATION="ID_1819581335" ENDARROW="Default" ENDINCLINATION="-2783;152;" ID="Arrow_ID_1160980366" SOURCE="ID_1219347509" STARTARROW="None" STARTINCLINATION="-4870;297;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1746196518190" ID="ID_411481779" MODIFIED="1746237828685" TEXT="Research-Setup">
<icon BUILTIN="pencil"/>
<node COLOR="#435e98" CREATED="1746201044698" ID="ID_1152249373" MODIFIED="1746230756302" TEXT="Frage: wie viel bauen wir jetzt &#xbb;neu im Sandkasten&#xab;?">
<icon BUILTIN="help"/>
<node CREATED="1746201077774" ID="ID_444644025" MODIFIED="1746201091898" TEXT="Lumi-GUI ist gegen Core-Library gelinkt">
<icon BUILTIN="idea"/>
<node CREATED="1746201100778" ID="ID_1816394825" MODIFIED="1746201611393">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
bedeutet: im Grunde kann man <i>wild jede Funktion aufrufen</i>
</p>
</body>
</html>
</richcontent>
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...auch bez&#252;glich Lifecycle: weil GUI depends-on Core
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1746201618342" ID="ID_66476144" MODIFIED="1746201712676" TEXT="F&#xfc;r die endg&#xfc;ltige L&#xf6;sung sollten wir uns dann aber schon auf Interfaces berschr&#xe4;nken">
<icon BUILTIN="smiley-oh"/>
</node>
<node CREATED="1746201658073" ID="ID_811133573" MODIFIED="1746201708083" TEXT="wenngleich auch ich nicht mehr das &#xbb;Interface-System&#xab; verwenden m&#xf6;gen werde">
<icon BUILTIN="smiley-angry"/>
</node>
</node>
<node CREATED="1746203278184" ID="ID_1326787016" MODIFIED="1746203304384" TEXT="die Strukturen f&#xfc;r den Play-Service sind schon sinnvoll durchdacht...">
<icon BUILTIN="yes"/>
<node CREATED="1746203306407" ID="ID_88399140" MODIFIED="1746203313760" TEXT="wenngleich auch lediglich skizziert"/>
<node CREATED="1746203314417" ID="ID_385277676" MODIFIED="1746203550912" TEXT="das Design wurde erkenntlich aus dem Dummy-Player abgeleitet">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Das zeigt, da&#223; ich damals das Prototyping durchaus richtig gemacht haben mu&#223; (finde keine Aufzeichnungen dazu mehr). Habe das erst mal irgendwie in funktionierenden Code gew&#252;rgt, und mir dann angeschaut, was pa&#223;t und was nicht pa&#223;t. Beibehalten habe ich die Idee eines &#187;Play-Prozesses&#171;. Aber Display-Connections sollen nicht mehr direkt vom Play-Prozess gemacht werden, sondern &#252;ber einen OutputManager abstrahiert sein. Und als Schnittstelle hinter dem Proze&#223;-Handle bekommt man nun ein Controller-Interface (State Machine).
</p>
<p>
</p>
<p>
Klingt alles sehr plausibel &#8212; sollte diesem Design folgen
</p>
</body>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1746203581424" ID="ID_441476633" MODIFIED="1746230763527" TEXT="Konsequenz: in diesem Rahmen bleiben &#x2014; Kurzschlu&#xdf; bauen">
<icon BUILTIN="yes"/>
<node CREATED="1746203611871" ID="ID_1500164071" MODIFIED="1746203618891" TEXT="bedeutet: der Controller ist schon da"/>
<node CREATED="1746203623607" ID="ID_1866389672" MODIFIED="1746203637441" TEXT="dieser stellt direkt eine Display-Verbindung her"/>
<node CREATED="1746203638366" ID="ID_1890894783" MODIFIED="1746203659523" TEXT="und greift daf&#xfc;r &#xbb;wild&#xab; auf den Tick-Service zu"/>
<node CREATED="1746203662933" ID="ID_816585590" MODIFIED="1746203684714" TEXT="der Tick-Service und DummyImageGenerator k&#xf6;nnen direkt verwendet werden">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1746203694670" ID="ID_1794331285" MODIFIED="1746230885543" TEXT="Vorlage: ProcessImpl-ctor (dummy-player-service.cpp)"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1746231119721" ID="ID_1893495747" MODIFIED="1746237815559" TEXT="Code-Anordnung">
<icon BUILTIN="pencil"/>
<node COLOR="#435e98" CREATED="1746231126835" ID="ID_163411237" MODIFIED="1746231131310" TEXT="der Name?">
<node CREATED="1746231133280" ID="ID_1300819912" MODIFIED="1746231141717" TEXT="&#xbb;PlaybackController&#xab;"/>
<node CREATED="1746231142471" ID="ID_279124391" MODIFIED="1746231149371" TEXT="&#xbb;PlayController&#xab;">
<node CREATED="1746231150863" ID="ID_1765618943" MODIFIED="1746231197493" TEXT="es gibt steam::play::PlayController (obsolet?)"/>
<node CREATED="1746231186899" ID="ID_1114744201" MODIFIED="1746231205260" TEXT="es gibt lumiera::Play::Controller"/>
<node CREATED="1746231219238" ID="ID_1631275694" MODIFIED="1746231238715" TEXT="hier stets: &#xbb;Play&#xab; &#x2259; playback-and-rendering"/>
<node CREATED="1746231306168" ID="ID_4522841" MODIFIED="1746231315485" TEXT="aber im GUI geht&apos;s nur um playback"/>
</node>
<node CREATED="1746231357372" ID="ID_926942695" MODIFIED="1746231387506" TEXT="der genaueste Name w&#xe4;re: stage::ctrl::PlayerController">
<icon BUILTIN="forward"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1746231390297" ID="ID_87527589" MODIFIED="1746237663416" TEXT="Konsequenz: forken und umbenennen">
<icon BUILTIN="yes"/>
<node CREATED="1746231417906" ID="ID_1653206071" MODIFIED="1746231437026" TEXT="playback-controller &#x27fc; player-controller"/>
<node CREATED="1746231445781" ID="ID_1228761711" MODIFIED="1746231481065" TEXT="++ &#x27fc; demo-controller"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1746237670793" ID="ID_258474163" MODIFIED="1746237738880" TEXT="dann entkernen und kurzschlie&#xdf;en">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1746237725210" ID="ID_138416616" MODIFIED="1746237781562" TEXT="entferne lumiera::DummyPlayer::Process playHandle_">
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1746237741584" ID="ID_4101489" MODIFIED="1746237781562" TEXT="entferne LumieraDisplaySlot viewerHandle_">
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1746237759901" ID="ID_331458322" MODIFIED="1746237781562" TEXT="entferne static DemoController* instance">
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1746237799176" ID="ID_1428195458" MODIFIED="1746237807456" TEXT="Lebenszyklus neu aufbauen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1746237785154" ID="ID_1469394159" MODIFIED="1746237807455" TEXT="direkt einen Tick-Service instantiieren">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1746237836971" ID="ID_349974806" MODIFIED="1746237847634" TEXT="einen Null-Displayer schaffen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1746237900191" ID="ID_891690513" MODIFIED="1746237941748" TEXT="dieser empf&#xe4;ngt zwar einen Datenblock">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1746237922301" ID="ID_261548220" MODIFIED="1746237941749" TEXT="quitiert aber nur geeignet im Log">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1746237950796" ID="ID_833924220" MODIFIED="1746237960794" TEXT="ggfs mit gedrosselter Frame-Rate laufen lassen">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node CREATED="1746237851254" ID="ID_991590991" MODIFIED="1746237873586" TEXT="Widget und Controller-Logik mit Null-Displayer neu aufbauen">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1746237875118" ID="ID_1626821300" MODIFIED="1746237896495" TEXT="Widget soll erst mal schwarzen Hintergrund zeichnen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1746237886231" ID="ID_81175326" MODIFIED="1746237894236" TEXT="ein paar Buttons einbinden">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
</node>
</node>
</node>
<node CREATED="1688336338313" ID="ID_1758461421" MODIFIED="1688336340923" TEXT="Integration">
@ -161444,16 +161574,13 @@ Since then others have made contributions, see the log for the history.</font></
<node CREATED="1745800146421" ID="ID_274063300" MODIFIED="1745800186494" TEXT="wird noch vewendet von configfacade.cpp und ui-style.cpp"/>
<node COLOR="#338800" CREATED="1745800059996" ID="ID_1732566176" MODIFIED="1745860210862" TEXT="dies ist ein &#xbb;Iterator&#xab; &#x2014; aber kein Lumiera Forward Iterator">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...das war vermutlich mein erster Versuch, eine Iterator-Klasse in C++ zu bauen &#8212; hatte mich dabei offensichtlich an Java orientiert
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="button_ok"/>
<node CREATED="1745850122914" ID="ID_1543137724" MODIFIED="1745850144722" TEXT="inzwischen k&#xf6;nnen &#x201e;wir&#x201c; das vieeel besser"/>
<node CREATED="1745850145440" ID="ID_1260012350" MODIFIED="1745850185900" TEXT="der RegexpSearchIter bietet sich da gradezu an (&#x27f6; siehe CSV.hpp)"/>
@ -161471,10 +161598,6 @@ Since then others have made contributions, see the log for the history.</font></
<arrowlink DESTINATION="ID_368377472" ENDARROW="Default" ENDINCLINATION="107;14;" ID="Arrow_ID_1432393919" STARTARROW="None" STARTINCLINATION="74;7;"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1744756270441" ID="ID_831819953" LINK="https://issues.lumiera.org/ticket/473" MODIFIED="1744756657146" TEXT="RefArray und ScopedHolder m&#xfc;ssen jetzt wirklich mal weg">
<arrowlink COLOR="#fd26d0" DESTINATION="ID_1135941103" ENDARROW="Default" ENDINCLINATION="-1048;89;" ID="Arrow_ID_1050531240" STARTARROW="None" STARTINCLINATION="-1120;-23;"/>
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1742175872016" ID="ID_1131308211" MODIFIED="1742175881001" TEXT="Untersuchung: einfacher XV-Displayer">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1742175882083" ID="ID_846823682" MODIFIED="1745783296480" TEXT="Christian hatte uns im Chat einen Tip gegeben">
@ -161493,14 +161616,218 @@ Since then others have made contributions, see the log for the history.</font></
<icon BUILTIN="idea"/>
</node>
<node CREATED="1742175967881" ID="ID_1117969598" MODIFIED="1742175981193" TEXT="Recherche: Basis-Infos zu XV"/>
<node CREATED="1742175946044" ID="ID_114770740" MODIFIED="1742175960772" TEXT="Untersuchen bzgl. Lib-Dependencies"/>
<node CREATED="1746053053337" ID="ID_385901530" MODIFIED="1746053077036" TEXT="Reste vom alten Video-Widget beurteilen">
<node CREATED="1742175946044" ID="ID_114770740" MODIFIED="1746053104281" TEXT="Lib-Dependencies">
<node CREATED="1746053105247" ID="ID_1243539235" MODIFIED="1746053166039" TEXT="der eigentliche XV-Code ist vollst&#xe4;ndig">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
nix auskommentiert oder deaktiviert &#8212; und das hei&#223;t, die aktuellen Dependencies sind hierf&#252;r ausreichend
</p>
</body>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1742176004434" ID="ID_393175435" MODIFIED="1742176020024" TEXT="GTK-2 Videoplayer-Widget entfernen">
<node CREATED="1746053167516" ID="ID_1584096195" MODIFIED="1746053185150" TEXT="wir linken getgen libXV und die X-Lib"/>
<node CREATED="1746053198648" ID="ID_46196863" MODIFIED="1746053205147" TEXT="und dieser Code ist der Grund daf&#xfc;r"/>
</node>
<node CREATED="1746053208935" ID="ID_533884265" MODIFIED="1746053226772" TEXT="der Code verwendete ein &#xbb;Displayer&#xab;-Framework">
<node CREATED="1746053242202" ID="ID_1152747748" MODIFIED="1746053248605" TEXT="stage/output/displayer.hpp"/>
<node CREATED="1746053263665" ID="ID_80445168" MODIFIED="1746053285448" TEXT="Code Copyright 2000: Arne Schirmacher und Dan Dennedy"/>
<node CREATED="1746053319130" ID="ID_333451218" LINK="https://en.wikipedia.org/wiki/Kino_(software)" MODIFIED="1746053451595" TEXT="die Initiatoren vom Video-Editor &#xbb;Kino&#xab;">
<node CREATED="1746053403556" ID="ID_1463636489" MODIFIED="1746053419556" TEXT="war ein &#xbb;anwenderfreundlicher einfacher&#xab; Video-Editor"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1746053393558" ID="ID_288300776" MODIFIED="1746053440418" TEXT="&#xd83d;&#xdc80; Projekt inzwischen tot &#xd83d;&#xdc80;">
<icon BUILTIN="button_cancel"/>
</node>
</node>
<node CREATED="1746053511510" ID="ID_1615258291" MODIFIED="1746053537677" TEXT="Design sieht grunds&#xe4;tzlich vern&#xfc;nftig aus">
<node CREATED="1746053543946" ID="ID_4996437" MODIFIED="1746053600643" TEXT="virtual bool usable()">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
jeder Displayer versucht eine minimale Initialisierung im Konstruktor und signalisiert damit, da&#223; er im Prinzip Video ausgeben k&#246;nnte
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1746053626501" ID="ID_1505251313" MODIFIED="1746053644326" TEXT="virtual DisplayerInput format()">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
zeigt an, in welchem Format die Daten angeliefert werden m&#252;ssen
</p>
</body>
</html></richcontent>
<node CREATED="1746053661289" MODIFIED="1746053661289" TEXT="DISPLAY_NONE,"/>
<node CREATED="1746053661290" MODIFIED="1746053661290" TEXT="DISPLAY_YUV,"/>
<node CREATED="1746053661290" MODIFIED="1746053661290" TEXT="DISPLAY_RGB,"/>
<node CREATED="1746053661291" MODIFIED="1746053661291" TEXT="DISPLAY_BGR,"/>
<node CREATED="1746053661291" MODIFIED="1746053661291" TEXT="DISPLAY_BGR0,"/>
<node CREATED="1746053661292" MODIFIED="1746053661292" TEXT="DISPLAY_RGB16"/>
</node>
<node CREATED="1746053690040" ID="ID_153671787" MODIFIED="1746053743902" TEXT="virtual preferredWidth() | preferredHeight()">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
der Displayer macht eine Vorgabe, kann aber durchaus (wohl in gewissen Grenzen) noch skalieren
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1746053756237" ID="ID_1295809959" MODIFIED="1746053757384" TEXT="static void calculateVideoLayout"/>
<node CREATED="1746053944707" ID="ID_1761798130" MODIFIED="1746053969482">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
<font face="Monospaced">virtual void <b>put</b>&#160;(</font><font face="Monospaced" color="#990c0c">void* const</font><font face="Monospaced">)</font>
</p>
</body>
</html></richcontent>
<node CREATED="1746053977262" ID="ID_1039914100" MODIFIED="1746053991758" TEXT="hier implementiert der konkrete Displayer seine Logik"/>
<node CREATED="1746053993724" ID="ID_347422184" MODIFIED="1746054012830" TEXT="der &#xfc;bergebene Pointer zeigt unmittelbar auf Videodaten des Frames"/>
</node>
<node BACKGROUND_COLOR="#f2fec9" CREATED="1746053802118" ID="ID_1460156687" MODIFIED="1746053833546" TEXT="beachte: KEINERLEI GTK-Abh&#xe4;ngigkeit">
<icon BUILTIN="idea"/>
</node>
</node>
</node>
<node CREATED="1746054132315" ID="ID_238515167" MODIFIED="1746054140756" TEXT="Implementierung: XvDisplayer">
<node CREATED="1746054802958" ID="ID_682224799" MODIFIED="1746054974334" TEXT="enth&#xe4;t etwas altert&#xfc;mlichen GDK-Code">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
<font face="Monospaced">window = GDK_WINDOW_XID (area_window-&gt;gobj()); </font>
</p>
<p>
<font face="Monospaced">display = GDK_WINDOW_XDISPLAY (area_window-&gt;gobj());</font>
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1746054976063" ID="ID_851195916" MODIFIED="1746054985536" TEXT="der aber mit GTK-3 noch compiliert"/>
<node CREATED="1746054995773" ID="ID_1029633245" MODIFIED="1746055002028" TEXT="beschafft sich auf dem Weg...">
<node CREATED="1746055003379" ID="ID_591197179" MODIFIED="1746055009035" TEXT="das XWindow"/>
<node CREATED="1746055009659" ID="ID_65785979" MODIFIED="1746055012958" TEXT="das X-Display"/>
</node>
<node CREATED="1746055093775" ID="ID_1790374649" MODIFIED="1746055112483" TEXT="sonst: nur einiges an (m&#xe4;&#xdf;ig technischem) X-Lib-Code"/>
</node>
<node CREATED="1746055119979" ID="ID_1886055504" MODIFIED="1746055133036" TEXT="Implementierung: GdkDisplayer">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1746055135072" ID="ID_296123462" MODIFIED="1746055151088" TEXT="broken seit Umstellung auf GTK-3">
<icon BUILTIN="broken-line"/>
</node>
<node CREATED="1746055152887" ID="ID_1155553121" MODIFIED="1746055207009">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
Implementierung war <i>extrem einfach</i>
</p>
</body>
</html>
</richcontent>
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Nichts weiter als etwas Bit-Blitting.
</p>
<p>
Das hei&#223;t, ein Pixmap wurde via GDK zur Anzeige gebracht
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1746055208184" ID="ID_1012325246" MODIFIED="1746055223026" TEXT="das sollte sich einfachst re-implementieren lassen mit GTK-3"/>
</node>
<node CREATED="1746055409329" ID="ID_758788483" MODIFIED="1746055413169" TEXT="VideoDisplayWidget">
<node CREATED="1746055414411" ID="ID_1527139798" MODIFIED="1746055425991" TEXT="erbt von Gtk::DrawingArea">
<node CREATED="1746055564313" ID="ID_1632165084" MODIFIED="1746055569452" TEXT="nicht wirklich klar warum"/>
<node CREATED="1746055570184" ID="ID_1290132049" MODIFIED="1746055577198" TEXT="vmtl. vor allem aus logischen Gr&#xfc;nden"/>
<node CREATED="1746055605098" ID="ID_1921436901" MODIFIED="1746055625287" TEXT="vielleicht auch, weil damit der GdkDisplayer einfach sein Pixmap ablegen konnte"/>
</node>
<node CREATED="1746055717912" ID="ID_1645096609" MODIFIED="1746055744272" TEXT="implementiert den on_realize()-Hook">
<node CREATED="1746056007502" ID="ID_767747431" MODIFIED="1746056016416" TEXT="das war unter GTK-2 viel &#xfc;blicher"/>
<node CREATED="1746056017076" ID="ID_1373990997" MODIFIED="1746056024607" TEXT="heute w&#xfc;rde man das im Konstruktor machen"/>
<node CREATED="1746056025686" ID="ID_525188288" MODIFIED="1746056044309" TEXT="erstellt und verdrahtet einen passenden Displayer">
<node CREATED="1746056045709" ID="ID_1696997856" MODIFIED="1746056052732" TEXT="versucht zun&#xe4;chst XvDisplayer"/>
<node CREATED="1746056053359" ID="ID_641244777" MODIFIED="1746056059875" TEXT="f&#xe4;llt dann auf GdkDisplayer zur&#xfc;ck"/>
</node>
</node>
</node>
</node>
<node CREATED="1746058970157" ID="ID_991442275" MODIFIED="1746058986973" TEXT="Einsch&#xe4;tzung: aktueller Stand">
<node CREATED="1746058988279" ID="ID_1992351880" MODIFIED="1746059009850">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
die Anzeige erscheint nur <i>marginal gebrochen</i>
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1746059010720" ID="ID_431781822" MODIFIED="1746059029328" TEXT="es m&#xfc;&#xdf;ten nur wenige Teile (einfach) nach GTK-3 portiert werden">
<node CREATED="1746059031084" ID="ID_752582525" MODIFIED="1746059039703" TEXT="das VideoDisplayWidget"/>
<node CREATED="1746059048115" ID="ID_269648070" MODIFIED="1746059068296" TEXT="das ViewerPannel m&#xfc;&#xdf;te man wieder reparieren"/>
<node CREATED="1746059563342" ID="ID_1477952429" MODIFIED="1746059586582" TEXT="eigentlich einfach neu implementieren, nach GTK-Tutorial"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1746059132520" ID="ID_1219347509" MODIFIED="1746226359001" TEXT="Hilfsprojekt: Funktionsf&#xe4;higkeit validieren">
<arrowlink COLOR="#fefeb4" DESTINATION="ID_1819581335" ENDARROW="Default" ENDINCLINATION="-2783;152;" ID="Arrow_ID_1160980366" STARTARROW="None" STARTINCLINATION="-4870;297;"/>
<icon BUILTIN="yes"/>
<node COLOR="#5b280f" CREATED="1746059159380" ID="ID_56657133" MODIFIED="1746059884614" TEXT="es g&#xe4;be noch den DummyPlayer">
<icon BUILTIN="button_cancel"/>
<node CREATED="1746059167483" ID="ID_344363985" MODIFIED="1746059179978" TEXT="der ist vermutlich noch zu 100% funktionsf&#xe4;hig"/>
<node CREATED="1746059180793" ID="ID_486458513" MODIFIED="1746059194235" TEXT="aber auch zu 99% undurchsichtig"/>
<node CREATED="1746059194967" ID="ID_308980123" MODIFIED="1746059201412" TEXT="und zu 98% zum Kotzen"/>
<node CREATED="1746059247592" ID="ID_1169651943" MODIFIED="1746059386761" TEXT="Zweck erf&#xfc;llt">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Mit dem DummyPlayer wollte ich damals demonstrieren, wie eine Zusammenarbeit &#252;ber Facade-Interfaces funktionieren kann; das hat die ganzen Schwachstellen an Christian's Interface-Konzept schonungslos offengelegt &#8212; und war ein ziemliches Gew&#252;rge. Au&#223;erdem ist der Code alt, und verwendet einige Dinge wie den ScopedPtrVect, die ich gerne mal begraben w&#252;rde.
</p>
</body>
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1746059388997" ID="ID_1757013848" MODIFIED="1746059905577">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
man k&#246;nnte den DummyImageGenerator
</p>
<p>
&#160;+ TickService wieder ins GUI ziehen
</p>
</body>
</html></richcontent>
<icon BUILTIN="back"/>
<node CREATED="1746059413045" ID="ID_417725173" MODIFIED="1746059419902" TEXT="und dort vereinfachen"/>
<node CREATED="1746059420397" ID="ID_690919476" MODIFIED="1746059434780" TEXT="so da&#xdf; der TickService direkt den VideoDisplayer aufruft"/>
<node CREATED="1746059436927" ID="ID_129605320" MODIFIED="1746059447855" TEXT="also das ganze Facaden / Interface-Thema erst mal weg"/>
<node CREATED="1746059484960" ID="ID_199950226" MODIFIED="1746059499836" TEXT="sie w&#xfc;rden dann zusammen mit dem PlayController im ViewerPanel h&#xe4;ngen"/>
</node>
</node>
<node CREATED="1746059640388" ID="ID_1149968188" MODIFIED="1746059644047" TEXT="danach...">
<node CREATED="1746059645095" ID="ID_1095537094" MODIFIED="1746059662007" TEXT="steht fest: wir k&#xf6;nnen / k&#xf6;nnen nicht Video anzeigen"/>
<node CREATED="1746059663185" ID="ID_473345546" MODIFIED="1746059697070" TEXT="kann der ganze DummyPlayer entfernt werden"/>
<node CREATED="1746059700212" ID="ID_191158269" MODIFIED="1746059710934" TEXT="k&#xf6;nnte auch gleich die alte Timeline mit entfernt werden"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1742176004434" ID="ID_393175435" MODIFIED="1746059770010" TEXT="Reste vom GTK-2-GUI zur&#xfc;ckbauen">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1742176027489" ID="ID_1395603395" MODIFIED="1742176036634" TEXT="Ziel: Dependencies reduzieren"/>
<node COLOR="#5b280f" CREATED="1745798298207" ID="ID_1464159274" MODIFIED="1745798323397" TEXT="aber: das war eine XV-basierte L&#xf6;sung (korrekt?)">
<icon BUILTIN="stop-sign"/>
</node>
<node CREATED="1746059790896" ID="ID_1458700110" MODIFIED="1746059808265" TEXT="macht den GUI-Code verst&#xe4;ndlicher"/>
<node CREATED="1746059809402" ID="ID_252295365" MODIFIED="1746059816488" TEXT="man k&#xf6;nnte auch den DummyPlayer loswerden"/>
<node CREATED="1746059817267" ID="ID_1413142939" MODIFIED="1746059824776" TEXT="und einige daran h&#xe4;ngende Library-Helper"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1742249461535" ID="ID_1554376708" MODIFIED="1742256553530" TEXT="Rolle der lib-Gavl &#xfc;berpr&#xfc;fen">
<linktarget COLOR="#a41b18" DESTINATION="ID_1554376708" ENDARROW="Default" ENDINCLINATION="440;-36;" ID="Arrow_ID_608156847" SOURCE="ID_1683248748" STARTARROW="None" STARTINCLINATION="193;12;"/>
@ -161531,6 +161858,13 @@ Since then others have made contributions, see the log for the history.</font></
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1746059853111" ID="ID_975342117" MODIFIED="1746059870062" TEXT="auch altes RenderNode-Framework zur&#xfc;ckbauen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1744756270441" ID="ID_831819953" LINK="https://issues.lumiera.org/ticket/473" MODIFIED="1746059845274" TEXT="RefArray und ScopedHolder m&#xfc;ssen jetzt wirklich mal weg">
<arrowlink COLOR="#fd26d0" DESTINATION="ID_1135941103" ENDARROW="Default" ENDINCLINATION="-1048;89;" ID="Arrow_ID_1050531240" STARTARROW="None" STARTINCLINATION="-1120;-23;"/>
<icon BUILTIN="yes"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1742175299968" ID="ID_1393531242" MODIFIED="1742175305316" TEXT="C++20">
<icon BUILTIN="flag-pink"/>