Prototype: demo works — after fixing obvious mistakes

No fundamental problem discovered thus far...
 - GTK-3 does not resize the window, need to `set_size_request()` (instead of `resize()`)
 - forgot to set slot-state to READ ⟹ submissions flood the full queue
 - condition to allow frame display was too tight, thus slipping at first frame
 - forgot to submit follow-up read tasks
This commit is contained in:
Fischlurch 2026-07-15 23:33:13 +02:00
parent c9f9fec117
commit 0cda45278c
4 changed files with 161 additions and 10 deletions

View file

@ -4,4 +4,5 @@
.settings .settings
build build
.~lock* .~lock*
*.log *.log
*.raw

View file

@ -2418,8 +2418,7 @@
im State SHOW pasiert jetzt gar nicht mehr das Display, sondern es bedeutet nun, daß der Frame weitergegeben werden muß im State SHOW pasiert jetzt gar nicht mehr das Display, sondern es bedeutet nun, daß der Frame weitergegeben werden muß
</p> </p>
</body> </body>
</html> </html></richcontent>
</richcontent>
<linktarget COLOR="#a03127" DESTINATION="ID_194548529" ENDARROW="Default" ENDINCLINATION="373;0;" ID="Arrow_ID_726120332" SOURCE="ID_312946304" STARTARROW="None" STARTINCLINATION="-39;152;"/> <linktarget COLOR="#a03127" DESTINATION="ID_194548529" ENDARROW="Default" ENDINCLINATION="373;0;" ID="Arrow_ID_726120332" SOURCE="ID_312946304" STARTARROW="None" STARTINCLINATION="-39;152;"/>
</node> </node>
<node CREATED="1784221423989" ID="ID_1367029376" MODIFIED="1784221595584" TEXT="nenne diese Phase jetzt FEED"> <node CREATED="1784221423989" ID="ID_1367029376" MODIFIED="1784221595584" TEXT="nenne diese Phase jetzt FEED">
@ -2433,9 +2432,157 @@
</html></richcontent> </html></richcontent>
</node> </node>
</node> </node>
<node CREATED="1784229335474" ID="ID_476891533" MODIFIED="1784229337398" TEXT="Fragen">
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1784229339746" ID="ID_655619575" MODIFIED="1784229414327" TEXT="bisher habe ich in addNext... die mem_order_seq_cst">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...weil das der Default ist, ich hab deshalb n&#228;mlich gar keine angegeben
</p>
</body>
</html></richcontent>
<font NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="help"/>
<node CREATED="1784229415567" ID="ID_572644187" MODIFIED="1784229431525" TEXT="g&#xe4;be es einen Unterschied zu mem_order_acquire?"/>
<node CREATED="1784229436588" ID="ID_1851133925" MODIFIED="1784229459165" TEXT="oder wird beim Lesen keine Write-Barrier erzeugt?"/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1784222841942" ID="ID_74519525" MODIFIED="1784239417461" TEXT="zum Laufen bringen">
<icon BUILTIN="button_ok"/>
<node CREATED="1784223517618" ID="ID_609106899" MODIFIED="1784223526502" TEXT="startet schon mal bis zum &#xd6;ffnen des File"/>
<node CREATED="1784223529015" ID="ID_1980887771" MODIFIED="1784223533004" TEXT="brauche nun ein Testvideo">
<node CREATED="1784223536006" ID="ID_44452226" MODIFIED="1784223551564" TEXT="Test-1: nehme die Animation von letztem Jahr">
<node BACKGROUND_COLOR="#accdc3" COLOR="#010101" CREATED="1784226368203" ID="ID_1901417329" MODIFIED="1784226455132" STYLE="fork" TEXT="lasse mir von Claude ein Aufruf-Programm erzeugen">
<edge COLOR="#808080" STYLE="bezier" WIDTH="thin"/>
<icon BUILTIN="idea"/>
<node CREATED="1784226456781" ID="ID_401970861" MODIFIED="1784226467897" TEXT="hinzugef&#xfc;gt zum letztj&#xe4;hrigen Froscon-Projekt"/>
<node CREATED="1784226468341" ID="ID_399827309" MODIFIED="1784226488382" TEXT="als neuer Unterordner examples/raw"/>
<node CREATED="1784226522365" ID="ID_303378535" MODIFIED="1784226528208" TEXT="verwendet image-gen"/>
<node CREATED="1784226528773" ID="ID_1747867217" MODIFIED="1784226537423" TEXT="schreibt ein Raw-Video ins aktuelle Verzeichnis"/>
</node>
<node CREATED="1784226886199" ID="ID_1477642542" MODIFIED="1784227084689" TEXT="anzeigen....">
<icon BUILTIN="back"/>
<node CREATED="1784226890979" ID="ID_634134790" MODIFIED="1784226920034" TEXT="ffplay">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
ffplay -f rawvideo -pixel_format rgb24 -video_size 320x240 -framerate 30 demovideo-320.raw
</p>
</body>
</html></richcontent>
<icon BUILTIN="wizard"/>
</node>
<node CREATED="1784226921919" ID="ID_454447584" MODIFIED="1784226963886" TEXT="vlc">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
vlc --demux rawvideo --rawvid-width 320 --rawvid-height 240 --rawvid-chroma RV24 --rawvid-fps 30 demovideo-320.raw
</p>
</body>
</html></richcontent>
<icon BUILTIN="wizard"/>
</node>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1784228106784" ID="ID_1212494407" MODIFIED="1784229520498" STYLE="fork" TEXT="Segfault">
<font NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="broken-line"/>
<node CREATED="1784228751285" ID="ID_1565658342" MODIFIED="1784228767139" TEXT="beim ersten initialen Bef&#xfc;llen der SQ"/>
<node CREATED="1784228768814" ID="ID_259879669" MODIFIED="1784228789008" TEXT="der Timer-Entry funktioniert"/>
<node CREATED="1784228840197" ID="ID_870664557" MODIFIED="1784228851823" TEXT="ein SQE kommt als NULL zur&#xfc;ck"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1784228853179" ID="ID_1537742880" MODIFIED="1784229512039" TEXT="AUA ... nextRead_ steht auf 7">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1784228886607" ID="ID_630552952" MODIFIED="1784228889758" TEXT="wir wrappen">
<node CREATED="1784228902224" ID="ID_1676148614" MODIFIED="1784228918826" TEXT="(intern fa&#xdf;t die Queue sogar 8 Eintr&#xe4;ge)">
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1784228920986" ID="ID_815377389" MODIFIED="1784239445118" TEXT="der State-Marker wurde nicht weitergeschaltet">
<icon BUILTIN="broken-line"/>
</node>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1784235804029" ID="ID_1424148212" MODIFIED="1784235907976" TEXT="Fenster zu klein">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1784235809692" ID="ID_1855255977" MODIFIED="1784235916712" TEXT="das window.set_size() wird ignoriert">
<icon BUILTIN="help"/>
</node>
<node CREATED="1784235819503" ID="ID_1683175695" LINK="https://stackoverflow.com/a/3582628/444796" MODIFIED="1784235920446" TEXT="Suche im Netz: set_resizable(false) zwingt auf den size-request zur&#xfc;ck">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
das ist zwar nicht logisch, und auch nicht so dokumentiert, wurde aber von anderen Leuten bereits f&#252;r GTK-3 beobachtet
</p>
</body>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
<node COLOR="#338800" CREATED="1784235892210" ID="ID_1028422738" MODIFIED="1784235902975" TEXT="L&#xf6;sung: set_size_request() direkt im launchPlayer()">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1784229521721" ID="ID_698829631" MODIFIED="1784238411088" TEXT="Alle Frames Slipped">
<icon BUILTIN="broken-line"/>
<node CREATED="1784238232017" ID="ID_1493418690" MODIFIED="1784238248280" TEXT="Anzeigebedingung greift nicht im Anfangszustand"/>
<node CREATED="1784238248956" ID="ID_1279441149" MODIFIED="1784238267938" TEXT="zu Beginn ist currShow &#x2261; nextShow">
<node CREATED="1784238311811" ID="ID_210721081" MODIFIED="1784238324834" TEXT="Bedingung pr&#xe4;ziser formulieren"/>
<node CREATED="1784238325286" ID="ID_782122885" MODIFIED="1784238407314">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
<font color="#3a1f18" face="DejaVu Sans Mono" size="9pt">prevState </font><font color="#65533c" face="DejaVu Sans Mono" size="9pt">!=</font><font color="#3a1f18" face="DejaVu Sans Mono" size="9pt">&#160;</font><font color="#9d724e" face="DejaVu Sans Mono" size="9pt"><i>SHOW</i></font>
</p>
</body>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
denn zur Anzeige wird der Slot auf <font color="#9d724e" face="DejaVu Sans Mono"><i>SHOW </i></font>gesetzt; zu pr&#252;fen ist also, da&#223; dieser Zustand sich ge&#228;ndert hat.
</p>
<p>
</p>
</body>
</html></richcontent>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1784238412197" ID="ID_377076622" MODIFIED="1784239365101" TEXT="5 Frames angezeigt &#x2014; dann Slipped">
<icon BUILTIN="broken-line"/>
<node CREATED="1784239290031" ID="ID_826828158" MODIFIED="1784239308912" TEXT="im 5. &#x2259; 0.Slot steht READ"/>
<node CREATED="1784239309460" ID="ID_686652707" MODIFIED="1784239363002">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
<font color="#642880" face="DejaVu Sans Mono"><b>io_uring_submit</b></font><font color="#11123a" face="DejaVu Sans Mono">(</font><font color="#65533c" face="DejaVu Sans Mono">&amp;</font><font color="#803435" face="DejaVu Sans Mono">uRing</font><font color="#11123a" face="DejaVu Sans Mono">)</font>&#160;&#160;vergessen
</p>
</body>
</html></richcontent>
<icon BUILTIN="broken-line"/>
</node>
</node>
<node BACKGROUND_COLOR="#174956" COLOR="#8dfd49" CREATED="1784239367168" HGAP="13" ID="ID_790023827" MODIFIED="1784239428069" STYLE="bubble" TEXT="Kaum macht mans richtig &#x2014; schon funktioniert&apos;s" VSHIFT="12">
<edge COLOR="#61fe5b" STYLE="bezier" WIDTH="thin"/>
<font NAME="SansSerif" SIZE="14"/>
<node COLOR="#054262" CREATED="1784239826448" ID="ID_273149802" MODIFIED="1784239872263" STYLE="fork" TEXT="auch getested: schnellere Wiedergabe">
<font NAME="SansSerif" SIZE="11"/>
</node>
<node COLOR="#054262" CREATED="1784239826448" ID="ID_776972591" MODIFIED="1784239931511" STYLE="fork" TEXT="getested: Playback-Stop bei end-of-file">
<font NAME="SansSerif" SIZE="11"/>
</node>
<node COLOR="#054262" CREATED="1784239826448" ID="ID_1233113947" MODIFIED="1784239901209" STYLE="fork" TEXT="getested: Fenster verschieben w&#xe4;hrend Widergabe">
<font NAME="SansSerif" SIZE="11"/>
</node>
</node> </node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1784222841942" ID="ID_74519525" MODIFIED="1784222846614" TEXT="zum Laufen bringen">
<icon BUILTIN="flag-pink"/>
</node> </node>
</node> </node>
</node> </node>

