<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.7.6(BH)" -->
<rss version="2.0">
    <channel xmlns:g="http://base.google.com/ns/1.0">
        <title>Planet Maemo</title>
        <description>Blog entries from Maemo community</description>
        <link>http://maemo.org/news/planet-maemo/</link>
        <lastBuildDate>Thu, 16 Oct 2025 22:59:20 +0000</lastBuildDate>
        <generator>FeedCreator 1.7.6(BH)</generator>
        <language>en</language>
        <managingEditor>planet@maemo.org</managingEditor>
        <item>
            <title>Dzzee 1.9.0 for N800/N810/N900/N9/Leste</title>
            <link>http://thpmaemo.blogspot.com/2025/10/dzzee-190-for-n800n810n900n9leste.html</link>
            <description><![CDATA[
<p></p><div class="separator" style="clear: both; text-align: left;">I was playing around with Xlib this summer, and one thing led to another, and here we are with four fresh ports to retro mobile X11 platforms. There is even a Maemo Leste port, but due to some SGX driver woes on the N900, I opted for using XSHM and software rendering, which works well and has the nice, crisp pixel look (on Fremantle, it's using EGL+GLESv2). Even the N8x0 port has very fluid motion by utilizing Xv for blitting software-rendered pixels to the screen. The game is <a href="https://thp.itch.io/dzzee" target="_blank">available over at itch.io</a>.</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKf8JYtDFJRQ4sqIys7SH4fii9Y3rmKii7iQZRRBENWAEOR9-_RxMHBm3cEyq8u_-ujauLLafMMKdb-68dqlL4Ra0XKcKT_55If-Zw5Ah4QnfwedpzXrT0uRdxuWHfuQv6YdqAGIm-NtmtaMvRbi-bLqg5Fm-eN4Tcg8k58jiWBXJztr31ud03YNiAoUQ/s621/dzzee-n810.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="500" data-original-width="621" height="258" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKf8JYtDFJRQ4sqIys7SH4fii9Y3rmKii7iQZRRBENWAEOR9-_RxMHBm3cEyq8u_-ujauLLafMMKdb-68dqlL4Ra0XKcKT_55If-Zw5Ah4QnfwedpzXrT0uRdxuWHfuQv6YdqAGIm-NtmtaMvRbi-bLqg5Fm-eN4Tcg8k58jiWBXJztr31ud03YNiAoUQ/s320/dzzee-n810.jpg" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiA9Qcc-F16S0j65lRw7sbs_-0tTodo4mI4leAMQK_2PZCAMmO5EBbtVgnWllZ4RHBkNJSFaonYA66_LbLo299c8OmNvDQUYJ0OJAoiHUKzPc5oXNk9EFpLhSdmgA7xF8JPo766I-LKIMwwXOYNfrN58Ygx6D3g1QIWfmkTVlu9OHo_pevz-jSRtz5tN0w/s617/dzzee-n900.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="500" data-original-width="617" height="259" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiA9Qcc-F16S0j65lRw7sbs_-0tTodo4mI4leAMQK_2PZCAMmO5EBbtVgnWllZ4RHBkNJSFaonYA66_LbLo299c8OmNvDQUYJ0OJAoiHUKzPc5oXNk9EFpLhSdmgA7xF8JPo766I-LKIMwwXOYNfrN58Ygx6D3g1QIWfmkTVlu9OHo_pevz-jSRtz5tN0w/s320/dzzee-n900.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjalNHvL-tco_CjuIqU9EYDGKgXxce7tgAqw3Lgvdq47qzUyNCZPSo-c9UyOVVHGl6dfzo7ysxIPXv_ozCzCejwQUC0vujJfApQpNaQj4UgF6E0scnAfDiy4pe4nnGZwRkc18THuLC55Qxli_iCMgGet-QOKaJqyKfI9X3nxwZNi6DRNyv-nzcB92cjUzw/s683/dzzee-n9.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="500" data-original-width="683" height="234" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjalNHvL-tco_CjuIqU9EYDGKgXxce7tgAqw3Lgvdq47qzUyNCZPSo-c9UyOVVHGl6dfzo7ysxIPXv_ozCzCejwQUC0vujJfApQpNaQj4UgF6E0scnAfDiy4pe4nnGZwRkc18THuLC55Qxli_iCMgGet-QOKaJqyKfI9X3nxwZNi6DRNyv-nzcB92cjUzw/s320/dzzee-n9.jpg" width="320" /></a></div></div><br /><p></p><p></p><ul style="text-align: left;"><li><a href="https://thp.itch.io/dzzee/devlog/1085262/dzzee-190-for-n800-n810-n900-n9-leste-released" target="_blank">Release announcement on itch.io</a></li></ul><p></p><span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1f0a9ad0a2b33daa9ad11f089745b40f43c14161416&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1f0a9ad0a2b33daa9ad11f089745b40f43c14161416/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1f0a9ad0a2b33daa9ad11f089745b40f43c14161416&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1f0a9ad0a2b33daa9ad11f089745b40f43c14161416/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Thomas Perl &lt;m@thp.io&gt;</author>
            <category>feed:437c40ecc45d4b0fa868e422ae16adb1</category>
            <pubDate>Wed, 15 Oct 2025 11:31:00 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1f0a9ad0a2b33daa9ad11f089745b40f43c14161416</guid>
        </item>
        <item>
            <title>Mobile blogging, the past and the future</title>
            <link>https://bergie.iki.fi/blog/mobile-blogging/</link>
            <description><![CDATA[
<p>This blog has been running more or less continuously since mid-nineties. The site has existed in multiple forms, and with different ways to publish. But what’s common is that at almost all points there was a mechanism to publish while on the move.</p>

<h2 id="psion-documents-over-ftp">Psion, documents over FTP</h2>

<p>In the early 2000s we were into adventure motorcycling. To be able to share our adventures, we implemented a way to publish blogs while on the go. The device that enabled this was the <a href="https://en.wikipedia.org/wiki/Psion_Series_5">Psion Series 5</a>, a handheld computer that was very much a device ahead of its time.</p>

<p><img src="https://d2vqpl3tx84ay5.cloudfront.net/psions5.jpg" alt="Psion S5, also known as the Ancestor" /></p>

<p>The Psion had a reasonably sized keyboard and a good native word processing app. And battery life good for weeks of usage. Writing while underway was easy. The Psion could use a mobile phone as a modem over an infrared connection, and with that we could upload the documents to a server over FTP.</p>

<p>Server-side, a cron job would grab the new documents, converting them to HTML and adding them to our CMS.</p>

<p>In the early days of GPRS, getting this to work while roaming was quite tricky. But the system served us well for years.</p>

<p>If we wanted to include photos to the stories, we’d have to find an Internet cafe.</p>

<ul>
  <li><a href="https://bergie.iki.fi/blog/to-to-alps/">To the Alps</a> is a post from these times. Lots more in the <a href="https://bergie.iki.fi/blog/category/motorcycles/">motorcycling category</a></li>
</ul>

<h2 id="sms-and-mms">SMS and MMS</h2>

<p>For an even more mobile setup, I implemented an SMS-based blogging system. We had an old phone connected to a computer back in the office, and I could write to my blog by simply sending a text. These would automatically end up as a new paragraph in the latest post. If I started the text with <code class="language-plaintext highlighter-rouge">NEWPOST</code>, an empty blog post would be created with the rest of that message’s text as the title.</p>

<ul>
  <li><a href="https://bergie.iki.fi/blog/in-the-caucasus/">In the Caucasus</a> is a good example of a post from this era</li>
</ul>

<p>As I got into <a href="https://bergie.iki.fi/blog/category/geo/">neogeography</a>, I could also send a <code class="language-plaintext highlighter-rouge">NEWPOSITION</code> message. This would update my position on the map, connecting weather metadata to the posts.</p>

<p>As camera phones became available, we wanted to do pictures too. For the Death Monkey rally where we rode minimotorcycles from Helsinki to Gibraltar, we implemented an MMS-based system. With that the entries could include both text and pictures. But for that you needed a gateway, which was really only realistic for an event with sponsors.</p>

<ul>
  <li><a href="https://web.archive.org/web/20061013183009/http://www.deathmonkey.org/view/mystery-of-the-missing-monkey.html">Mystery of the Missing Monkey</a> is typical. Some more in <a href="https://web.archive.org/web/20060804205237/http://www.deathmonkey.org/">Internet Archive</a></li>
</ul>

<h2 id="photos-over-email">Photos over email</h2>

<p>A much easier setup than MMS was to slightly come back to the old Psion setup, but instead of word documents, sending email with picture attachments. This was something that the new breed of (pre-iPhone) smartphones were capable of. And by now the roaming question was mostly sorted.</p>

<p>And so my blog included a new “moblog” section. This is where I could share my daily activities as poor-quality pictures. Sort of how people would use Instagram a few years later.</p>

<p><img src="https://d2vqpl3tx84ay5.cloudfront.net/bergie_layout_2006.jpg" alt="My blog from that era" /></p>

<ul>
  <li><a href="https://web.archive.org/web/20110604011733/http://bergie.iki.fi/moblog">Internet Archive has some of my old moblogs</a> but nowadays, I post similar stuff <a href="https://pixelfed.de/bergie">on Pixelfed</a></li>
</ul>

<h2 id="pause">Pause</h2>

<p>Then there was sort of a long pause in mobile blogging advancements. Modern smartphones, data roaming, and WiFi hotspots had become ubiquitous.</p>

<p>In the meanwhile the blog also got <a href="https://bergie.iki.fi/blog/blog-2012-edition/">migrated to a Jekyll-based system</a> hosted on AWS. That means the old Midgard-based integrations were off the table.</p>

<p>And I traveled off-the-grid rarely enough that it didn’t make sense to develop a system.</p>

<p>But now that we’re <a href="https://lille-oe.de">sailing offshore</a>, that has changed. Time for new systems and new ideas. Or maybe just a rehash of the old ones?</p>

<h2 id="starlink-internet-from-outer-space">Starlink, Internet from Outer Space</h2>

<p>Most cruising boats - ours included - now run the Starlink satellite broadband system. This enables full Internet, even in the middle of an ocean, even video calls! With this, we can use normal blogging tools. The usual one for us is <a href="https://gitjournal.io">GitJournal</a>, which makes it easy to write Jekyll-style Markdown posts and push them to GitHub.</p>

<p>However, Starlink is a complicated, energy-hungry, and fragile system on an offshore boat. The policies might change at any time preventing our way of using it, and also the dishy itself, or the way we power it may fail.</p>

<p>But despite what you’d think, even on a nerdy boat like ours, loss of Internet connectivity is not an emergency. And this is where the old-style mobile blogging mechanisms come handy.</p>

<ul>
  <li>Any of the <a href="https://lille-oe.de/2025/">2025 Atlantic crossing posts</a> is a good example of this setup in action</li>
</ul>

<h2 id="inreach-texting-with-the-cloud">Inreach, texting with the cloud</h2>

<p>Our backup system to Starlink is the Garmin Inreach. This is a tiny battery-powered device that connects to the Iridium satellite constellation. It allows tracking as well as basic text messaging.</p>

<p>When we head offshore we always enable tracking on the Inreach. This allows both our blog and our friends ashore to follow our progress.</p>

<p>I also made a simple integration where text updates sent to <a href="https://share.garmin.com/home">Garmin MapShare</a> get fetched and published on our blog. Right now this is just plain text-based entries, but one could easily implement a command system similar to what I had over SMS back in the day.</p>

<p>One benefit of the Inreach is that we can also take it with us when we go on land adventures. And it’d even enable rudimentary communications if we found ourselves in a liferaft.</p>

<ul>
  <li>There are <a href="https://github.com/tabeaeggler/MarineGRIB-InReach-Transmitter">various InReach integration hacks</a> that could be used for more sophisticated data transfer</li>
</ul>

<h2 id="sailmail-and-email-over-hf-radio">Sailmail and email over HF radio</h2>

<p>The other potential backup for Starlink failures would be to go seriously old-school. It is possible to get email access via a SSB radio and a Pactor (or <a href="https://rosmodem.wordpress.com">Vara</a>) modem.</p>

<p>Our boat is already equipped with an isolated aft stay that can be used as an antenna. And with the popularity of Starlink, many cruisers are offloading their old HF radios.</p>

<p>Licensing-wise this system could be used either as a marine HF radio (requiring a Long Range Certificate), or amateur radio. So that part is something I need to work on. Thankfully post-COVID, radio amateur license exams can be done online.</p>

<p>With this setup we could send and receive text-based email. The <a href="https://sailmail.com">Airmail</a> application used for this can even do some automatic templating for position reports. We’d then need a mailbox that can receive these mails, and some automation to fetch and publish.</p>

<ul>
  <li><a href="https://www.sailblogs.com/wiki/index.php/Using_SailBlogs_Remote">Sailmail</a> and <a href="https://www.noforeignland.com/help/boat/move-email">No Foreign Land</a> support structured data via email to update position. Their formats could be useful inspiration</li>
</ul>
<span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1f0425240e0b89a425211f0ba29830306e4dec9dec9&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1f0425240e0b89a425211f0ba29830306e4dec9dec9/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1f0425240e0b89a425211f0ba29830306e4dec9dec9&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1f0425240e0b89a425211f0ba29830306e4dec9dec9/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Henri Bergius &lt;henri.bergius@iki.fi&gt;</author>
            <category>feed:766d7361580352c5efed0204e4ba8593</category>
            <pubDate>Thu, 05 Jun 2025 00:00:00 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1f0425240e0b89a425211f0ba29830306e4dec9dec9</guid>
        </item>
        <item>
            <title>Adding buffering hysteresis to the WebKit GStreamer video player</title>
            <link>https://eocanha.org/blog/2024/10/16/adding-buffering-hysteresis-to-the-webkit-gstreamer-video-player/</link>
            <description><![CDATA[

<p>The <code>&lt;video&gt;</code> element implementation in WebKit does its job by using a multiplatform player that relies on a platform-specific implementation. In the specific case of glib platforms, which base their multimedia on GStreamer, that&#8217;s <a href="https://github.com/WebKit/WebKit/blob/aededeb7ddd9e55b53d9eda0be721ab3fd8180e4%5E/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp" data-type="URL" data-id="https://github.com/WebKit/WebKit/blob/aededeb7ddd9e55b53d9eda0be721ab3fd8180e4%5E/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp">MediaPlayerPrivateGStreamer</a>. </p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><a href="https://eocanha.org/blog/wp-content/uploads/2024/10/regular-multimedia.svg"><img loading="lazy" src="https://eocanha.org/blog/wp-content/uploads/2024/10/regular-multimedia.svg" alt="WebKit GStreamer regular playback class diagram" class="wp-image-671" width="394" height="239"/></a></figure></div>



<p>The player private can have 3 buffering modes:</p>



<ul><li>On-disk buffering: This is the typical mode on desktop systems, but is frequently disabled on purpose on embedded devices to avoid wearing out their flash storage memories. All the video content is downloaded to disk, and the buffering percentage refers to the total size of the video. A GstDownloader element is present in the pipeline in this case. Buffering level monitoring is done by polling the pipeline every second, using the <code><a rel="noreferrer noopener" href="https://github.com/WebKit/WebKit/blob/aededeb7ddd9e55b53d9eda0be721ab3fd8180e4%5E/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp#L1300" data-type="URL" data-id="https://github.com/WebKit/WebKit/blob/aededeb7ddd9e55b53d9eda0be721ab3fd8180e4%5E/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp#L1300" target="_blank">fillTimerFired()</a></code> method.</li><li>In-memory buffering: This is the typical mode on embedded systems and on desktop systems in case of streamed (live) content. The video is downloaded progressively and only the part of it ahead of the current playback time is buffered. A GstQueue2 element is present in the pipeline in this case. Buffering level monitoring is done by <a rel="noreferrer noopener" href="https://github.com/WebKit/WebKit/blob/aededeb7ddd9e55b53d9eda0be721ab3fd8180e4%5E/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp#L2023" data-type="URL" data-id="https://github.com/WebKit/WebKit/blob/aededeb7ddd9e55b53d9eda0be721ab3fd8180e4%5E/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp#L2023" target="_blank">listening to GST_MESSAGE_BUFFERING bus messages</a> and using the buffering level stored on them. This is the case that motivates the refactoring described in this blog post, what we actually wanted to correct in Broadcom platforms, and what motivated the addition of hysteresis working on all the platforms.</li><li>Local files: Files, MediaStream sources and other special origins of video don&#8217;t do buffering at all (no GstDownloadBuffering nor GstQueue2 element is present on the pipeline). They work like the on-disk buffering mode in the sense that <code>fillTimerFired()</code> is used, but the reported level is relative, much like in the streaming case. In the initial version of the refactoring I was unaware of this third case, and only realized about it when tests triggered the assert that I added to ensure that the on-disk buffering method was working in GST_BUFFERING_DOWNLOAD mode.</li></ul>



<p>The current implementation (actually, <a rel="noreferrer noopener" href="https://github.com/WebPlatformForEmbedded/WPEWebKit/blob/95664cfc09608b8f6ee252f27bbfe6849d4441ab/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp" data-type="URL" data-id="https://github.com/WebPlatformForEmbedded/WPEWebKit/blob/95664cfc09608b8f6ee252f27bbfe6849d4441ab/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp" target="_blank">its wpe-2.38 version</a>) was showing some buffering problems on some Broadcom platforms when doing in-memory buffering. The buffering levels monitored by MediaPlayerPrivateGStreamer weren&#8217;t accurate because the Nexus multimedia subsystem used on Broadcom platforms was doing its own internal buffering. Data wasn&#8217;t being accumulated in the GstQueue2 element of playbin, because BrcmAudFilter/BrcmVidFilter was accepting all the buffers that the queue could provide. Because of that, the player private buffering logic was erratic, leading to many transitions between &#8220;buffer completely empty&#8221; and &#8220;buffer completely full&#8221;. This, it turn, caused many transitions between the HaveEnoughData, HaveFutureData and HaveCurrentData readyStates in the player, leading to frequent pauses and unpauses on Broadcom platforms.</p>



<figure class="wp-block-image size-large"><a href="https://eocanha.org/blog/wp-content/uploads/2024/10/0.00.03.621786886-video-player-0_PAUSED_PLAYING.png"><img loading="lazy" width="1024" height="137" src="https://eocanha.org/blog/wp-content/uploads/2024/10/0.00.03.621786886-video-player-0_PAUSED_PLAYING-1024x137.png" alt="" class="wp-image-672" srcset="https://eocanha.org/blog/wp-content/uploads/2024/10/0.00.03.621786886-video-player-0_PAUSED_PLAYING-1024x137.png 1024w, https://eocanha.org/blog/wp-content/uploads/2024/10/0.00.03.621786886-video-player-0_PAUSED_PLAYING-300x40.png 300w, https://eocanha.org/blog/wp-content/uploads/2024/10/0.00.03.621786886-video-player-0_PAUSED_PLAYING-768x103.png 768w, https://eocanha.org/blog/wp-content/uploads/2024/10/0.00.03.621786886-video-player-0_PAUSED_PLAYING-1536x205.png 1536w, https://eocanha.org/blog/wp-content/uploads/2024/10/0.00.03.621786886-video-player-0_PAUSED_PLAYING-2048x273.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>So, one of the first thing I tried to solve this issue was to ask the Nexus PlayPump (the subsystem in charge of internal buffering in Nexus) about its internal levels, and add that to the levels reported by GstQueue2. There&#8217;s also a GstMultiqueue in the pipeline that can hold a significant amount of buffers, so I also asked it for its level. Still, the buffering level unstability was too high, so I added a moving average implementation to try to smooth it.</p>



<p>All these tweaks only make sense on Broadcom platforms, so they were guarded by ifdefs in a first version of the patch. Later, I migrated those dirty ifdefs to <a rel="noreferrer noopener" href="https://github.com/WebKit/WebKit/commit/5813c1e253b04bd1912f1729bc4cf7eae4efa3b1" data-type="URL" data-id="https://github.com/WebKit/WebKit/commit/5813c1e253b04bd1912f1729bc4cf7eae4efa3b1" target="_blank">the new quirks abstraction</a> added by Phil. A challenge of this migration was that I needed to store some attributes that were considered part of MediaPlayerPrivateGStreamer before. They still had to be somehow linked to the player private but only accessible by the platform specific code of the quirks. A special HashMap attribute stores those quirks attributes in an opaque way, so that only the specific quirk they belong to knows how to interpret them (using downcasting). I tried to use move semantics when storing the data, but <a rel="noreferrer noopener" href="https://eocanha.org/blog/2024/09/10/dont-shoot-yourself-in-the-foot-with-the-c-move-constructor/" data-type="URL" data-id="https://eocanha.org/blog/2024/09/10/dont-shoot-yourself-in-the-foot-with-the-c-move-constructor/" target="_blank">was bitten by object slicing</a> when trying to move instances of the superclass. In the end, moving the responsibility of creating the unique_ptr that stored the concrete subclass to the caller did the trick.</p>



<p>Even with all those changes, undesirable swings in the buffering level kept happening, and when doing a careful analysis of the causes I noticed that the monitoring of the buffering level was being done from different places (in different moments) and sometimes the level was regarded as &#8220;enough&#8221; and the moment right after, as &#8220;insufficient&#8221;. This was because the buffering level threshold was one single value. That&#8217;s something that a hysteresis mechanism (with low and high watermarks) can solve. So, a logical level change to &#8220;full&#8221; would only happen when the level goes above the high watermark, and a logical level change to &#8220;low&#8221; when it goes under the low watermark level.</p>



<p>For the threshold change detection to work, we need to know the previous buffering level. There&#8217;s a problem, though: the current code checked the levels from several scattered places, so only one of those places (the first one that detected the threshold crossing at a given moment) would properly react. The other places would miss the detection and operate improperly, because the &#8220;previous buffering level value&#8221; had been overwritten with the new one when the evaluation had been done before. To solve this, I centralized the detection in a single place &#8220;per cycle&#8221; (in <a rel="noreferrer noopener" href="https://github.com/WebKit/WebKit/blob/aededeb7ddd9e55b53d9eda0be721ab3fd8180e4/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp#L2270" data-type="URL" data-id="https://github.com/WebKit/WebKit/blob/aededeb7ddd9e55b53d9eda0be721ab3fd8180e4/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp#L2270" target="_blank">updateBufferingStatus()</a>), and then used the detection conclusions from <a rel="noreferrer noopener" href="https://github.com/WebKit/WebKit/blob/aededeb7ddd9e55b53d9eda0be721ab3fd8180e4/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp#L2622" data-type="URL" data-id="https://github.com/WebKit/WebKit/blob/aededeb7ddd9e55b53d9eda0be721ab3fd8180e4/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp#L2622" target="_blank">updateStates()</a>.</p>



<p>So, with all this in mind, I refactored the buffering logic as <a href="https://commits.webkit.org/284072@main">https://commits.webkit.org/284072@main</a>, so now WebKit GStreamer has a buffering code much more robust than before. The unstabilities observed in Broadcom devices were gone and I could, at last, close <a rel="noreferrer noopener" href="https://github.com/WebPlatformForEmbedded/WPEWebKit/issues/1309" data-type="URL" data-id="https://github.com/WebPlatformForEmbedded/WPEWebKit/issues/1309" target="_blank">Issue 1309</a>.</p>
<span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1ef9f961162240a9f9611efac1245afeb00d6e8d6e8&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1ef9f961162240a9f9611efac1245afeb00d6e8d6e8/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1ef9f961162240a9f9611efac1245afeb00d6e8d6e8&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1ef9f961162240a9f9611efac1245afeb00d6e8d6e8/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Enrique Ocaña González &lt;eocanha@igalia.com&gt;</author>
            <category>feed:218abbb3f30ed17e36476558d8bce9b5</category>
            <pubDate>Wed, 16 Oct 2024 06:12:00 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1ef9f961162240a9f9611efac1245afeb00d6e8d6e8</guid>
        </item>
        <item>
            <title>Don’t shoot yourself in the foot with the C++ move constructor</title>
            <link>https://eocanha.org/blog/2024/09/10/dont-shoot-yourself-in-the-foot-with-the-c-move-constructor/</link>
            <description><![CDATA[

<p>Move semantics can be very useful to transfer ownership of resources, but as many other C++ features, it&#8217;s one more double edge sword that can harm yourself in new and interesting ways if you don&#8217;t read the small print.</p>



<p>For instance, if object moving involves super and subclasses, you have to keep an extra eye on what&#8217;s actually happening. Consider the following classes A and B, where the latter inherits from the former:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="cpp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#include &lt;stdio.h>
#include &lt;utility>

#define PF printf("%s %p\n", __PRETTY_FUNCTION__, this)

class A {
 public:
 A() { PF; }
 virtual ~A() { PF; }
 A(A&amp;&amp; other)
 {
  PF;
  std::swap(i, other.i);
 }

 int i = 0;
};

class B : public A {
 public:
 B() { PF; }
 virtual ~B() { PF; }
 B(B&amp;&amp; other)
 {
  PF;
  std::swap(i, other.i);
  std::swap(j, other.j);
 }

 int j = 0;
};</pre>



<p>If your project is complex, it would be natural that your code involves abstractions, with part of the responsibility held by the superclass, and some other part by the subclass. Consider also that some of that code in the superclass involves move semantics, so a subclass object must be moved to become a superclass object, then perform some action, and then moved back to become the subclass again. That&#8217;s a <strong>really bad idea</strong>!</p>



<p>Consider this usage of the classes defined before:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="cpp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">int main(int, char* argv[]) {
 printf("Creating B b1\n");
 B b1;
 b1.i = 1;
 b1.j = 2;
 printf("b1.i = %d\n", b1.i);
 printf("b1.j = %d\n", b1.j);
 printf("Moving (B)b1 to (A)a. Which move constructor will be used?\n");
 A a(std::move(b1));
 printf("a.i = %d\n", a.i);
 // This may be reading memory beyond the object boundaries, which may not be
 // obvious if you think that (A)a is sort of a (B)b1 in disguise, but it's not!
 printf("(B)a.j = %d\n", reinterpret_cast&lt;B&amp;>(a).j);
 printf("Moving (A)a to (B)b2. Which move constructor will be used?\n");
 B b2(reinterpret_cast&lt;B&amp;&amp;>(std::move(a)));
 printf("b2.i = %d\n", b2.i);
 printf("b2.j = %d\n", b2.j);
 printf("^^^ Oops!! Somebody forgot to copy the j field when creating (A)a. Oh, wait... (A)a never had a j field in the first place\n");
 printf("Destroying b2, a, b1\n");
 return 0;
}</pre>



<p>If you&#8217;ve read the code, those printfs will have already given you some hints about the harsh truth: if you move a subclass object to become a superclass object, you&#8217;re losing all the subclass specific data, because <strong>no matter if the original instance was one from a subclass, only the superclass move constructor will be used</strong>. And that&#8217;s bad, very bad. This problem is called <a rel="noreferrer noopener" href="https://en.wikipedia.org/wiki/Object_slicing" data-type="URL" data-id="https://en.wikipedia.org/wiki/Object_slicing" target="_blank">object slicing</a>. It&#8217;s specific to C++ and can also happen with copy constructors. See it with your own eyes:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="cpp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Creating B b1
A::A() 0x7ffd544ca690
B::B() 0x7ffd544ca690
b1.i = 1
b1.j = 2
Moving (B)b1 to (A)a. Which move constructor will be used?
A::A(A&amp;&amp;) 0x7ffd544ca6a0
a.i = 1
(B)a.j = 0
Moving (A)a to (B)b2. Which move constructor will be used?
A::A() 0x7ffd544ca6b0
B::B(B&amp;&amp;) 0x7ffd544ca6b0
b2.i = 1
b2.j = 0
^^^ Oops!! Somebody forgot to copy the j field when creating (A)a. Oh, wait... (A)a never had a j field in the first place
Destroying b2, a, b1
virtual B::~B() 0x7ffd544ca6b0
virtual A::~A() 0x7ffd544ca6b0
virtual A::~A() 0x7ffd544ca6a0
virtual B::~B() 0x7ffd544ca690
virtual A::~A() 0x7ffd544ca690</pre>



<p>Why can something that seems so obvious become such a problem, you may ask? Well, it depends on the context. It&#8217;s not unusual for the codebase of a long lived project to have started using raw pointers for everything, then switching to using references as a way to get rid of null pointer issues when possible, and finally switch to whole objects and copy/move semantics to get rid or pointer issues (references are just pointers in disguise after all, and there are ways to produce null and dangling references by mistake). But this last step of moving from references to copy/move semantics on whole objects comes with the small object slicing nuance explained in this post, and when the size and all the different things to have into account about the project steals your focus, it&#8217;s easy to forget about this.</p>



<p>So, please remember: <strong>never use move semantics that convert your precious subclass instance to a superclass instance</strong> thinking that the subclass data will survive. You can regret about it and create difficult to debug problems inadvertedly.</p>



<p>Happy coding!</p>
<span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1ef9f960e2112ce9f9611efac1245afeb00d6e8d6e8&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1ef9f960e2112ce9f9611efac1245afeb00d6e8d6e8/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1ef9f960e2112ce9f9611efac1245afeb00d6e8d6e8&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1ef9f960e2112ce9f9611efac1245afeb00d6e8d6e8/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Enrique Ocaña González &lt;eocanha@igalia.com&gt;</author>
            <category>feed:218abbb3f30ed17e36476558d8bce9b5</category>
            <pubDate>Tue, 10 Sep 2024 07:58:47 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1ef9f960e2112ce9f9611efac1245afeb00d6e8d6e8</guid>
        </item>
        <item>
            <title>Incorporating 3D Gaussian Splats into the graphics pipeline</title>
            <link>https://www.rojtberg.net/2801/incorporating-3d-gaussian-splats-into-the-graphics-pipeline/</link>
            <description><![CDATA[

<p>3D Gaussian splatting is the emerging rendering technique that is overtaking NeRFs. Since it is centered around point primitives, it is more compatible with traditional graphics pipelines that already support point rendering.</p>



<p>Gaussian splats essentially enhance the concept of point rendering by converting the point primitive into a 3D ellipsoid, which is then projected into 2D during the rendering process.. This concept was initially described in 2002 [3], but the technique of extending Structure from Motion scans in this way was only detailed more recently [1].</p>



<p>In this post, I explore how to integrate Gaussian splats into the traditional graphics pipeline. This allows them to be used alongside triangle-based primitives and interact with them through the depth buffer for occlusion (see header image). This approach also simplifies deployment by eliminating the need for CUDA.</p>


<h2 class="wp-block-heading" id="storage">Storage</h2>


<p>The original implementation uses<a href="https://github.com/graphdeco-inria/gaussian-splatting/blob/472689c0dc70417448fb451bf529ae532d32c095/scene/__init__.py#L85C9-L85C13"> .ply files as their checkpoint format</a>, focusing on maintaining training-relevant data structures at the expense of storage efficiency, leading to increased file sizes.</p>



<p>For example, it stores the covariance as scaling and a rotation quaternion, necessitating reconstruction during rendering. A more efficient approach would be to leverage orthogonality, storing only the diagonal and upper triangular vectors, thereby eliminating reconstruction and reducing storage requirements.</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="579" src="https://www.rojtberg.net/wp-content/uploads/2024/06/psize-1024x579.webp" alt="" class="wp-image-2823" srcset="https://www.rojtberg.net/wp-content/uploads/2024/06/psize-1024x579.webp 1024w, https://www.rojtberg.net/wp-content/uploads/2024/06/psize-300x170.webp 300w, https://www.rojtberg.net/wp-content/uploads/2024/06/psize-768x434.webp 768w, https://www.rojtberg.net/wp-content/uploads/2024/06/psize-1536x868.webp 1536w, https://www.rojtberg.net/wp-content/uploads/2024/06/psize.png 1888w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Further analysis of the storage usage for each attribute shows that the spherical harmonics of orders 1-3 are the main contributors to the file size. However, according to the ablation study in the original publication [1], these harmonics only lead to a modest PSNR improvement of 0.5.</p>



<p>Therefore, the most straightforward way to decrease storage is by discarding the higher-order spherical harmonics. Additionally, the level 0 spherical harmonics can be converted into a diffuse color and merged with opacity to form a single RGBA value. These simple yet effective methods were implemented in one of the early WebGL implementations, resulting in <a href="https://github.com/antimatter15/splat/blob/main/convert.py">the .splat format.</a> As an added benefit, this format can be easily interpreted by viewers unaware of Gaussian splats as a simple colored point cloud:</p>



<figure class="wp-block-image size-large is-resized"><a href="https://www.rojtberg.net/wp-content/uploads/2024/06/opoints.webp"><img decoding="async" width="1024" height="576" src="https://www.rojtberg.net/wp-content/uploads/2024/06/opoints-1024x576.webp" alt="" class="wp-image-2828" style="width:690px;height:auto" srcset="https://www.rojtberg.net/wp-content/uploads/2024/06/opoints-1024x576.webp 1024w, https://www.rojtberg.net/wp-content/uploads/2024/06/opoints-300x169.webp 300w, https://www.rojtberg.net/wp-content/uploads/2024/06/opoints-768x432.webp 768w, https://www.rojtberg.net/wp-content/uploads/2024/06/opoints-1536x864.webp 1536w, https://www.rojtberg.net/wp-content/uploads/2024/06/opoints.webp 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Results using a non Gaussian-splat aware renderer</figcaption></figure>



<p>By directly storing the covariance as previously mentioned we can reduce the precision from <code>float32</code> to <code>float16</code>, thereby halving the storage needed for that data. Furthermore, since most splats have limited spatial extents, we can also utilize <code>float16</code> for position data, yielding additional storage savings.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="564" src="https://www.rojtberg.net/wp-content/uploads/2024/06/psize_splat-1024x564.webp" alt="" class="wp-image-2825" srcset="https://www.rojtberg.net/wp-content/uploads/2024/06/psize_splat-1024x564.webp 1024w, https://www.rojtberg.net/wp-content/uploads/2024/06/psize_splat-300x165.webp 300w, https://www.rojtberg.net/wp-content/uploads/2024/06/psize_splat-768x423.webp 768w, https://www.rojtberg.net/wp-content/uploads/2024/06/psize_splat-1536x846.webp 1536w, https://www.rojtberg.net/wp-content/uploads/2024/06/psize_splat.png 1855w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>With these changes, we achieve a storage requirement of 22 bytes per splat, in contrast to the 44 bytes needed by the .splat format and 236 bytes in the original implementation. Thus, we have attained a 10x reduction in storage compared to the original implementation simply by using more suitable data types.</p>



<p></p>


<h2 class="wp-block-heading" id="blending">Blending</h2>


<p>The image formation model presented in the original paper [1] is similar to the NeRF rendering, as it is compared to it. This involves casting a ray and observing its intersection with the splats, which leads to front-to-back blending. This is precisely the approach taken by the <a href="https://github.com/graphdeco-inria/diff-gaussian-rasterization/blob/main/cuda_rasterizer/forward.cu#L355">provided CUDA implementation</a>.</p>



<p>Blending remains a component of the fixed-function unit within the graphics pipeline, which can be set up for front-to-back blending [2] by using the factors <code>(one_minus_dest_alpha, one)</code> and by multiplying color and alpha in the shader as <code>color.rgb * color.a</code>. This results in the following equation:</p>



<span class="katex-eq" data-katex-display="false">\begin{aligned}C_{dst} &amp;= (1 - \alpha_{dst}) \cdot \alpha_{src} C_{src} &amp;+ C_{dst}\\ \alpha_{dst} &amp;= (1 - \alpha_{dst})\cdot\alpha_{src} &amp;+ \alpha_{dst}\end{aligned}</span>



<p></p>



<p>However, this method requires the framebuffer alpha value to be zero before rendering the splats, which is not typically the case as any previous render pass could have written an arbitrary alpha value.</p>



<p>A simple solution is to switch to back-to-front sorting and use the standard alpha blending factors <code>(src_alpha, one_minus_src_alpha)</code> for the following blending equation:</p>



<span class="katex-eq" data-katex-display="false">C_{dst} = \alpha_{src} \cdot C_{src} + (1 - \alpha_{src}) \cdot C_{dst}</span>



<p></p>



<p>This allows us to regard Gaussian splats as a special type of particles that can be rendered together with other transparent elements within a scene.</p>


<h2 class="wp-block-heading" id="references">References</h2>


<ol class="wp-block-list">
<li>Kerbl, Bernhard, et al. &#8220;3d gaussian splatting for real-time radiance field rendering.&#8221; <em>ACM Transactions on Graphics</em> 42.4 (2023): 1-14.</li>



<li>Green, Simon. &#8220;Volumetric particle shadows.&#8221; <em>NVIDIA Developer Zone</em> (2008).</li>



<li>Zwicker, Matthias, et al. &#8220;EWA splatting.&#8221; <em>IEEE Transactions on Visualization and Computer Graphics</em> 8.3 (2002): 223-238.</li>
</ol>
<span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1ef2cc28da04aa22cc211ef86e6377dfed6ec0fec0f&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1ef2cc28da04aa22cc211ef86e6377dfed6ec0fec0f/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1ef2cc28da04aa22cc211ef86e6377dfed6ec0fec0f&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1ef2cc28da04aa22cc211ef86e6377dfed6ec0fec0f/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Pavel Rojtberg &lt;pavel@rojtberg.net&gt;</author>
            <category>feed:dc2d42ffa90d409ad35691447d64bb45</category>
            <pubDate>Mon, 17 Jun 2024 13:28:33 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1ef2cc28da04aa22cc211ef86e6377dfed6ec0fec0f</guid>
        </item>
        <item>
            <title>Dissecting GstSegments</title>
            <link>https://eocanha.org/blog/2024/04/30/dissecting-gstsegments/</link>
            <description><![CDATA[

<p>During all these years using GStreamer, I&#8217;ve been having to deal with GstSegments in many situations. I&#8217;ve always have had an intuitive understanding of the meaning of each field, but never had the time to properly write a good reference explanation for myself, ready to be checked at those times when the task at hand stops being so intuitive and nuisances start being important. I used the notes I took during an interesting conversation with <a rel="noreferrer noopener" href="https://gitlab.freedesktop.org/mildsunrise" data-type="URL" data-id="https://gitlab.freedesktop.org/mildsunrise" target="_blank">Alba</a> and <a rel="noreferrer noopener" href="https://gitlab.freedesktop.org/ntrrgc" data-type="URL" data-id="https://gitlab.freedesktop.org/ntrrgc" target="_blank">Alicia</a> about those nuisances, during the <a rel="noreferrer noopener" href="https://wiki.gnome.org/Hackfests/GstAutumnHackfest2023" data-type="URL" data-id="https://wiki.gnome.org/Hackfests/GstAutumnHackfest2023" target="_blank">GStreamer Hackfest in A Coruña</a>, as the seed that evolved into this post.</p>



<p>But what are actually <a rel="noreferrer noopener" href="https://gstreamer.freedesktop.org/documentation/gstreamer/gstsegment.html" target="_blank">GstSegments</a>? They are the structures that track the values needed to <a rel="noreferrer noopener" href="https://gstreamer.freedesktop.org/documentation/application-development/advanced/clocks.html" target="_blank">synchronize</a> the playback of a region of interest in a media file.</p>



<p>GstSegments are used to coordinate the translation between Presentation Timestamps (<strong>PTS</strong>), supplied by the media, and <strong>Runtime</strong>.</p>



<p><strong>PTS</strong> is the timestamp that specifies, in buffer time, when the frame must be displayed on screen. This <strong>buffer time</strong> concept (called buffer running-time in the docs) refers to the ideal time flow where rate isn&#8217;t being had into account.</p>



<p>Decode Timestamp (<strong>DTS</strong>) is the timestamp that specifies, in buffer time, when the frame must be supplied to the decoder. On decoders supporting <a rel="noreferrer noopener" href="https://en.wikipedia.org/wiki/Video_compression_picture_types#Summary" data-type="URL" data-id="https://en.wikipedia.org/wiki/Video_compression_picture_types#Summary" target="_blank">P-frames</a> (forward-predicted) and B-frames (bi-directionally predicted), the PTS of the frames reaching the decoder may not be monotonic, but the PTS of the frames reaching the sinks are (the decoder outputs monotonic PTSs).</p>



<p><strong>Runtime</strong> (called clock running time in the docs) is the amount of physical time that the pipeline has been playing back. More specifically, the Runtime of a specific frame indicates the physical time that has passed or must pass until that frame is displayed on screen. It starts from zero.</p>



<p><strong>Base time</strong> is the point when the Runtime starts with respect to the input timestamp in buffer time (PTS or DTS). It&#8217;s the Runtime of the PTS=0.</p>



<p><strong>Start</strong>, <strong>stop</strong>, <strong>duration</strong>: Those fields are buffer timestamps that specify when the piece of media that is going to be played starts, stops and how long that portion of the media is (the absolute difference between start and stop, and I mean absolute because a segment being played backwards may have a higher start buffer timestamp than what its stop buffer timestamp is).</p>



<p><strong>Position</strong> is like the Runtime, but in buffer time. This means that in a video being played back at 2x, Runtime would flow at 1x (it&#8217;s physical time after all, and reality goes at 1x pace) and Position would flow at 2x (the video moves twice as fast than physical time).</p>



<p>The <strong>Stream Time</strong> is the position in the stream. Not exactly the same concept as buffer time. When handling multiple streams, some of them can be offset with respect to each other, not starting to be played from the begining, or even can have loops (eg: repeating the same sound clip from PTS=100 until PTS=200 intefinitely). In this case of repeating, the Stream time would flow from PTS=100 to PTS=200 and then go back again to the start position of the sound clip (PTS=100). There&#8217;s <a rel="noreferrer noopener" href="https://gstreamer.freedesktop.org/documentation/application-development/advanced/clocks.html?gi-language=c#time-overview" data-type="URL" data-id="https://gstreamer.freedesktop.org/documentation/application-development/advanced/clocks.html?gi-language=c#time-overview" target="_blank">a nice graphic in the docs</a> illustrating this, so I won&#8217;t repeat it here.</p>



<p><strong>Time</strong> is the base of Stream Time. It&#8217;s the Stream time of the PTS of the first frame being played. In our previous example of the repeating sound clip, it would be 100.</p>



<p>There are also concepts such as <strong>Rate</strong> and <strong>Applied Rate</strong>, but we didn&#8217;t get into them during the discussion that motivated this post.</p>



<p>So, for translating between Buffer Time (PTS, DTS) and Runtime, we would apply this formula:</p>



<p class="has-text-align-center">Runtime = BufferTime * ( Rate * AppliedRate ) + BaseTime</p>



<p>And for translating between Buffer Time (PTS, DTS) and Stream Time, we would apply this other formula:</p>



<p class="has-text-align-center">StreamTime = BufferTime * AppliedRate + Time</p>



<p>And that&#8217;s it. I hope these notes in the shape of a post serve me as reference in the future. Again, thanks to Alicia, and especially to Alba, for the valuable clarifications during the discussion we had that day in the <a rel="noreferrer noopener" href="https://www.igalia.com/" target="_blank">Igalia</a> office. This post wouldn&#8217;t have been possible without them.</p>



<p></p>



<p></p>
<span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1ef06cee0a8413806ce11ef8e4b5d47feddd02fd02f&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1ef06cee0a8413806ce11ef8e4b5d47feddd02fd02f/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1ef06cee0a8413806ce11ef8e4b5d47feddd02fd02f&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1ef06cee0a8413806ce11ef8e4b5d47feddd02fd02f/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Enrique Ocaña González &lt;eocanha@igalia.com&gt;</author>
            <category>feed:218abbb3f30ed17e36476558d8bce9b5</category>
            <pubDate>Tue, 30 Apr 2024 06:00:00 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1ef06cee0a8413806ce11ef8e4b5d47feddd02fd02f</guid>
        </item>
        <item>
            <title>libSDL2 and VVVVVV for the Wii</title>
            <link>http://mardy.it/blog/2024/02/libsdl2-and-vvvvvv-for-the-wii.html</link>
            <description><![CDATA[
<p>Just a quick update on something that I've been working on in my free time.</p>
<p>I recently refurbished my old Nintendo Wii, and for some reason I cannot yet
explain (not even to myself) I got into homebrew programming and decided to
port libSDL (the 2.x version -- a 1.x port already existed) to it. The result
of this work is already available via the <a href="https://devkitpro.org/">devkitPro</a>
distribution, and although I'm sure there are still many bugs, it's overall
quite usable.</p>
<p>In order to prove it, I ported the game <a href="https://thelettervsixtim.es/">VVVVVV</a>
to the Wii:</p>
<iframe src="https://vk.com/video_ext.php?oid=7200355&amp;id=456239302&amp;hd=1" width="640" height="360" allow="autoplay; encrypted-media; fullscreen;
picture-in-picture;" frameborder="0" allowfullscreen></iframe>

<p>During the process I had to fix quite a few bugs in my libSDL port and in a
couple of other libraries used by VVVVVV, which will hopefully will make it
easier to port more games. There's still an issue that bothers me, where the
screen resolution seems to be not totally supported by my TV (or is it the HDMI
adaptor's fault?), resulting in a few pixels being cut at the top and at the
bottom of the screen. But unless you are a perfectionist, it's a minor issue.</p>
<p>In case you have a Wii to spare, or wouldn't mind playing on the Dolphin
emulator, <a href="https://github.com/mardy/VVVVVV/releases/tag/v2.4.1_wii1">here's the link to the VVVVVV
release</a>. Have fun! :-)</p><span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1eec21f35e5856ac21f11ee945b171ccdc9549b549b&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1eec21f35e5856ac21f11ee945b171ccdc9549b549b/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1eec21f35e5856ac21f11ee945b171ccdc9549b549b&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1eec21f35e5856ac21f11ee945b171ccdc9549b549b/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Alberto Mardegan &lt;mardy@users.sourceforge.net&gt;</author>
            <category>feed:04088ede8ecf981676b12f87999d25d2</category>
            <pubDate>Fri, 02 Feb 2024 17:50:44 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1eec21f35e5856ac21f11ee945b171ccdc9549b549b</guid>
        </item>
        <item>
            <title>Maemo Community e.V. - Invitation to the General Assembly 2023</title>
            <link>http://maemo.org/community/council/maemo_community_e-v--invitation_to_the_general_assembly_2023/</link>
            <description><![CDATA[

<p>
Maemo Community e.V. - Invitation to the General Assembly 2023<br /><br />
Dear Member,<br /><br /></p><p>
The meeting will be held on Friday, December 29th 2023 at 12:00 CET on irc.libera.chat channel #maemo-meeting. <br /><br />

Unless any further issues are raised, the agenda includes the following topics:<br />
1.    Welcome by the Chairman of the Board<br />
2.    Determination of the proper convocation and the quorum of the General Assembly<br />
3.    Acceptance of the annual report for the fiscal year and actions of the Executive<br />
6.    Any other business<br /><br /></p><p>
Requests for additions to the agenda must be submitted to the Board in writing one week prior to the meeting (§ 9.2 of the Statutes).<br /><br /></p><p>
On Behalf of the Maemo Council,
Jussi Ohenoja
</p><p></p><span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1ee8f76cbf19b888f7611eea2e1ffc65d4ee6c9e6c9&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1ee8f76cbf19b888f7611eea2e1ffc65d4ee6c9e6c9/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1ee8f76cbf19b888f7611eea2e1ffc65d4ee6c9e6c9&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1ee8f76cbf19b888f7611eea2e1ffc65d4ee6c9e6c9/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Jussi Ohenoja &lt;juice@swagman.org&gt;</author>
            <category>feed:0ffd60645267b49419c542bd55f461df</category>
            <pubDate>Thu, 30 Nov 2023 08:52:08 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1ee8f76cbf19b888f7611eea2e1ffc65d4ee6c9e6c9</guid>
        </item>
        <item>
            <title>stb_image_resize2.h – performance</title>
            <link>https://www.rojtberg.net/2754/stb_image_resize2-h-performance/</link>
            <description><![CDATA[

<p>Recently there was an large rework to the STB single-file image_resize library (STBIR) bumping it to 2.0. While the v1 was really slow and merely usable if you needed to quickly get some code running, <a href="https://github.com/nothings/stb/blob/master/stb_image_resize2.h">the 2.0 rewrite</a> claims to be more considerate of performance by using SIMD. So lets put it to a test.</p>



<p>As references, I chose the moderately optimized C only <a href="https://github.com/OGRECave/ogre/blob/04fdc54eafdcb5732757122715e0fd4ae696e238/OgreMain/src/OgreImageResampler.h#L284">implementation of Ogre3D</a> and the highly optimized SIMD implementation in OpenCV.</p>



<p>Below you find time to scale a 1024x1024px byte image to 512x512px. All libraries were set to linear interpolation. The time is the accumulated time for 200 runs.</p>



<figure class="wp-block-table"><table><tbody><tr><td></td><td>RGB</td><td>RGBA</td></tr><tr><td>Ogre3D 14.1.2</td><td>660 ms</td><td>668 ms</td></tr><tr><td>STBIR 2.01</td><td>632 ms</td><td>690 ms</td></tr><tr><td>OpenCV 4.8</td><td>245 ms</td><td>254 ms</td></tr></tbody></table></figure>



<p>For the RGBA test, STIBIR was set to the <code>STBIR_4CHANNEL</code> pixel layout. All libraries were compiled with <code>-O2 -msse</code>. Additionally OpenCV could dispatch AVX2 code. Enabling AVX2 with STBIR actually decreased performance.</p>



<p>Note that while STBIR has no performance advantage over a C only implementation for the simple resizing case, it offers some neat features if you want to handle SRGB data or non-premultiplied alpha.</p>
<span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1ee88e30be696a288e311ee8094cde9c1c4066a066a&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1ee88e30be696a288e311ee8094cde9c1c4066a066a/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1ee88e30be696a288e311ee8094cde9c1c4066a066a&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1ee88e30be696a288e311ee8094cde9c1c4066a066a/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Pavel Rojtberg &lt;pavel@rojtberg.net&gt;</author>
            <category>feed:dc2d42ffa90d409ad35691447d64bb45</category>
            <pubDate>Wed, 15 Nov 2023 13:50:28 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1ee88e30be696a288e311ee8094cde9c1c4066a066a</guid>
        </item>
        <item>
            <title>The bypass paywalls on a phone</title>
            <link>https://pvanhoof.be/blog/index.php/2023/07/27/the-bypass-paywalls-on-a-phone</link>
            <description><![CDATA[

<p>Bypassing paywalls is a sport for some. And it ain&#8217;t hard for Desktop Browsers. Just install <a href="https://github.com/iamadamdev/bypass-paywalls-chrome">a addon</a> in your favorite Desktop Browser.</p>



<p>Unfortunately this didn&#8217;t work on a Android or iPhone phone. Nor on Sailfish OS with its Android emulation. Because over there browsers like Chrome and Chromium don&#8217;t allow extensions to be installed. Firefox does have some limited support for addons, but it can&#8217;t open local XPI files. Its addon menu doesn&#8217;t contain the addon and the addon website for it sees the  running browser as incompatible.</p>



<p>Luckily you have Kiwi Browser, which is a Chrome based browser that did not disable extensions to be installed.</p>



<p>Once Kiwi is installed you can go to either chrome://extensions or kiwi://extensions, enable Developer mode and then open the zip file as explained in the <a href="https://github.com/iamadamdev/bypass-paywalls-chrome/blob/master/README.md">Readme.md</a>.</p>



<p>ps. For Sailfish I had to install <a href="https://apkpure.com/kiwi-browser-fast-quiet/com.kiwibrowser.browser/variant/112.0.5615.137-APK">an older version of Kiwi Browser</a>, as the most recent version doesn&#8217;t seem to work.</p>
<span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1ee2c623152fbe82c6211eeb5ec153dd71da193a193&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1ee2c623152fbe82c6211eeb5ec153dd71da193a193/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1ee2c623152fbe82c6211eeb5ec153dd71da193a193&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1ee2c623152fbe82c6211eeb5ec153dd71da193a193/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Philip Van Hoof &lt;pvanhoof@gnome.org&gt;</author>
            <category>feed:43af5b2374081abdd0dbc4ba26a0b54c</category>
            <pubDate>Thu, 27 Jul 2023 08:37:15 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1ee2c623152fbe82c6211eeb5ec153dd71da193a193</guid>
        </item>
        <item>
            <title>Will the internet forget russophobia?</title>
            <link>http://mardy.it/blog/2023/06/will-the-internet-forget-russophobia.html</link>
            <description><![CDATA[
<p>I've often wondering what will happen when this horrific war in Europe will
finally be over. I won't be discussing politics here, but what is mostly
interesting to me is how (and if) all the companies who made high proclaims
about not doing business with Russia will justify their getting back into the
Russian market. They will probably count on the fact that the war will be long,
and that people will forget what these companies' stance was. After all, the
world has forget about all the companies who collaborated with the Nazi regime,
so we can expect the same to happen with this war.</p>
<p>But I don't think that's right: if you made a mistake, you should be held
accountable for it. You might be wondering what is the “mistake” I'm talking
about: that's <strong>russophobia</strong>, indeed. To put it simply, and make a concrete
example: if The Qt Company stops doing business with Russian companies and
blocks its downloads page to Russian IP addresses because of the war, <em>without
being forced by the government to do so</em>, but does not take similar measures
against other countries who wage wars which have caused way more deaths and
displacement of individuals, well, that's what I call “russophobia”. Of course,
I'm aware that there's way more than that, and that the hatred for all what is
Russian (including culture and sport competitions) is an even bigger issue, but
in this blog post I'm especially focused on the IT world, so please forgive my
semi-intentional narrow-mindness on this topic.</p>
<p>Now, I'm fully aware that we live in a mediatic bubble that directs our
decisions in a way that is almost automatic, and I'm sure that most people
working for companies who took russophobic decisions are not themselves
russophobic at all (and I'm not dismissing the possibility that even the very
same people who took these decisions might not be russophobic) and that these
decisions were taken on impulse, because “everyone else is doing the same” and
due to the media pressure that if you don't do that, you might get accused of
supporting the “wrong” side of the war.</p>
<p>But that's not an excuse, especially for “smart” people like IT engineers (and
I put the adjective between quotes <a href="http://mardy.it/blog/2022/11/the-idiotism-of-software-developers.html">for a
reason</a>), and especially after
the initial heat has passed and when, after more than one year of war, we
should have been exposed to different point of views and be able to evaluate
the situation more rationally. It has been therefore especially stunning for me
to learn that the Linux Kernel community, and hence The Linux Foundation, has
recently given room to russophobic behaviours, refusing a patch coming from the
Russian company Baikal (a CPU maker). For the record, the incriminated patch
was not related to supporting hardware produced by this company (not that this
would make the deed less serious, but at least one could have argued that there
could be some spot of logic in it):</p>
<div class="code"><pre class="code literal-block">From: Jakub Kicinski &lt;kuba@kernel.org&gt;
To: Serge Semin &lt;Sergey.Semin@baikalelectronics.ru&gt;
[...]

On Tue, 14 Mar 2023 01:42:24 +0300 Serge Semin wrote:
&gt; From: Serge Semin &lt;Sergey.Semin@baikalelectronics.ru&gt;

We don't feel comfortable accepting patches from or relating 
to hardware produced by your organization.

Please withhold networking contributions until further notice.
</pre></div>

<p>(<a href="https://lore.kernel.org/all/20230314103316.313e5f61@kernel.org/">here</a> the
link to the original discussion). One week later, someone denounced this as a
violation to the Code of Conduct committee (unfortunately the only link I could
find to this is coming from a <a href="https://www.opennet.ru/openforum/vsluhforumID3/129994.html#529">Russian IT
forum</a>, and any
other references seem to have been removed from DuckDuckGo and Google), only to
receive a reply that it was all fine.</p>
<p>To me this is not fine. The war will end, sooner or later, but it bothers me
that we never learn from the past and repeat the same mistakes over and over.
We apparently know a lot about propaganda, yet we fail to recognize it when it
influences our own mind and actions. My humble contribution is the creation of
a page where I list the companies who have taken russophobic actions, and, on
the opposite side, companies (like Flickr and Zorin OS) who have stood out for
positive messages and helpful actions. My hope is that some of the listed
companies will find the courage to review their actions, and either correct
their stance, or at least clarify their reasons. So, I hereby present</p>
<p style="text-align: center; font-size: 130%">
  <a href="https://github.com/mardy/russophobia">Denouncing russophobia</a>
</p>

<p>where you'll find some of the good and some of the bad companies. I'm sure I'm
missing plenty of them: I just started recollecting my memories and searching
online a couple of days ago. I created this as a GitHub project, because indeed
I'm looking forward for contributions, to help me make the lists more complete.
I need to stress that the fact that a company has announced the suspension of
its business in Russia does not automatically make it russophobic: what we need
to look at is the <em>reason</em> for that decision: companies like LEGO and Nintendo,
for example, have suspended their operations citing logistic and financial
reasons; no judgement involved.</p>
<p>Let me repeat it once more, just to make sure there are no misunderstandings:
it's perfectly fine for businesses to take a stance on politics, and sometimes
it might be even praiseworthy; but if a company is international, and does not
apply the same reasoning to other armed conflicts, or seem to care only about
certain human rights violations and not others, then it's a case of double
standards which we need to be aware of, and make the company think twice about
it. And that's also the reason why you won't find any Ukrainian company among
the “bad” ones, because in their case the reaction is perfectly understandable
and they can hardly be accused of adopting double standards (well, technically
speaking, they are adopting double standards, but when you are so directly
impacted I think it does not deserve a blame): if it's your house which burns,
you should definitely scream about it, even if you previously have been silent
about your neighbour house's burning.</p>
<p><strong>I'm especially looking forward for more “good” companies</strong>, who have shown empathy
towards the people affected by the war (and maybe even collected money to help
them) while refraining from taking the judging role and forgetting about all
the injustice and suffering that other wars have caused (including on that very
same piece of land that suddenly appeared on all newspapers' front pages on
February 24th, 2022). I hope that these companies can serve as an example of
positive action, humanity, and love.</p><span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1ee02ef5cfc281002ef11ee881095434502751a751a&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1ee02ef5cfc281002ef11ee881095434502751a751a/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1ee02ef5cfc281002ef11ee881095434502751a751a&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1ee02ef5cfc281002ef11ee881095434502751a751a/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Alberto Mardegan &lt;mardy@users.sourceforge.net&gt;</author>
            <category>feed:04088ede8ecf981676b12f87999d25d2</category>
            <pubDate>Sun, 04 Jun 2023 07:41:02 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1ee02ef5cfc281002ef11ee881095434502751a751a</guid>
        </item>
        <item>
            <title>Do not fall for the Synology Hardware SCAM</title>
            <link>https://www.rojtberg.net/2679/do-not-fall-for-the-synology-hardware-scam/</link>
            <description><![CDATA[

<p>I recently needed some NAS and went with the &#8220;Synology RS1221+&#8221; barebone system. The system is competitively priced when compared to the similar &#8220;QNAP TS-873AeU-4G&#8221;.</p>


<h2 class="wp-block-heading" id="synology-hdd">Synology HDD</h2>


<p>For storage, the sweet spot between price and capacity was at 18TB. Lets look at some options:</p>



<figure class="wp-block-table"><table><tbody><tr><td>Toshiba MG09ACA 18TB</td><td>270€</td></tr><tr><td>Seagate Exos X X18</td><td>280€</td></tr><tr><td>Synology HAT5310-18T</td><td>700€</td></tr></tbody></table></figure>



<p>Depending on the benchmark sometimes the Toshiba comes out on top and sometimes the Seagate. Both are similarly priced, so thats fine.<br />However, talking of the price the Synology HDD stands out by asking a 150% premium.<br />You might now wonder whether you also get a better performance or other features in return. Well.. guess which is the only 18TB HDD that <a href="https://www.synology.com/de-de/compatibility?search_by=products&amp;model=RS1221%2B&amp;category=hdds_no_ssd_trim&amp;p=1&amp;change_log_p=1">is verified by Synology</a> for the RS1221+?</p>



<p>The scammy part here however is that the HAT5300 series are just rebranded Toshiba Drives with a different firmware. So the HAT5310 likely is just the MG09ACA and the main difference is the profit margin.<br />Note that different firmware does not result in any noticeable difference in performance.</p>



<p>I went with the unverified Seagate drives and &#8211; as one might expect &#8211; there are zero issues with doing so.</p>


<h2 class="wp-block-heading" id="synology-ram">Synology RAM</h2>


<p>At this point you might say, well Synology just did not get to test more 18TB drives.<br />Well.. I found the 4GB RAM rather tight and wanted to upgrade to 32GB as RAM is currently quite cheap anyway.</p>



<p>The options here are</p>



<figure class="wp-block-table"><table><tbody><tr><td>Kingston KSM26SED8/16HD</td><td>50€</td></tr><tr><td>Synology D4ECSO-2666-16G</td><td>350€</td></tr></tbody></table></figure>



<p>I think there appears to be a pattern here. Again, both options have the same specs i.e. DDR4 2666, ECC SO-DIMM. Maybe Synology even rebranded the Kingston modules too, but I did not verify this.</p>



<p>While the DiskManager did not complain about the Seagate HDD, there is a warning when going with Kingston now. I guess this is because it matters even less.</p>



<p>To conclude this, I first want to emphasizes that both the Synology NAS Hardware and their DiskManager software work great with non Synology Hardware &#8211; just as one would expect of a standard x86 platform.</p>



<p>It is just a pity that they try to FUD you into buying their overpriced HDD and RAM.<br />Basically this is the same game as with printer vendors predicting ravages and annihilation when using 3rd party ink.</p>
<span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1ee88e3089e4aa888e311ee8094cde9c1c4066a066a&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1ee88e3089e4aa888e311ee8094cde9c1c4066a066a/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1ee88e3089e4aa888e311ee8094cde9c1c4066a066a&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1ee88e3089e4aa888e311ee8094cde9c1c4066a066a/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Pavel Rojtberg &lt;pavel@rojtberg.net&gt;</author>
            <category>feed:dc2d42ffa90d409ad35691447d64bb45</category>
            <pubDate>Sat, 01 Apr 2023 13:03:55 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1ee88e3089e4aa888e311ee8094cde9c1c4066a066a</guid>
        </item>
        <item>
            <title>The Maemulator: Running a certain 2009 tech demo on modern Linux</title>
            <link>http://thpmaemo.blogspot.com/2023/02/the-maemulator-running-certain-2009.html</link>
            <description><![CDATA[
<p>Want to revisit 2009's N900 tech demo but you got rid of your old toys long ago or don't want to bother digging them out of your desk drawer? <a href="https://thp.io/2023/maemulator/" target="_blank">The Maemulator</a> to the rescue! It uses QEMU user-space emulation and some LD_PRELOAD magic + other in-process trickery to get it working on any modern Linux machine that has an OpenGL driver. Add multi-sample anti-aliasing, anisotropic filtering, higher resolutions, keyboard input and various fixes, and you are all set for a few minutes of fun distraction.</p><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8HX3Ejw0z-QH-fPpEzT88yeeacRrPgjJ8_ZBRliqoEoMo_sA5NxBjJM7uJqEu5xK0g687ToEhD6fk30adqjNLrmXMW5oen5ylWEN0AH2VGTEbH555d0h0OXqKIAJbNjqMd5jODMXwrxULYgVDWOS-AbYx47PEkc0EBMxcbw5eh8bRz3Gpk5mLkiau/s2560/FojwhFDXsAAeAc7.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1440" data-original-width="2560" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8HX3Ejw0z-QH-fPpEzT88yeeacRrPgjJ8_ZBRliqoEoMo_sA5NxBjJM7uJqEu5xK0g687ToEhD6fk30adqjNLrmXMW5oen5ylWEN0AH2VGTEbH555d0h0OXqKIAJbNjqMd5jODMXwrxULYgVDWOS-AbYx47PEkc0EBMxcbw5eh8bRz3Gpk5mLkiau/w640-h360/FojwhFDXsAAeAc7.jpeg" width="640" /></a></div><br /><p></p><span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1edad893f209332ad8911edbcc70728cc9b488b488b&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1edad893f209332ad8911edbcc70728cc9b488b488b/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1edad893f209332ad8911edbcc70728cc9b488b488b&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1edad893f209332ad8911edbcc70728cc9b488b488b/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Thomas Perl &lt;m@thp.io&gt;</author>
            <category>feed:437c40ecc45d4b0fa868e422ae16adb1</category>
            <pubDate>Wed, 15 Feb 2023 22:55:00 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1edad893f209332ad8911edbcc70728cc9b488b488b</guid>
        </item>
        <item>
            <title>Cara Download Judi online Apk Di iPhone</title>
            <link>https://valeriovalerio.org/cara-download-judi-online-apk-di-iphone/</link>
            <description><![CDATA[
<p><strong>Judi online</strong> adalah salah satu agen taruhan judi online yang menyediakan berbagai permainan judi online yang dilengkapi dengan server terbaik dan juga tingkat keamanan yang baik sehingga data setiap member dapat terjamin keamanannya.</p>
<p>Judi online memberikan kenyamanan dan juga keamanan bagi setiap member agar dapat bermain dan bertaruh dengan nyaman. Selain itu juga menawarkan banyak promo yang bisa didapatkan dengan mengikuti syarat dan juga ketentuan yang ditetapkan.</p>
<p>Situs menawarkan berbagai game judi online untuk memberikan pengalaman terbaik bagi setiap membernya yang dapat dimainkan dengan satu akun saja. Selain itu, memberikan fasilitas dengan performa yang responsive, stabil dan modern sehingga memberikan pengalaman menakjubkan yang seru dan menyenangkan.</p>
<p>Sebagai situs penyedia game judi online terbaik dengan kualitas terbaik, juga memberikan kemudahan proses transaksi deposit maupun withdraw dengan mudah dan juga cepat. Judi online juga menyediakan layanan bantuan yang bisa diakses dalam 24 jam penuh. Daftar sekarang dengan cara kunjungi situs resmi.</p>
<h3>Cara Download Judi online Apk Di iPhone</h3>
<p>Sebagai situs penyedia game judi online terbaik dan terpercaya, <strong>Judi online</strong> menawarkan pelayanan terbaik dengan menghadirkan program aplikasi berbasis Android dan juga iPhone. Untuk mendapatkan program Apk di iPhone, kamu dapat download secara langsung Apk dari pada link ini atau pada menu Download Apk. Pastikan kamu telah login terlebih dahulu untuk dapat download Judi online Apk di iPhone.</p>
<p>Download sekarang dan rasakan kecepatan server terbaik dengan bermain di Apk pada perangkat smartphone iPhone. Salah satu ketentuan untuk dapat bergabung dan bermain di Judi online adalah telah berumum 18+, menggunakan data yang valid dan dapat menjaga kerahasiaan akun.</p>
<ol>
<li>Siapkan smartphone iPhone &#8211; pertama pastinya Anda diharuskan untuk menyiapkan perangkat berbasis iPhone terlebih dahulu untuk bisa melakukan proses download. Smartphone berbasis iPhone adalah salah satu yang selama ini banyak digunakan karena memang dianggap lebih mudah dan praktis.</li>
<li>Kunjungi situs resmi Judi online- anda juga harus bisa mengetahui situs resmi dari situs tersebut. Anda bisa mengunjungi situs utama ataupun juga situs alternatif yang tersedia. Dengan cara begitu nanti aksesnya juga pasti akan lebih mudah dan juga praktis.</li>
<li>Cari link download yang tersedia &#8211; ada beberapa pilihan yang download yang kemudian tersedia dan anda bisa coba memilih salah satunya saja. Link download yang Anda pilih pastinya adalah link download for iPhone Bukan for Android.</li>
<li>Klik tombol download &#8211; selanjutnya Anda tinggal klik tombol tersebut untuk memulai proses download. Prosesnya sendiri tidak perlu memakan waktu lama dan biasanya hanya sebentar saja.</li>
</ol>
<p>Judi online adalah agen judi online yang menghadirkan berbagai jenis game judi online terlengkap dan juga terpercaya. Ini juga telah memiliki lisensi resmi dari PAGCOR (Philippine Amusement And Gaming Corporation) sejak tahun 2017. Anda bisa coba gabung di situ jadi yang satu ini karena memang terpercaya dan bisa dianggap sebagai pilihan tempat bermain yang aman dan nyaman. Bahkan juga situs ini jadi salah satu pilihan yang direkomendasikan dan banyak pemain profesional yang selama ini sudah berpengalaman dan sering bermain permainan taruhan judi bisa.</p>
<p>Dengan download <strong>Judi online</strong> Apk di iPhone, maka bermain taruhan online lebih mudah untuk dimainkan dengan mudah dan juga cepat. Banyak keunggulan dan keuntungan yang dimiliki dan ditawarkan sehingga sangat layak memainkan taruhan judi di situs tersebut.</p>
<p>The post <a rel="nofollow" href="https://valeriovalerio.org/cara-download-judi-online-apk-di-iphone/">Cara Download Judi online Apk Di iPhone</a> appeared first on <a rel="nofollow" href="https://valeriovalerio.org">VALERIOVALERIO</a>.</p>
<span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1eda8761467367ca87611ed9ea2d5ce824a17af17af&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1eda8761467367ca87611ed9ea2d5ce824a17af17af/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>1 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1eda8761467367ca87611ed9ea2d5ce824a17af17af&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1eda8761467367ca87611ed9ea2d5ce824a17af17af/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Valério Valério &lt;vdv100@gmail.com&gt;</author>
            <category>feed:ff8b6dc697dc403cb693cacff69f3818</category>
            <pubDate>Thu, 09 Feb 2023 11:06:08 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1eda8761467367ca87611ed9ea2d5ce824a17af17af</guid>
        </item>
        <item>
            <title>Cara Download Judi Online Apk Di Android</title>
            <link>https://valeriovalerio.org/cara-download-judi-online-apk-di-android/</link>
            <description><![CDATA[
<p><strong>Judi online</strong> merupakan salah satu situs judi online yang menyediakan berbagai macam permainan casino online paling populer di dunia. Kamu dapat memilih dan memainkan semua permainan hanya menggunakan satu akun di situs ini. Bermain permainan taruhan judi Casino di situs judi yang satu ini memang sangatlah menguntungkan pasalnya memang aksesibilitasnya sangat mudah. Kita para pemain bisa mengakses permainan dengan menggunakan beberapa pilihan perangkat salah satu diantaranya menggunakan smartphone mobile yang saat ini memang banyak digunakan.</p>
<p>Situs ini menjadi salah satu situs judi online paling terlengkap dan juga terpercaya yang tentu saja berlisensi sehingga aman dijamin aman dan nyaman untuk bermain. Beberapa game judi online yang tersedia di situs ini adalah Sport, Live Casino, Poker dan Slot. Permainan taruhan judi Casino adalah salah satu dari beberapa pilihan permainan yang paling banyak peminat dan penggunanya karena mungkin lebih banyak variasinya. Selain itu juga ini adalah permainan klasik yang sudah ada sejak dulu dan sampai sekarang masih banyak digunakan.</p>
<p>Sebagai situs penyedia judi online terbaik, situs ini terus berkembang dan semakin modern dengan menghadirkan aplikasi yang dapat di Instal pada perangkat smartphone Android dan juga iOS yang disebut dengan nama Apk.</p>
<h3>Tutorial cara download APK Judi online Mudah Di Android</h3>
<p>Salah satu keunggulan daftar di situs judi online <strong>Judi online</strong> adalah dapat bermain berbagai permainan cukup dengan satu akun yang didaftarkan. Pemain dapat bermain kapanpun dan dimanapun dengan mengaksesnya melalui perangkat smartphone seperti Android. Jika Anda memang mau bermain dengan menggunakan Android maka harus memahami beberapa tutorial dan panduannya terlebih dahulu. Salah satu di antaranya adalah tentang cara anda bisa download dan instal aplikasinya.</p>
<p>Salah satu keunggulan dari situs ini adalah adanya Apk yang dapat di download dan di Instal pada perangkat Android maupun iOS. Untuk dapat download Judi online Apk cukuplah mudah, kamu harus login terlebih dahulu di situs dengan menggunakan akun yang kamu daftarkan, selanjutnya kamu dapat menemukan link download Apk pada menu Apk.</p>
<h4>1. Siapkan smartphone Android</h4>
<p>Karena judulnya di sini kita bahas tentang bagaimana cara download di smartphone Android, maka hal pertama perlu yang disiapkan adalah smartphone berbasis Android. Sebagaimana diketahui bahwa smartphone Android yang bisa kita siapkan sangat banyak sekali. Kita bisa siapkan jenis atau merk brand smartphone Android apa saja siswa yang dimiliki.</p>
<h4>2. Kunjungi situs resmi Judi online</h4>
<p>Lalu selanjutnya Anda juga bisa mengunjungi situs resmi dari judi online. Situs resminya sendiri Memang bisa melalui situs utama ataupun juga link alternatif. Silakan Anda pilih sesuai dengan apa yang bisa diakses.</p>
<h4>3. Pilih link download for Android</h4>
<p>Selanjutnya perlu anda cari dan temukan salah satu pilihan link download. Kemudian yang harus dipilih dan diklik tentunya adalah ding download APK for Android agar kompatibel.</p>
<p>Setelah membuka menu Apk, maka kamu akan menlihat pilihan yang tersedia, yaitu Apk untuk Android dan juga iOS, pilih Androin dan Apk akan langsung masuk ke unduhan di smartphone kamu. Setelah proses download selesai, lakukan instalasi untuk memasang Apk pada perangkat Android. Pastingan setingan untuk dapat memasang sumber tidak dikenal (dari luar play store) telah aktif agar proses instalasi dapat berjalan.</p>
<p>Dengan download dan memasang <strong>Judi online</strong> di perangkat Android, maka kamu dapat memainkan game casino online dengan mudah dan juga praktis. Download sekarang aplikasinya untuk mulai bermain game dan meraih kemenangan.</p>
<p>The post <a rel="nofollow" href="https://valeriovalerio.org/cara-download-judi-online-apk-di-android/">Cara Download Judi Online Apk Di Android</a> appeared first on <a rel="nofollow" href="https://valeriovalerio.org">VALERIOVALERIO</a>.</p>
<span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1eda7b559b23dbaa7b511edbb3ff5bd53b386d586d5&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1eda7b559b23dbaa7b511edbb3ff5bd53b386d586d5/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>1 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1eda7b559b23dbaa7b511edbb3ff5bd53b386d586d5&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1eda7b559b23dbaa7b511edbb3ff5bd53b386d586d5/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Valério Valério &lt;vdv100@gmail.com&gt;</author>
            <category>feed:ff8b6dc697dc403cb693cacff69f3818</category>
            <pubDate>Wed, 08 Feb 2023 11:03:32 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1eda7b559b23dbaa7b511edbb3ff5bd53b386d586d5</guid>
        </item>
        <item>
            <title>Cara Withdraw Judi online dengan Mudah Cepat Landing</title>
            <link>https://valeriovalerio.org/cara-withdraw-judi-online-dengan-mudah-cepat-landing/</link>
            <description><![CDATA[
<p><strong>Judi online</strong> merupakan game terbaik dan saat ini banyak tersedia game terlengkap di Indonesia. Selain permainan judi bola Sportsbook, tersedia juga beragam permainan judi online yang populer dan terlengkap yang bisa kamu mainkan disini. Permainan taruhan judi yang lengkap menjadikan situs ini jadi salah satu yang kemudian cukup layak untuk dijadikan tempat bermain langganan. Apalagi memang ada banyak kemudahan yang ditawarkan untuk para pemain yang bergabung termasuk juga kemudahan dalam transaksi baik itu deposit atau pun juga withdraw penarikan dana.</p>
<p>Kita sebagai pemain bisa melakukan proses penarikan dana dengan menggunakan beragam pilihan metode yang tersedia dan juga selama ini populer digunakan. Misalnya kita bisa melakukan penarikan dana dengan menggunakan rekening bank, ataupun juga dengan menggunakan 6 pilihan lain. Sebagai situs judi online terbaik dan juga terpercaya di Indonesia, Judi online memberikan kepuasan bagi para pemainnya dengan mudahnya meraih keuntungan dengan bermain. Kesempatan ini tentu hanya khusus bagi para member yang terdaftar sehingga pemain merasa betah dan juga nyaman ketika bermain di situs ini.</p>
<h3>Daftar game yang ada Situs Judi judi online</h3>
<p>Setiap pemain dapat mengakses beragam permainan judi online dengan hanya mendaftar akun di Judi online. Dengan mendaftar di situs ini, setiap pemain dapat mengakses setiap permainan menggunakan satu akun yang didaftarkan sehingga lebih mudah untuk meraih keuntungan dari setiap game judi online yang ada disini. Situs agen judi yang satu ini memang menawarkan ragam pilihan koleksi permainan yang membuat banyak orang tertarik bermain di dalamnya.</p>
<p>Banyaknya pilihan permainan juga memungkinkan pemain untuk bisa mengganti pilihan permainan sesuai dengan apa yang disukai. Anda bisa memilih jenis pilihan permainan sesuai dengan apa yang ada saat ini diantaranya tentu sesuai hobi dan minat. Beberapa jenis game judi online yang tersedia diantaranya adalah</p>
<ul>
<li>Sportsbook</li>
<li>Poker Online</li>
<li>Slots</li>
<li>IDN Live</li>
<li>Bandar Togel</li>
</ul>
<h3>Wajib Deposit Judi Online Dulu</h3>
<p>Selain memberikan kemudahan daftar akun dan bonus yang beragam bagi para pemainnya. Situs ini juga memberikan fasilitas deposit yang lengkap untuk menunjang kebutuhan setiap member. Metode deposit yang tersedia disini diantaranya adalah transfer bank meliputi bank BCA, Mandiri, BNI, BRI dan lainnya. Proses deposit adalah hal yang wajib terlebih dahulu harus dilakukan kemudian penting untuk anda lakukan sebelum Anda bisa melakukan proses penarikan dana withdraw.</p>
<p>Selain itu terdapat juga pilihan deposit menggunakan pulsa dan juga dompet digital / e-wallet agar memberikan kenyamanan serta kemudahan bagi setiap pemain. Deposit disini juga sangat mudah, dengan minimal deposit adalah Rp 10.000 saja untuk dapat mulai bertaruh pada permainan judi yang dimainkan.</p>
<h3>Cara Withdraw Judi online dengan Mudah</h3>
<p>Hal yang paling diinginkan dalam bermain judi online adalah mendapat kemenangan dan juga keuntungan yang besar. Dengan bermain di situs <strong>Judi online</strong>, kamu berkesempatan mendapatkannya dengan mudah dan juga dijamin membayar. Salah satunya adalah kemudahan proses Withdraw bagi pemain yang akan melakukan penarikan uang dari akun ke rekening yang dimilikinya.</p>
<p>Cara untuk withdraw di situs ini sangat mudah yakni adalah:</p>
<ol>
<li>Login di Judi online</li>
<li>Klik menu Withdraw</li>
<li>Isi nominal penarikan yang di inginkan, minimal adalah Rp 50.000</li>
<li>Klik Withdraw</li>
<li>Selesai, tunggu proses pencairan</li>
</ol>
<p>Itulah cara withdraw <strong>Judi online</strong> bagi yang ingin melakukan penarikan saldo di akun judi ini ke rekeningnya. Semoga bermanfaat.</p>
<p>The post <a rel="nofollow" href="https://valeriovalerio.org/cara-withdraw-judi-online-dengan-mudah-cepat-landing/">Cara Withdraw Judi online dengan Mudah Cepat Landing</a> appeared first on <a rel="nofollow" href="https://valeriovalerio.org">VALERIOVALERIO</a>.</p>
<span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1eda6f4ec3b7d5ca6f411ed976705e9534ae90ce90c&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1eda6f4ec3b7d5ca6f411ed976705e9534ae90ce90c/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>1 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1eda6f4ec3b7d5ca6f411ed976705e9534ae90ce90c&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1eda6f4ec3b7d5ca6f411ed976705e9534ae90ce90c/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Valério Valério &lt;vdv100@gmail.com&gt;</author>
            <category>feed:ff8b6dc697dc403cb693cacff69f3818</category>
            <pubDate>Tue, 07 Feb 2023 10:59:29 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1eda6f4ec3b7d5ca6f411ed976705e9534ae90ce90c</guid>
        </item>
        <item>
            <title>Cara Login Akun Judi Online Mudah dan Aman</title>
            <link>https://valeriovalerio.org/cara-login-akun-judi-online-mudah-dan-aman/</link>
            <description><![CDATA[
<p>Game judi online merupakan permainan yang paling banyak diminati baik di Indonesia maupun di dunia. Salah satu game judi online yang sangat populer adalah esport atau Sportsbook. Di Indonesia sendiri, permainan ini sangat banyak di minati karena sangat seru dan juga menguntungkan. Bagi kamu pecinta game esport, <strong>Judi online</strong> adalah pilihan terbaik untuk solusi bermain judi online yang nyaman dan juga aman dengan pilihan game yang ditawarkan sangat populer dan juga lengkap. Judi online memberikan kemudahan bagi para pemainnya untuk dapat bermain dengan menyenangkan dan juga menguntungkan.</p>
<h3>Daftar Judi Online Judi online</h3>
<p>Agar dapat bermain permainan judi online, setiap calon pemain harus memiliki akun terlebih dahulu di situs judi. Calon pemain dapat membuat akun dengan mudah dengan cara mengisi formulir pendaftaran yang tersedia di situs judi online Judi online terpercaya.</p>
<p>Dengan memiliki akun, kamu dapatt memperoleh kesempatan meraih keuntungan hingga ratusan juta rupiah secara nyata hanya dengan bermain di situs. Selain itu, tersedia beragam pilihan permainan yang dapat dimainkan oleh memberseperti:</p>
<ul>
<li>Sportsbook</li>
<li>Esport</li>
<li>Poker Online</li>
<li>IDN Live</li>
<li>Bola Tangkas</li>
<li>Slots</li>
</ul>
<p>Dengan mendaftar di situs, kamu dapat mengakses setiap permainan yang tersedia dengan menggunakan akun yang kamu miliki. Cukup dengan satu akun untuk dapat mengakses berbagai permainan judi online.</p>
<h3>Sebelum login, wajib daftar akun dulu!</h3>
<p>Pastikan agar anda mengetahui bahwa proses login hanya bisa dilakukan jika sudah melakukan proses registrasi akun. Jadi sebaiknya Anda pahami dan pelajari betul bahwa proses login ini jadi salah satu yang tentu menguntungkan. Banyak diantara pemain yang kemudian tertarik untuk bermain permainan taruhan judi tapi tidak mau melakukan registrasi pendaftaran. Hal itu pasti tidak mungkin untuk Anda bisa memulai permainan karena tidak ada akses yang bisa anda dapatkan untuk bisa bermain permainan tersebut.</p>
<p>Bagi Anda yang saat ini mungkin sedang mencari kesempatan untuk bermain permainan taruhan judi di situs ini, sebaiknya Coba anda pelajari beberapa hal tentang proses daftar. Daftar akun ini bisa anda lakukan dengan mudah menggunakan beberapa pilihan metode yang tersedia diantaranya:</p>
<ol>
<li>Daftar via formulir online &#8211; pertama salah satu pilihan cara yang bisa dilakukan adalah mendaftar menggunakan formulir online. Proses pendaftaran melalui formulir ini jadi salah satu yang paling mudah dan praktis.</li>
<li>Daftar Via livechat &#8211; langkah selanjutnya yang juga bisa dilakukan adalah Dimana anda bisa mendaftar melalui fitur livechat yang tersedia. Fitur livechat ini jadi salah satu hal yang sangatlah penting untuk kemudian Anda gunakan dan menjalankan.</li>
</ol>
<p>Jadi silakan Anda pilih salah satu pilihan metode pendaftaran yang bisa digunakan sampai Kemudian Anda bisa mendapatkan akun yang bisa digunakan untuk proses login. Jika Anda belum mendaftar maka anda belum bisa memulai login permainan.</p>
<h3>Cara Login Akun Judi online</h3>
<p>Setiap member yang bergabung di <strong>Judi online</strong>, dapat melakukan login di situs untuk dapat mengakses berbagai permainan yang ingin di mainkan. Cara login sendiri sangatlah mudah, yaitu dengan cara pilih menu Login yang terdapat di situs judi online Judi online. Berikut langkah langkah cara login di situs</p>
<ol>
<li>Kunjungi situs resmi agen judi</li>
<li>Klik menu Login</li>
<li>Isi username dan juga password akun yang kamu miliki</li>
<li>Klik Login</li>
</ol>
<p>Dengan Login di Judi online, kamu dapat mengakses berbagai permainan yang ada dan mulai bermain untuk meraih kemenangan serta keuntungan di <strong>Judi online</strong>.</p>
<p>The post <a rel="nofollow" href="https://valeriovalerio.org/cara-login-akun-judi-online-mudah-dan-aman/">Cara Login Akun Judi Online Mudah dan Aman</a> appeared first on <a rel="nofollow" href="https://valeriovalerio.org">VALERIOVALERIO</a>.</p>
<span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1eda611f3a41772a61111edaf504114d26c8a108a10&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1eda611f3a41772a61111edaf504114d26c8a108a10/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>1 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1eda611f3a41772a61111edaf504114d26c8a108a10&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1eda611f3a41772a61111edaf504114d26c8a108a10/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Valério Valério &lt;vdv100@gmail.com&gt;</author>
            <category>feed:ff8b6dc697dc403cb693cacff69f3818</category>
            <pubDate>Mon, 06 Feb 2023 10:53:48 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1eda611f3a41772a61111edaf504114d26c8a108a10</guid>
        </item>
        <item>
            <title>Cara Deposit Judi Online Via DANA Dompet Digital</title>
            <link>https://valeriovalerio.org/cara-deposit-judi-online-via-dana-dompet-digital/</link>
            <description><![CDATA[
<p>Dalam bermain judi online, modal merupakan hal yang utama agar dapat memasang taruhan dalam permainan. Begitu juga dengan main game judi online <strong>Judi online</strong> dengan menggunakan uang asli. Bermain dengan menggunakan uang asli adalah salah satu solusi terbaik selain dengan menggunakan gratisan. Karena memang di sini anda mengeluarkan modal uang asli, makan nanti keuntungan yang bisa didapatkan juga tentunya dalam bentuk uang asli. Oleh karenanya penting untuk anda ketahui dan pelajari betul bahwa proses metode deposit dengan uang asli adalah solusi yang kekinian.</p>
<p>Judi online merupakan salah satu situs judi yang menyajikan beragam jenis permainan paling populer seperti Sportsbook, Poker, Live Casino, Togel, dan Slot. Untuk dapat memainkan permainan tersebut, setiap pemain judi online memerlukan chip atau mata uang dalam permainan untuk dapat bertaruh pada permainan tersebut. Para pemain yang tertarik untuk bermain permainan taruhan judi haruslah bisa paham dan mengerti bahwa metode deposit menjadi salah satu bagian penting sebelum memulai bermain. Anda wajib melakukan deposit sebelum memulai proses tersebut.</p>
<p>Untuk memiliki saldo chip di akun judi online, pemain harus melakukan transfer tunai terlebih dahulu yang dikenal dengan istilah deposit kea gen judi online. Dan di situs Judi online, kamu dapat melakukan deposit dengan mudah dan juga cepat dengan beragam pilihan pembayaran seperti bank transfer, pulsa dan juga dompet digital.</p>
<h3>Cara Deposit Judi online Via Bank Transfer</h3>
<p>Salah satu metode paling umum digunakan adalah dengan menggunakan transfer ke rekening bank. Sebagai situs judi online terpercaya dan terbesar, <strong>Judi online</strong> menyediakan fasilitas bank untuk deposit yang lengkap untuk mempermudah transaksi para member.</p>
<p>Berikut adalah langkah langkah cara deposit di Judi online</p>
<ol>
<li>Login di situs judi online dengan akun yang kamu miliki</li>
<li>Klik Menu deposit</li>
<li>Isi formulir deposit seperti jumlah deposit yang di inginkan dan juga bank yang digunakan</li>
<li>Pastikan bank yang di pilih tidak mengalami gangguan (online)</li>
<li>Lakukan transfer dengan menggunakan mobile banking atau juga ATM sesuai dengan nominal dan rekening pada formulir deposit</li>
</ol>
<h3>Cara Deposit Judi online Via DANA</h3>
<p>Bagi kamu pengguna e-wallet, kamu dapat melakukan deposit <strong>Judi online</strong> dengan mudah dan juga praktis. Proses deposit dengan menggunakan dana adalah salah satu yang memang paling banyak digunakan sebetulnya selama ini. Metode deposit dengan menggunakan akun dana ini adalah salah satu yang memang penting untuk diketahui dan juga dipahami sebagai salah satu alternatif.</p>
<p>Deposit dengan menggunakan dana akan memudahkan anda untuk bisa menyelesaikan prosesnya. Kemudian juga penting untuk anda memahami bahwa proses ini adalah salah satu proses yang kekinian dan juga bebas biaya admin. Salah satu e-wallet yang paling populer dan banyak digunakan adalah DANA. Judi online juga mendukung transaksi deposit menggunakan dompet digital yang satu ini.</p>
<p>Berikut adalah langkah langkah deposit menggunakan DANA</p>
<ol>
<li>Pastikan kamu telah mengetahui nomor akun DANA dari agen judi</li>
<li>Buka aplikasi DANA</li>
<li>Pilih menu Kirim</li>
<li>Masukkan nomor akun DANA</li>
<li>Pastikan nama pemilik akun telah sesuai</li>
<li>Masukkan nominal deposit yang di inginkan</li>
<li>Konfirmasi transaksi dengan memasukkan PIN DANA kamu</li>
<li>Selamat, deposit via DANA telah berhasil</li>
</ol>
<p>Setelah melakukan deposit <strong>Judi online</strong>, dengan transfer ataupun via e-wallet, jangan lupa untuk melakukan konfirmasi dengan menghubungi admin pada layanan Livechat agar proses pengisian chip tidak terkendala.</p>
<p>The post <a rel="nofollow" href="https://valeriovalerio.org/cara-deposit-judi-online-via-dana-dompet-digital/">Cara Deposit Judi Online Via DANA Dompet Digital</a> appeared first on <a rel="nofollow" href="https://valeriovalerio.org">VALERIOVALERIO</a>.</p>
<span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1eda5599acd507ca55911eda98993cba409618b618b&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1eda5599acd507ca55911eda98993cba409618b618b/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>1 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1eda5599acd507ca55911eda98993cba409618b618b&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1eda5599acd507ca55911eda98993cba409618b618b/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Valério Valério &lt;vdv100@gmail.com&gt;</author>
            <category>feed:ff8b6dc697dc403cb693cacff69f3818</category>
            <pubDate>Sun, 05 Feb 2023 10:17:30 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1eda5599acd507ca55911eda98993cba409618b618b</guid>
        </item>
        <item>
            <title>Cara Deposit Judi Online Via OVO Mudah dan Gratis Biaya</title>
            <link>https://valeriovalerio.org/cara-deposit-judi-online-via-ovo-mudah-dan-gratis-biaya/</link>
            <description><![CDATA[
<p>Belakangan ini judi online di Indonesia semakin mengalami peningkatan yang sangat pesat. Karena bermain judi secara online sangat praktis dan juga aman dengan hanya mengakses agen judi online kapan saja dan dimana saja kita inginkan. Banyak situs judi online yang menawarkan keuntungan dan juga kemudahan bagi setiap membernya demi membuat mereka nyaman dan betah dalam bermain. Salah satunya <strong>judi online</strong> yang memberikan kemudahan serta keuntungan yang tinggi bagi setiap pemainnya. Selain itu hal yang paling menguntungkan juga dari situs ini adalah dari kemudahan proses transaksi misalnya deposit.</p>
<p>Di situs judi lain, selama ini biasanya memang metode hanya dengan menggunakan rekening bank saja. Sementara melalui situs judi yang satu ini, ada justru bisa bermain permainan taruhan judi dengan menggunakan metode yang beragam. Selain dengan menggunakan rekening bank, juga Anda bisa melakukan proses transaksi dengan menggunakan beberapa pilihan metode alternatif. Salah satu pilihan metode alternatif yang bisa digunakan misalnya adalah dengan menggunakan dompet digital atau biasa dengan EWALLET seperti OVO.</p>
<h3>Deposit Judi online Termudah Dan Lengkap</h3>
<p>Salah satu kemudahan yang dapat dirasakan oleh setiap member adalah adanya deposit via ewallet. Hal ini menjadi poin tambahan bagi para pecinta game judi online ketika ingin melakukan deposit ke akun judi onlinenya. Dengan hadirnya deposit via e-wallet, kebutuhan transaksi deposit menjadi lebih meudah dan juga praktis untuk dilakukan.</p>
<p>Dalam menunjang kenyamanan dan juga pelayanan terbaik bagi setiap membernya, Judi online menyediakan beragam pilihan deposit via e-wallet yang kamu inginkan serti DANA, Gopay, LinkAja dan juga OVO yang tentu saja e-wallet tersebut banyak digunakan oleh masyarakat Indonesia saat ini. Selain itu, Judi online juga menyediakan deposit via pulsa dan juga transfer bank yang lengkap tentunya.</p>
<h3>Daftar Akun Judi online Dulu Sebelum Depo</h3>
<p>Sebelum melakukan deposit di Judi online, pastikan kamu memiliki akun terlebih dahulu di situs judi online. Jika sebelumnya kamu telah mempunyai akun, maka kamu dapat lanjut ke cara deposit dengan e-wallet. Namun bagi yang belum bergabung dan memiliki akun, berikut adalah langkah mudah daftar di situs judi online terbaru 2023.</p>
<ol>
<li>Kunjungi agen judi online</li>
<li>Masuk ke menu Daftar</li>
<li>Isi formulir pendaftaran dengan lengkap dan benar</li>
<li>Kirim form pendaftaran dengan klik Submit</li>
<li>Akun siap digunakan</li>
</ol>
<h3>Cara Deposit Judi online Via OVO</h3>
<p>Salah satu kelebihan yang ada pada situs judi online <strong>Judi online</strong> adalah adanya deposit via e-wallet. Nah bagi kamu pengguna OVO, berikut adalah langkah langkah untuk deposit Judi online menggunakan OVO dengan mudah.</p>
<ol>
<li>Pastikan Kamu telah mendapat nomor OVO agen</li>
<li>Buka aplikasi OVO</li>
<li>Pilih menu Transfer</li>
<li>Lalu pilih antar OVO</li>
<li>Masukkan nomor akun OVO agen judi online</li>
<li>Isi nominal dengan jumlah deposit yang di inginkan</li>
<li>Minimal deposit adalah Rp 10.000, jika sudah pilih Lanjut</li>
<li>Pastikan nama penerima dan jumlah telah sesuai</li>
<li>Konfirmasi transaksi dengan masukkan PIN OVO kamu</li>
<li>Selesai.</li>
</ol>
<p>Nah itu di acara deposit <strong>Judi online</strong> via OVO yang mudah dan juga cepat. Bagaimana, sangat praktis bukan? Coba sekarang dan nikmati kemudahan deposit hanya dengan menggunakan e-wallet OVO. Apabila memang Anda mau melakukan proses deposit dengan menggunakan cara tersebut maka siapkan terlebih dahulu dan lakukan register terlebih dahulu untuk bisa memulai prosesnya kemudian.</p>
<p>The post <a rel="nofollow" href="https://valeriovalerio.org/cara-deposit-judi-online-via-ovo-mudah-dan-gratis-biaya/">Cara Deposit Judi Online Via OVO Mudah dan Gratis Biaya</a> appeared first on <a rel="nofollow" href="https://valeriovalerio.org">VALERIOVALERIO</a>.</p>
<span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1eda4883862c718a48811eda3774dd3af927ca47ca4&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1eda4883862c718a48811eda3774dd3af927ca47ca4/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>1 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1eda4883862c718a48811eda3774dd3af927ca47ca4&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1eda4883862c718a48811eda3774dd3af927ca47ca4/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Valério Valério &lt;vdv100@gmail.com&gt;</author>
            <category>feed:ff8b6dc697dc403cb693cacff69f3818</category>
            <pubDate>Sat, 04 Feb 2023 10:14:29 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1eda4883862c718a48811eda3774dd3af927ca47ca4</guid>
        </item>
        <item>
            <title>Cara Deposit Judi online Via eWallet Dompet Digital</title>
            <link>https://valeriovalerio.org/cara-deposit-judi-online-via-ewallet-dompet-digital/</link>
            <description><![CDATA[
<p><strong>Judi online</strong> merupakan salah satu permainan judi yang terpercaya dan juga modern. Daftar sekaran untuk menjadi member pada menu Daftar atau melalui link alternatif yang tersedia untuk mulai bermain dan nikmati beragam permainan terlengkap dan paling populer</p>
<p>Sebagai salah satu web judi online terlengkap dan terpercaya, agen judi menyediakan berbagai pilihan deposit terlengkap untuk memudahkan setiap transaksi yang di butuhkan oleh pemain. Diantaranya adalah deposit via transfer bank, pulsa dan juga ewallet.</p>
<p>Deposit via ewallet sangatlah mudah dan juga praktis untuk dilakukan karena kamu tidak perlu repot untuk pergi ke atm atau juga mengisi pulsa terlebih dahulu. Tersedia pilihan deposit ewallet yang lengkap seperti DANA, Gopay, LinkAja dan juga OVO.</p>
<h3>EWALLET adalah metode deposit terkini</h3>
<p>Anda harus bisa mengetahui bahwa metode deposit dengan menggunakan dompet digital adalah salah satu pilihan metode yang kekinian. Artinya memang ini merupakan salah satu pilihan metode terbaik yang sangatlah menguntungkan. Banyak hal yang kemudian bisa anda peroleh dan dapatkan dari pilihan metode tersebut termasuk juga Dimana anda bisa lebih menghemat dan juga lebih mengandalkannya sebagai salah satu alternatif.</p>
<p>Jika Misalnya Anda selama ini atau saat ini sedang tidak memiliki akun bank, maka metode ini adalah salah satu pilihan yang tepat. Jadi ini akan sangat menjangkau banyak kalangan termasuk juga kalangan yang ada di pedesaan. Biasanya masyarakat di sana memang masih belum tersentuh dengan akun perbankan sehingga memungkinkan mereka untuk bisa deposit pakai dompet digital saja.</p>
<p>Kemudian juga metode ini merupakan salah satu metode yang memang mengikuti perkembangan zaman. Saat ini justru pengguna dompet digital lebih banyak dibandingkan dengan pengguna lainnya. Hal itu menjadi salah satu solusi dan cara terbaik juga untuk bisa mendapatkan peluang dan kesempatan anda bermain dengan cara yang baik. Hal yang bisa didapatkan dari ini juga sangat banyak dan ini pasti akan sangat membantu Anda rasakan sensasi bermain yang lebih mudah juga pastinya.</p>
<h3>Cara Deposit Judi online Via eWallet</h3>
<p>Dalam memberikan pelayanan terbaik bagi setiap membernya, <strong>Judi online</strong> menyediakan fasilitas deposit dengan menggunakan ewallet untuk memudahkan pemain dalam melakukan deposit. Penggunaan ewallet kian hari semakin meningkat, oleh karenanya menyediakan fasilitas deposit via ewallet untuk memberikan kemudahan dengan mengikuti perkembangan zaman.</p>
<p>Langkah langkah melakukan deposit via ewallet adalah sebagai berikut</p>
<ol>
<li>Kunjungi situs</li>
<li>Login dengan akun yang kamu miliki</li>
<li>Kunjungi Livechat untuk mengetahui akun ewallet</li>
<li>Buka aplikasi ewallet di HP kamu</li>
<li>Pilih menu kirim</li>
<li>Masukkan nomor akun ewallet</li>
<li>Masukkan nominal transfer deposit ewallet</li>
<li>Konfirmasi PIN ewallet kamu</li>
<li>Transaksi deposit sukses</li>
<li>Screenshot dan konfirmasi ke admin</li>
</ol>
<p>Pastikan kamu memasukkan nomor akun dengan benar ya, agar proses deposit via ewallet dapat cepat masuk di akun. Selain deposit via ewallet, member juga dapat memilih untuk melakukan deposit dengan pulsa dan juga transfer bank dengan pilihan bank yang lengkap.</p>
<p>Segera daftar untuk dapat bermain dengan nyaman dan juga nikamati beragam permainan judi online terlengkap dan terbaik hanya di Judi online. Pastikan kamu berusia 18 tahun ke atas ya untuk dapat bergabung.</p>
<p>Demikian cara deposit via ewallet termudah dan juga terlengkap untuk kebutuhan deposit akun judi online di <strong>Judi online</strong>. Selamat mencoba</p>
<p>The post <a rel="nofollow" href="https://valeriovalerio.org/cara-deposit-judi-online-via-ewallet-dompet-digital/">Cara Deposit Judi online Via eWallet Dompet Digital</a> appeared first on <a rel="nofollow" href="https://valeriovalerio.org">VALERIOVALERIO</a>.</p>
<span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1eda3ae597fc0dea3ae11edbc6de5bb50f10f060f06&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1eda3ae597fc0dea3ae11edbc6de5bb50f10f060f06/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>1 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1eda3ae597fc0dea3ae11edbc6de5bb50f10f060f06&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1eda3ae597fc0dea3ae11edbc6de5bb50f10f060f06/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Valério Valério &lt;vdv100@gmail.com&gt;</author>
            <category>feed:ff8b6dc697dc403cb693cacff69f3818</category>
            <pubDate>Fri, 03 Feb 2023 10:12:36 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1eda3ae597fc0dea3ae11edbc6de5bb50f10f060f06</guid>
        </item>
    </channel>
</rss>
