Skip to content

v0.4.2

Choose a tag to compare

@GingerFluffyCat GingerFluffyCat released this 23 Jul 15:19

Fixed

  • MTK HW HEVC decode — root-caused and fixed the long-standing "MTK HW HEVC freezes" workaround: the H.265 csd-0 buffer (VPS+SPS+PPS) was built in reverse order (PPS,SPS,VPS) due to an insert(begin()) bug, which the software decoder tolerated but the hardware decoder didn't. HW decode is now the default on MTK and sustains 120fps with 0 discards.
  • Decoder stall-recovery watchdog — a MediaTek video-firmware throughput ceiling (confirmed via kernel-level atrace, transport-independent) could permanently freeze the decoder under sustained high bitrate. Added a watchdog that detects "data arriving, 0 frames decoded" and forces a recovery flush, turning a permanent freeze into a bounded ~2-4s recoverable stutter.
  • Stale-frame flush storm — the flush-to-keyframe path could enter a self-sustaining loop on any decoder that fell behind; previously only disabled for the software-decoder fallback, now disabled for MTK regardless of which decoder is active.
  • App-resume reconnect (phone-Wi-Fi)onPause() wasn't stopping ApfpvWifiManager, so its running-guard never reset and onResume()'s reconnect silently no-op'd.
  • Decode-feed thread decouple — a slow decode step could stall the RTP-receive/parse thread; feeding the decoder now runs on its own thread with a bounded, drop-oldest queue.
  • Mutex-starvation fix (devourer/WiFiDriver) — the decoder feed thread's input-buffer retry loop could win a mutex re-acquire race indefinitely against the stall watchdog's recovery flush; added a yield point so recovery can actually land.
  • UAF-prone RX teardown (devourer/WiFiDriver)stopAsyncRx() could free USB transfers libusb still owned after a sleep-poll timeout, surfacing later as a destroyed-mutex SIGABRT on replug. Now actively pumps libusb events itself and leaks (rather than frees) a transfer that's still genuinely stuck.
  • Exception-unsafe pause/resume around RF calibration (devourer/WiFiDriver) — an exception during arm()/IQK left the async RX pool permanently paused, compounding into the UAF above. Guarded with RAII so resume always runs.

Added

  • Diagnostics: feed-queue overflow logging, URB free-list depth/pool-empty events (rxd-pool), GL fan-out stage timing, and live-tunable BA buffer-size / LQ-feedback-interval / RTP-reorder-timeout knobs (debug.pixelpilot.* props) for A/B testing the dongle's accept-vs-decline BlockAck tradeoff without a rebuild per value.

Full changelog: see CHANGELOG.md.