View file

@ -170,6 +170,7 @@ UringVideoPlayer::playVideo()
{ {
maybeDisplayFrame(); maybeDisplayFrame();
addNextReadSubmissions (uRing, inputFD); addNextReadSubmissions (uRing, inputFD);
io_uring_submit (&uRing);
} }
else else
handleCompletedRead (*completion); handleCompletedRead (*completion);
@ -202,6 +203,7 @@ UringVideoPlayer::addNextReadSubmissions (io_uring& uRing, int inputFD)
,BUFFSIZ * srcOffset ,BUFFSIZ * srcOffset
); );
io_uring_sqe_set_data64 (readSubmission, nextRead_); io_uring_sqe_set_data64 (readSubmission, nextRead_);
buffState_[nextRead_ % RING_SIZ].store (READ, std::memory_order_relaxed);
++nextRead_; ++nextRead_;
} }
} }
@ -236,10 +238,10 @@ UringVideoPlayer::handleCompletedRead (io_uring_cqe& completion)
void void
UringVideoPlayer::maybeDisplayFrame() UringVideoPlayer::maybeDisplayFrame()
{ {
auto prevState = buffState_[currShow_ % RING_SIZ].load (std::memory_order_relaxed); auto prevState = buffState_[currShow_ % RING_SIZ].load (std::memory_order_acquire);
auto nextState = buffState_[nextShow_ % RING_SIZ].load (std::memory_order_relaxed); auto nextState = buffState_[nextShow_ % RING_SIZ].load (std::memory_order_relaxed);
if (nextState == FEED and prevState == FREE) if (nextState == FEED and prevState != SHOW)
{ // can hand over this next frame to the VideoDisplay in the GUI-thread { // can hand over this next frame to the VideoDisplay in the GUI-thread
currShow_ = nextShow_; currShow_ = nextShow_;
++nextShow_; ++nextShow_;
@ -307,8 +309,10 @@ UringVideoPlayer::terminate()
unique_ptr<UringVideoPlayer> unique_ptr<UringVideoPlayer>
launchPlayer (Gtk::Window& appWindow) launchPlayer (Gtk::Window& appWindow)
{ { // force minimum size to fit the player...
appWindow.resize (VIDEO_WIDTH, VIDEO_HEIGHT); appWindow.set_size_request (VIDEO_WIDTH, VIDEO_HEIGHT);
appWindow.set_resizable (false);
return std::make_unique<UringVideoPlayer> (appWindow); return std::make_unique<UringVideoPlayer> (appWindow);
} }

View file

@ -48,7 +48,6 @@ class GtkUringApp
public: public:
DemoWindow() DemoWindow()
{ {
// set_default_size (CTX::VIDEO_WIDTH, CTX::VIDEO_HEIGHT);
set_resizable (false); set_resizable (false);
add (button_); add (button_);
button_.show(); button_.show();