Changelog¶
Changes and updates for all .Net SDKs.
2026.10.16¶
- [Core] Fixed: the fast RTSP stream discovery ignored credentials embedded in the RTSP URL, so opening a camera whose URL carries the user and password (Verkada and other vendors hand out a copy-ready URL) silently answered 401 and fell back to the slower discovery path; the URL credentials are now used when no separate login and password are set. (#2769)
- [Media Blocks SDK .Net] Fixed: on Android, an error reported by a hardware MediaCodec encoder or decoder (for example a Codec2 encoder giving up mid-recording) aborted the whole application process; the pipeline now stops with an error the app can handle, carrying the codec's return code. (#2632)
- [Video Capture SDK .Net] Fixed: an MP4HW/MKVv2 recording from a webcam with a microphone could lose its whole audio track. The MF mux picked the file's zero from whichever stream's first sample was delivered first, and a camera whose first frame is delivered before the microphone's first buffer stamped every audio buffer before that zero, so the encoder dropped them all. The zero is now the earlier timestamp of the two streams, and the camera's start delay is kept in the file. (#2624)
- [Demos] Fixed: the native iOS Media Player X demo closed when Play was pressed and the source could not be opened; the error, with its reason, is now shown in an alert.
- [Media Blocks SDK .Net] [Media Player SDK .Net] [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed:
FastImageProcessing.ShakeDowndivided the frame height by its factor, so a factor of 0 stopped the application and a negative one made it read before the frame. A factor below 1 now leaves the frame unchanged. (#2771) - [Media Blocks SDK .Net] Fixed:
UniversalDemuxDecoderBlockplayed Theora Ogg video (.ogv) and 3GP files with H.263 video and AMR audio without picture, could not open raw AAC (ADTS), MP3, FLAC and WAV files, elementary MPEG video (.m2v,.m4v) or a file starting with an APE tag at all, andUniversalAutoDemuxerBlockgave no video from elementary MPEG files and no audio from an MP3 carrying both an ID3 and an APE tag (throughUniversalDemuxDecoderBlocksuch an MP3 failed the pipeline outright). They now play. (#2734) - [Media Blocks SDK .Net] Fixed: a bridge channel (
BridgeVideoSinkBlock/BridgeVideoSourceBlock, including Live Video Compositor inputs) letterboxed a source that already delivers the declared frame size when only its pixel aspect ratio differed, baking black bars into the composite and the recording before the resize policy was applied.VideoFrameInfoXnow carries the pixel aspect ratio (ParNumerator/ParDenominator, square by default); an Info that declares it - e.g. one built from a probed source - lets such a frame cross unchanged. (#2770) - [Media Blocks SDK .Net] Fixed: on Android
RTSPServerBlockreportedIsAvailable() = trueand then failed on the first call - the Android GStreamer package carried no gst-rtsp-server. The package now links it, so RTSP output works on Android, andIsAvailable()reportsfalseon older packages without it. (#2633) - [Media Blocks SDK .Net] Fixed: on Android
LUTProcessorBlock(3D LUT) built fine but every pipeline failed with "Unable to create VProcessor" - the FFmpeg inside the AndroidlibVisioForge_VAP.sowas configured with no filters at all, so the lut3d effect could never initialize. The library is rebuilt with the lut3d filter, andIsAvailable()now reportsfalsewhen the library is missing. (#2633) - [Media Blocks SDK .Net] Fixed: on Android, a pipeline document saved with an Android audio playback capture, Android UVC or text overlay block could not be loaded back. (#2636)
2026.10.15¶
- [Core] Added:
VisioForgeX.Debug_Telemetry, a process-wide switch:falsestops all telemetry, from every engine. Errors raised outside an engine (UniversalSourceSettings.CreateAsync,DeviceEnumerator,MediaInfoReaderX) are now reported like an engine's own, with the same redaction. (#2746) - [Core] Fixed: on Android,
Dmtx.LoadedDllPathandDMTXNativeLibrary.LoadedDllPathreturnednullalthough the library was loaded, so the log said "Loaded from: unknown". (#2637) - [Core] Fixed: the DirectShow engines' Sharpen effect left the top row and the left column of the frame stale, and sharpened one pixel past the end of every row. (#2728)
- [Media Blocks SDK .Net] Added:
GLVideoRendererBlock.GetVideoStreamInfo()reports the frame size, frame rate and pixel aspect ratio of the video being rendered. (#2640) - [Media Blocks SDK .Net] Improved: when
UniversalSourceSettings.CreateAsync,UniversalSourceSettingsV2.CreateAsync,DemuxerSourceSettings.CreateAsyncorSRTSourceSettings.CreateAsynccannot read the media information, the "Unable to read file info" exception now says why - the error GStreamer reported - instead of the bare message. (#2742) - [Media Blocks SDK .Net] Fixed: on Windows, stopping a
DASHSinkBlockpipeline could crash the whole application (access violation, no exception). NeedsVisioForge.CrossPlatform.Core.Windows.x64/.x86/.arm642026.10.15. (#2752) - [Media Blocks SDK .Net] Fixed:
DASHSinkBlockwrote its media segments into the application's working directory instead of the folder ofMPDFilename; on Android it failed at start with "Could not open resource for writing". Segments are now written next to the manifest. (#2635) - [Media Blocks SDK .Net] Fixed:
DASHSinkBlockwroteMinBufferTimeandMinimumUpdatePerioda thousand times too small, andTimeShiftBufferDepthas the period duration, so a live manifest described a stream a fraction of a second long. (#2635) - [Media Blocks SDK .Net] Fixed: on Android, the AES blocks (
EncryptorBlock,DecryptorBlock,DecryptorPlayerBlock), the four scope blocks,CDGSourceBlock,GIFEncoderBlockandMPEGPSSinkBlockfailed with "Unable to create some pipeline elements".SVGOverlayBlockand the SVT-AV1 / rav1e encoders remain unavailable there. (#2634) - [Media Blocks SDK .Net] Fixed: on Android,
QRCodeOverlayBlockwas unavailable; it now works. (#2732) - [Media Blocks SDK .Net] Fixed:
QRCodeOverlayBlockencoded its data in upper case, so a case-sensitive URL path, token or Wi-Fi password in the code no longer matched. The code now carries the data exactly as passed. (#2732) - [Media Blocks SDK .Net] Fixed: in Unity apps on iOS, Android and macOS, text overlays rendered as empty boxes instead of text. (#828)
- [Media Blocks SDK .Net] Fixed: on macOS, Mac Catalyst and iOS, MPEG-2 played through
DecodeBinBlockor any other automatic decoder failed with avtdecresource error; where there is no hardware MPEG-2 decoder it is now decoded in software. Needs the Apple natives 2026.10.14. (#2716) - [Media Blocks SDK .Net] Fixed:
UniversalSourceBlockV2played WAV files with compressed audio, such as MS-ADPCM, without sound - the audio was passed on undecoded. (#2698) - [Media Blocks SDK .Net] Fixed: audio-only Matroska and WebM (
.mka,.weba), 3GP, M4A, Ogg and 3D Matroska files could not be opened by the demuxer blocks, and several of them played without sound or video. (#2700) - [Media Blocks SDK .Net] Fixed: adding a block to a running pipeline with
AddBlockLiveagain after a failed attempt reported success without putting the block in the pipeline - aVideoRendererBlockadded that way drew nothing. (#2695) - [Media Blocks SDK .Net] [Video Capture SDK .Net] Fixed:
VideoRendererBlock.GetVideoStreamInfo()andVideoCaptureCoreX.VideoRenderer_GetVideoInfo()returnednullon Android and iOS for a renderer drawing into a native view and on every platform for aJPEGCallbackview, and reported the view's size or frame rate withResizeToScreenorFrameRateLimit. (#2640) - [Media Blocks SDK .Net] [Media Player SDK .Net] [Video Capture SDK .Net] Fixed: uncompressed RGB AVI files whose frames are stored top-down with an aspect-ratio header did not play - the video renderer failed with a negotiation error. (#2736)
- [Media Blocks SDK .Net] [Media Player SDK .Net] [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: the Spray effect of the native Video Effects Pro filter never moved a pixel, and scattered in place so the picture looked doubled or smeared. It now scatters cleanly from a copy of the frame. (#2744, #2759)
- [Media Blocks SDK .Net] [Media Player SDK .Net] [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: the scalar
ColorNoiseandMonoNoiseof the native Video Effects Pro filter added a constant shift instead of noise, and MFP'sFastImageProcessing.ColorNoisereseeded the random generator on every frame, so the noise repeated frame to frame. (#2744, #2745) -
[Media Blocks SDK .Net] [Media Player SDK .Net] [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: the Marble effect of the native Video Effects Pro filter crashed its processing thread when Turbulence was 0; a turbulence below 1 or a zero Scale now leaves the frame unchanged. (#2758)
-
[Media Blocks SDK .Net] [Media Player SDK .Net] [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: the built-in effects of the native Video Effects Pro filter, its chroma key and its text and image overlays read a frame as if its rows were packed, so at a video width that is not a multiple of 4 (638, 1918) they smeared the picture from the second row down and left the last pixels of the frame untouched; an overlay image whose own width is not a multiple of 4 was drawn sheared. All of them now read and write their own row. (#2757)
-
[Media Blocks SDK .Net] [Media Player SDK .Net] [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: the Invert effect of the native Video Effects Pro filter left pure black alone - it computed 256 minus the value instead of 255 minus it, so the darkest pixels never changed. The effect now inverts every pixel. (#2757)
-
[Media Blocks SDK .Net] [Media Player SDK .Net] [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: a text overlay of the native Video Effects Pro filter placed near the frame's edge wrote past the picture instead of being cut at it, which could corrupt memory or crash the application. The overlay is now cut at the frame's edge, as image overlays already were. (#2757)
-
[Media Blocks SDK .Net] [Media Player SDK .Net] [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: the ShakeDown effect of the native Video Effects Pro filter divided the frame height by its factor, so a factor of 0 stopped the application and a negative one made it read before the frame. A factor below 1 now leaves the frame unchanged. (#2757)
2026.10.14¶
- [Core] Added:
ColorspaceConverter.RGBAToCairo32Ptr(SKBitmap, double), which takes the bitmap's alpha type into account; thebyte[]overload treats its input as not premultiplied. - [Media Blocks SDK .Net] Added:
VideoRendererBlock.SubtitleInput- connect a source'sSubtitleOutputto it and setSubtitleEnabledto draw an embedded subtitle track over the video. (#2679) - [Media Blocks SDK .Net] Added:
IVideoView.DetachPipeline(MediaBlocksPipeline)andIVideoView.IsPipelineAttached(MediaBlocksPipeline)let aVideoViewtell which pipeline it belongs to, so an Android pipeline survives rotation and backgrounding. (#2656) - [Core] Changed:
AudioStreamInfo.Codecnow reports MPEG audio asAAC,MP3,MP2orMP1instead of the genericMPEG, inMediaInfoReaderXand in the stream info the engines report. Code comparing the audio codec with"MPEG"needs to be updated. (#2548) - [Core] Changed:
MediaInfoReaderX(withDeepDiscovery) and the stream info the X-engine reports now name codecs consistently and by version -H264,MPEG1/MPEG2/MPEG4,AC3,MP2told fromMP3,WMA2,DIVX5- instead ofH.264/AVC, the genericMPEGor raw caps names, and report the real sample rate and channel count of MPEG audio that starts later in the file. Code comparing the old names needs to be updated. (#2554) - [Core] Changed:
MediaInfoReaderXnever reports a local file as live, also when its duration is unknown (a still image, an MPEG-TS without PCR). (#2589) - [Core] Changed: every X-engine pipeline that picks a decoder automatically now decodes BMP, TIFF and other still images (ICO, PNM, TGA) with the decoder
MediaInfoReaderXuses for them. (#2589) - [Core] Changed:
UniversalSourceSettings.CreateAsync(Uri)andUniversalSourceSettingsV2.CreateAsync(Uri)(on iOS, theNSUrloverloads) now throwFileNotFoundExceptionfor a missing file,UnauthorizedAccessExceptionfor an unreadable one andIOExceptionwhen the media information cannot be read, instead of a plainException. Code catchingExceptionis unaffected. (#2517) - [Core] Changed:
HelpLinks.TestVideoBunnypoints to a working sample video, a 10-second 360p Big Buck Bunny clip; the previous full-length video's address returns HTTP 403. (#2506) - [Video Capture SDK .Net] Changed: MP4 output (also in the Video Edit SDK) and the Sensoray SBE output now report an encoder or muxer that refused a setting (bitrate, profile, output format, muxer flags) through
OnError; the recording continues with the encoder's own defaults. (#2549) - [Video Capture SDK .Net] Changed: on iOS and Android, a
VideoCaptureCoreXoutput fed by a source whose size is known up front (RTSP, SRT, HTTP MJPEG, virtual, image) now records at that size, as on desktop; camera and screen sources still record at the size they deliver. (#2574) - [Video Capture SDK .Net] Changed: the
VisioForge.DotNet.Core.Redist.VideoCapturex86 and x64 packages now include the MJPEG decoder and the ASIO audio source, which only the installer shipped before. (#2302) - [Media Blocks SDK .Net] Changed:
OverlayManagerVideo,OverlayManagerNDIVideoandOverlayManagerDecklinkVideowith an iOS or Mac CatalystVideoView, aJPEGCallbackVideoViewor aCallbackVideoViewin a YUV format convert each overlay preview frame once instead of twice, which lowers CPU use; on iOS and macOS, aVideoViewalso shows correct colours for decoder output whose chroma plane is padded. (#2547, #2556) - [Media Blocks SDK .Net] [Media Player SDK .Net] [Video Capture SDK .Net] [Video Edit SDK .Net] Changed: on Android, audio is now decoded by the software decoders - the MediaCodec audio decoders are no longer used (previously only AAC was excluded). Fixes a crash of the whole application when a file with Vorbis or Opus audio was opened, read or played. An audio format that only the device's MediaCodec decoder supports now fails with "missing a plug-in" instead.
DisableHWDecoders = falsestill enables hardware decoding for video only. (#2620) - [Media Blocks SDK .Net] Changed: on Android, raw DV (
.dv) files, Type-1 DV AVI files and FLI/FLC animations can no longer be opened, as on iOS - their GStreamer plugins are no longer included. DV video in MOV and in Type-2 DV AVI files still plays. The opencore AMR-NB/AMR-WB, GDP and pcap plugins were removed as well: AMR audio keeps playing through the FFmpeg decoders, but theamrnbencAMR-NB encoder is gone and has no replacement. - [Media Blocks SDK .Net] Changed: the iOS GStreamer framework no longer ships the RealMedia, FLI/FLC, Siren, DV, Icecast, unixfd, netsim, Vulkan, shm, ipcpipeline, GDP, pcapparse, camerabin and NDI plugins: dead formats and desktop-only transports that cannot work in the iOS sandbox, a streaming server, test tools, and NDI whose external runtime does not exist on iOS. On iOS, raw DV, FLI/FLC, Siren and pcap files can no longer be opened, and custom pipelines can no longer create the GDP, shm, ipcpipeline, netsim and camerabin elements.
- [Media Player SDK .Net] Changed:
MediaPlayerCoreX.OpenAsync(string),OpenAsync(Uri)and, on iOS,OpenAsync(NSUrl)now decode embedded subtitle tracks whenSubtitles_Enabledis on (the default), so a file with subtitles shows them. SetSubtitles_Enabled = falsebeforeOpenAsyncto keep them hidden. (#2679) - [Media Blocks SDK .Net] Removed:
PlayBinSourceBlock. It never delivered data to its outputs -playbinplayed the media into its own sinks outside the pipeline, which on iOS crashed the application. UseUniversalSourceBlockinstead. (#2680) - [Core] Fixed: reading a local file through the
MediaInfoReaderXfallback reader logged a GLib critical ("GstFileSrc has no property named 'sequential'") on every read. (#2712) - [Core] Fixed: RGB24/RGB32 to YV12, YUY2 and UYVY conversions swapped red and blue, shifted the colours back, or flipped the source frame upside down (the source buffer is no longer modified); the RGB2YUV filter declared its YV12/YUY2/UYVY layout padded to a multiple of 16 pixels, shearing the picture at widths like 854; RGB24/RGB32 to UYVY (HDYC) produced wrong colours; and HDYC (BT.709) decoded to RGB came out washed out - in the RGB2YUV and YUV2RGB DirectShow filters, in DeckLink capture and in
ColorspaceConverter. (#2619, #2664) - [Media Blocks SDK .Net] [Media Player SDK .Net] [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: at frame widths that are not a multiple of 4 (e.g. 642), the video effects of
MediaPlayerCore,VideoCaptureCore,VideoEditCoreandVideoEffectsWinBlockshifted the colours or distorted the picture - Red, Green, Blue, Contrast, Brightness, Darkness, Saturation, Posterize, Solorize, the colour filters, fade in/out, Invert, Blur, Mosaic, Marble, Spray, the mirror effects and deinterlacing. At those widths Blur was also weaker than at other widths and BlurEx blurred along the other axis; both now give the same result at every width. Invert also left a strip at the right edge unchanged on machines with many CPU cores, and Marble filled some pixels with leftover memory. (#2667) - [Core] Fixed: a semi-transparent image overlay (
OverlayManagerImage,OverlayManagerBackgroundImage,OverlayManagerImageSequence) made from anSKBitmaphad its transparency applied twice, and a semi-transparentSystem.Drawing.Bitmap, AndroidBitmapor unpremultipliedSKBitmapdrawn withOverlayManagerCallbackEventArgs.DrawImagecame out unblended;ImageConversionExtensions.ToSKBitmapnow marks the bitmaps it makes as not premultiplied. - [Core] Fixed:
SkiaHelper.FlipHorizontalrotated the bitmap by 180 degrees; it now mirrors it left to right. - [Core] Fixed:
MediaInfoReaderXlisted every RTP stream of a multi-stream RTSP source twice (#2592); reported a WAV holding compressed audio with a phantom 0 Hz first audio stream and each Blu-ray AC-3 track twice, and still images without a video stream (#2569); reported a duration of 0 for a short MPEG-TS file and could not read BMP or TIFF images (#2589); and on a Samba (UNC) path named the video and audio codecs after the decoded format (x-raw) instead ofH264,MPEG2,AAC(#2576). - [Core] Fixed: on macOS and Mac Catalyst, the application could abort with a Metal assertion (
maxCommandBufferCount value 0) when two hardware video decoders that output Vulkan memory started at the same time; MoltenVK now reads itsMVK_CONFIG_*environment variables when the SDK is initialized (set them in the environment the application is launched with). (#2608) - [Core] Fixed: on iOS, camera, screen capture and broadcast capture recordings showed clipped highlights and crushed shadows (the sources deliver full-range video but did not say so), and
VideoViewon iOS and Mac Catalyst showed ordinary BT.709 video with grey blacks and dim whites - colour range and matrix are now declared and followed; readingGst.Video.VideoInfo.Colorimetryalso crashed or returned random values. (#2557) - [Core] Fixed: on iOS,
MediaInfoReaderXand the X-engine sources described a file only as far as AVFoundation reads it - an AVI with MP3 audio had no audio stream, container format, codec names and subtitle streams were never reported; iOS now describes files the same way as every other platform, withMediaInfoReaderX.DeepDiscoveryavailable. A stream on an unreachable host now fails after GStreamer's discovery timeouts;ipod-library://andassets-library://URLs are no longer described. (#2568) - [Core] Fixed: on iOS,
MediaInfoReaderX.Opencalled from the main thread could hang the application (also throughVideoEditCoreXreading an added file's format), andOpen/OpenAsyncthrew an exception for a missing or unreadable file - they now returnfalse, as on the other platforms. (#2485) - [Core] Fixed: on macOS and Mac Catalyst, every
https://source failed to open since 2026.8.28 with "Unable to read file info". (#2489) - [Core] Fixed: a user name and password embedded in a source URL (
rtsp://user:password@camera/stream) were written as they are to the SDK log, theOnErrorevent, the debugger output and the Android log when opening failed; they are now masked in the log output, error messages and the pipeline graphs, an RTMP stream key included. (#2527) - [Core] Fixed:
Helpful_GetFrameFromFileAsyncin FFMPEG mode returned a portrait or otherwise rotated video as a squashed frame of the unrotated size; the frame now comes back upright. (#2327) - [Core] Fixed:
VProcessor.UpdateFilterParametersalways returnedfalseand changed nothing; it now applies the new value from the next frame and keeps the previous settings on rejection, throwsObjectDisposedExceptionafterDispose, and a 3D LUT effect no longer crashes the application when the video frame size changes. (#2387) - [Core] Fixed: on iOS,
SimplePlayerCoreXnever showed DVD (VobSub) subtitle tracks in MKV and VOB files - the subtitle track was dropped with a missing-plugin message. The iOS runtime now includes and registers the DVD subtitle parser, decoder and overlay. Update theVisioForge.CrossPlatform.Core.iOSpackage. (#2669) - [Core] [Media Blocks SDK .Net] Fixed: on iOS, VOB and MPEG-PS files with DVD LPCM audio played without sound, and
UniversalSourceBlockV2failed to start on them - the audio track was dropped with a missing-plugin message. The iOS runtime now includes and registers the DVD LPCM audio decoder. Update theVisioForge.CrossPlatform.Core.iOSpackage. (#2674) - [Core] Fixed: on iOS, starting a file source (
UniversalSourceBlock,MediaPlayerCoreX, aLiveVideoCompositorfile input) could occasionally never return - either deadlocked inside GStreamer's stream detection, after which a laterStopAsyncorDisposehung too, or waiting forever for the first frame without an error. NeedsVisioForge.CrossPlatform.Core.iOS2026.10.13.5. (#2601) - [Media Blocks SDK .Net] Fixed: with
Debug_Modeon,MediaBlocksPipelinewrote its logs and pipeline graphs to the current directory or the pipeline default instead ofDebug_Diron Linux, Android, macOS and Mac Catalyst (Debug_Dirnow defaults to the user's home folder there; Windows and iOS unchanged;Debug_Dir = nullno longer failsStart), a pipelineNamewith file-name-illegal characters failed to start on .NET Framework, andVideoEditCoreXfailed with anArgumentNullException. (#2499) - [Media Player SDK .Net] [Video Capture SDK .Net] Fixed: with
Debug_Modeon,MediaPlayerCoreXwrote some pipeline graphs to the pipeline's default folder,SimplePlayerCoreXwrote its log to the current directory, and on iOSMediaPlayerCoreXandVideoCaptureCoreXwrote no logs or pipeline graphs at all and logged "Unable to save pipeline" on every start;Debug_Dirnow defaults to the app's Documents folder on iOS, and the started-pipeline graph isgraph_started.dot, notgraph_started.dot.dot. (#2499, #2488) - [Media Blocks SDK .Net] [Media Player SDK .Net] Fixed: subtitles - embedded or from an external file - were drawn only by the native-window renderers; MAUI, WinUI, Avalonia software rendering, Android, iOS, Mac Catalyst and
CallbackVideoViewnow draw them too. SettingMediaPlayerCoreX.Subtitles_Enabledduring playback did not show or hide them, andMediaPlayerCoreXnever showed tracks embedded in the media. (#2679) - [Media Blocks SDK .Net] Fixed:
UniversalSourceBlockopened withrenderSubtitle: truereported an error for a DVD, DVB or PGS (bitmap) subtitle track and dropped it; such a track now comes out ofSubtitleOutput.IsSubtitlesAvailable()ofUniversalSourceBlockandUniversalSourceBlockV2now returnstruewhen the block has a subtitle output (it always returnedfalse), andSubtitleOverlaySettings.Offsetshifted subtitles by a tenth of the set time - a 2 s offset moved them by 0.2 s. (#2679) - [Media Blocks SDK .Net] Fixed:
UniversalSourceBlockV2dropped streams whose codec was missing from its built-in decoder list or did not match the decoder the list named - for example ADPCM audio and DivX 3 video - with "Failed to link to output queue" or "Failed to link to decoder". It now uses the decoder GStreamer would choose for them when the runtime has one. DTS audio, DTS and AC3 audio in DVD/VOB files, and audio-only Matroska/WebM files (.mka,.weba) now play inUniversalSourceBlockV2as well. (#2693) - [Media Blocks SDK .Net] Fixed:
UniversalSourceBlockV2dropped a stream when the first decoder it picked rejected the stream's format, with "Failed to link to decoder" in the log. It now tries the next decoder available for the stream. (#2708) - [Media Blocks SDK .Net] Fixed: on Android, asking
MediaInfoReaderX.GetFileSnapshotRGB/GetFileSnapshotSKBitmapfor a snapshot of a file that is not media could crash the application instead of returning no frame. (#2694) - [Media Blocks SDK .Net] Fixed: on macOS, MPEG-1/MPEG-2 files (DVD
.vob) failed the pipeline with avtdecresource error - VideoToolbox has no MPEG-1/2 decoder on Apple Silicon, but the hardware decoder was still picked; stream types the application does not render are no longer exposed to the pipeline, and MPEG-1/2 video decodes in software. (#2691) - [Media Blocks SDK .Net] [Media Player SDK .Net] Fixed: on iOS, MPEG-1/MPEG-2 files (DVD
.vob,.mpg) opened withUniversalSourceBlockorMediaPlayerCoreXfailed the pipeline with avtdecerror - VideoToolbox cannot decode MPEG-1/2, but the hardware decoder was still picked. The video is now decoded in software, as on macOS. (#2711) - [Media Blocks SDK .Net] Fixed: on Android, disposing a pipeline left a newer pipeline built on the same
VideoViewwith a black or stalled preview after the app rotated or was backgrounded, and dropped that pipeline's camera controls; a pipeline stopped and started again keeps its preview across rotation and backgrounding, a disposed pipeline no longer stops another pipeline's preview, and a pipeline that starts or resumes takes the view back. (#2656) - [Media Blocks SDK .Net] Fixed: on Android, MPEG program stream files (
.mpg,.vob) could not be opened - they failed with "missing a plug-in". The MPEG-PS demuxer and the DVD LPCM audio decoder are now included in the Android build. NeedsVisioForge.CrossPlatform.Core.Android2026.10.13.1. - [Media Blocks SDK .Net] [Media Player SDK .Net] Fixed: on iOS, ASF/WMV/WMA files could not be read - the GStreamer discoverer and playback failed with "Your GStreamer installation is missing a plug-in". The ASF plugin is now registered on iOS and included on Android, so
MediaInfoReaderXand the players read these files on both platforms (#2583); on iOS, ElevenLabs text-to-speech did not work - its GStreamer plugin ships in the iOS framework but was never registered. - [Media Blocks SDK .Net] Fixed: video formats whose GStreamer name is not the
VideoFormatXname in capitals -RGBX,BGRX,XRGB,XBGR,Gray16BE/LE, the 10/12-bit YUV formats,V210and others - failed to build the pipeline inVideoSampleGrabberBlock, the push video sources,BufferSinkBlock,ColorspaceConverterX, the bridges and a custom video format on the H264, HEVC and VPX encoders.VirtualVideoSourceBlocksilently produced RGB for these andGray8, and frames in these formats were reported asVideoFormatX.Unknown. - [Media Blocks SDK .Net] Fixed: on Windows with an NVIDIA GPU, MJPEG files and streams with 4:2:2 or 4:4:4 chroma could not be opened (
UniversalSourceSettingsV2.CreateAsyncthrew "Unable to read file info") or played. MJPEG is now decoded with the software decoder by default;NVJPEGDecoderBlockremains available for 4:2:0 sources. (#2647) - [Media Blocks SDK .Net] Fixed: on Android,
VideoRendererBlockandGLVideoRendererBlockthrewNullReferenceExceptionwhen created without a video view; they now acceptnullas on the other platforms. - [Media Blocks SDK .Net] Fixed: on iOS, animated GIF output could not be produced -
GIFEncoderBlockfailed to build with "Unable to create some pipeline elements". The GStreamer GIF plugin is now registered on iOS, andMediaInfoReaderXreports the frame size and codec of a GIF file on every platform. (#2567) - [Media Blocks SDK .Net] Fixed: on iOS and Android, a video bridge (
BridgeVideoSinkBlock/BridgeVideoSourceBlock) ignored the frame size and rate set in itsInfo- a source of a different size delivered no frames, a source offering a range of rates kept its own rate, aLiveVideoCompositorrecording started at 320x240, and a source whose size differs from its sink stopped with a negotiation error instead of scaling with letterboxing. AnInfowith a zero width or height is now refused when the block is built. (#2574) - [Media Blocks SDK .Net] Fixed: on iOS, a pipeline document (a Media Blocks Studio scenario, or one loaded with
MediaBlocksPipelineJSON) whoseUniversalSourcenames a file or URL failed to load with MBS043 "do not match their schema"; the URI is now read on iOS as on every other platform, and a path relative to the document resolves against its folder. (#2546) - [Media Blocks SDK .Net] Fixed:
OverlayManagerVideo,OverlayManagerNDIVideo,OverlayManagerDecklinkVideoandOverlayManagerWebView2Videoshowed the overlay video in a separate window, or nowhere, with a MAUI, WinUI, Avalonia (software mode), Android, iOS/macOS or callbackVideoView, and with a WPFVideoViewnot in native mode (for example afterUseD3D11ComposableRenderer()); the video now appears in the view in the format it renders, andStop()clears it. The overlays also froze on the last frame afterStop()followed byPlay()orPause(),UpdateSourceleaked resources and mishandled pause/stop state, and callingInitialize()again leaked the previous pipeline. (#2532, #2522) - [Media Blocks SDK .Net] Fixed:
FallbackSwitchSourceBlockignored theStaticImageFallbackSettingslayout settingsScaleToFit,MaintainAspectRatio,PositionandBackgroundColor; whenFallbackVideoCapsnames a size, the image is now placed on a frame of that size as those settings ask.MediaBlockFallbackSettings.CustomPipelineandIsLivewere never applied and are now marked obsolete. (#1925) - [Media Blocks SDK .Net] Fixed: on Windows,
VideoRendererBlockcreated with a window handle, and the video window of the overlay managers whenVideoRendererSettingsis not set, leaked one to two Windows USER objects every time a pipeline was built and torn down; an application that rebuilds its pipeline many times could run into the Windows limit of 10,000 USER objects per process. They now render with Direct3D 11 by default, likeVideoRendererBlockcreated with aVideoView; passing a plainVideoRendererSettingsXstill selects the OpenGL renderer. (#2010) - [Media Blocks SDK .Net] Fixed: DataMatrix decoding and encoding (
LibDMTX,DataMatrixDecoderBlock) worked only on Windows. The native library is now resolved per platform: the Linux, macOS and Mac Catalyst packages carry rebuilt libraries,VisioForge.CrossPlatform.Core.Windows.arm64addsdmtx.dll, every Windows package names its librarydmtx.dll(the x64 package's wasdmtx64.dll), Android carrieslibdmtx.sofor every ABI, and the iOS package carries libdmtx insideGStreamerX.framework. Where the native library is missing,DataMatrixDecoderBlocknow fails to build with an error instead of decoding nothing,IsAvailable()returnsfalse, and theDmtxmethods throwDllNotFoundException. On 32-bit Windows, decoding with aTimeoutMScrashed the application with an access violation. Under Unity, DataMatrix stays Windows-only. Update the SDK andVisioForge.CrossPlatform.Core.Windows.x64together. (#2570) - [Media Blocks SDK .Net] Fixed:
QRCodeOverlayBlockwas unavailable on iOS (IsAvailable()returnedfalseand a pipeline using it failed to start); the iOS runtime now includes the QR code overlay element. Update theVisioForge.CrossPlatform.Core.iOSpackage. (#2571) - [Media Player SDK .Net] Fixed: on iOS, HLS, DASH and Smooth Streaming opened with the modern engine failed with "Your GStreamer installation is missing a plug-in", and opening an HLS stream failed with "Unable to read file info" before playback started. (#2428)
- [Media Player SDK .Net] Fixed: on Android,
MediaPlayerCoreXplayed every file and stream without sound unlessAudio_OutputDevicehad been assigned; and after a source with no audio or no video, every source opened next on the same player played without sound (or showed no picture).Audio_PlayandVideo_Playnow always keep the value you set. - [Media Player SDK .Net] Fixed:
MediaPlayerCoreX.OpenAsync(string),OpenAsync(Uri)and, on iOS,OpenAsync(NSUrl)threw an exception for a missing file or an unreachable URL, which crashed an application awaiting them in an event handler; they now returnfalse. (#2517) - [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: the DirectShow NVENC H.264 encoder stopped at the first frame when fed NV12 video and the MP4 it fed was written with no video stream (#2541), could deliver the last frames after the end of the stream (#2586), never finished an encode with B-frames enabled while the MP4 Muxer v10 wrote them without their presentation times (#2591), silently finished as successful with a frame missing when it could not read one back from the GPU (#2597), and after a seek replayed pre-seek frames with their old timestamps (#2598). Needs the updated
VisioForge.DotNet.Core.Redist.MP4package. - [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: a DirectShow graph in which the Microsoft DTV-DVD Audio Decoder feeds the AAC Encoder v10 (TV/BDA capture) recorded no audio on a computer with a multichannel speaker configuration; the encoder now follows the decoder's switch to the stream's real channel count into the MP4 Muxer v10, and the MP4 Muxer v10 and the legacy MP4 Muxer refuse a channel count or sample rate change on a connected audio input instead of writing the new frames under the old format.
- [Video Capture SDK .Net] Fixed: MPEG-2 capture devices (hardware-encoder TV tuners, HDV camcorders) recorded no audio when the Microsoft DTV or LAV video decoder was installed without the matching audio decoder, and HDV capture with a custom MPEG audio decoder did not route the audio through it (#2594); MPEG-2 capture through the Microsoft DTV-DVD Audio Decoder recorded no audio, and HDV capture through the built-in MPEG-2 demultiplexer recorded no audio - both now record, in stereo. (#2539)
- [Video Capture SDK .Net] Fixed:
VideoCaptureCorestopped or disposed on a different thread than the one that started it logged anInvalidCastException, raisedOnError, and the camera's memory pool was not released. (#2645) - [Video Capture SDK .Net] Fixed:
FFMPEGEXEOutputwithKLVEnabled(the ffmpeg.exe output, recording orUDP_FFMPEG_EXEstreaming) wrote KLV metadata without presentation times; each KLV packet now carries its time, in step with the video. (#2059) - [Video Capture SDK .Net] Fixed:
IVFDecklinkSource.GetDeviceInfocorrupted the process heap and returned the device name cut in half;VFDecklinkDeviceInfo.Nameis now astring(it was abyte[]). (#2482) - [Video Capture SDK .Net] [Media Player SDK .Net] [Video Edit SDK .Net] Fixed:
VideoCaptureCore,MediaPlayerCoreandVideoEditCoredid not raiseOnErrorwhen a DirectShow filter aborted the graph mid-run (the What You Hear source losing its playback device, an MP3 file that cannot be read): the capture, playback or conversion just ended.OnErrornow carries the error code. (#2482) - [Video Capture SDK .Net] [Media Player SDK .Net] Fixed: with the MP3 splitter (
VisioForge_MP3_Splitter), two MP3 files open in one process shared one frame table, so a seek in one could land at the other file's positions or crash the application (#2482); MP3 audio ran about 0.1% fast against real time and every LAME-encoded file started with 26 ms of extra silence (#2302); after a seek, downstream time stamps did not re-anchor, a stop position was ignored and a playback rate other than 1.0 was accepted but not applied. A free-format MP3, which hung the graph while it was opened, is now refused. Filter 2026.10.11.4. (#2478) - [Video Capture SDK .Net] Fixed: an IP camera opened with the FFMPEG source froze on the frame of the pause after Pause and Resume, until Stop; it is live again right after the resume. Needs the updated
VisioForge.DotNet.Core.Redist.FFMPEGpackage. (#2474) - [Video Capture SDK .Net] Fixed: two VisioForge What You Hear Source captures in one application (two engines, or a preview and a recording) shared one capture - starting the second crashed the application or split the audio, and stopping either stopped the other; each source now captures on its own (#2494). After an audio glitch the recorded time stamps could drift by the length of the gap, and stopping could send empty audio samples (#2507). The source also delivered no audio at all while nothing was playing on the system - it now delivers silence in real time. Filters 2026.10.11.4 / 2026.10.11.10. (#2302)
- [Video Capture SDK .Net] Fixed: the VisioForge Video Mixer filter (Picture-in-Picture, and the filter used on its own) - a source seeked or looped after its end froze the mixed video, a seek while paused kept showing the old picture, a graph paused before it ran showed black, one rejected frame downstream stopped the mixed video until the next Stop, a frame could follow the end of the stream, a stop stall could leave the next run carrying two interleaved timestamp sequences, and a source failing on an unsupported media type reported
EC_COMPLETEfor an aborted run. Filter 2026.10.11.9, in theVisioForge.DotNet.Core.Redist.Basepackages. (#2477) - [Video Capture SDK .Net] Fixed: in Picture-in-Picture, after Pause and Resume the mixed video restarted its time stamps from zero, a video file used as a PIP source played on during the pause and then stalled, an IP camera PIP source with
IPSourceEngine.Auto_LAVfroze after the resume, and the end of the stream could be missed when one PIP file ended before the pause. The Mixer filter used on its own also keeps time in a graph with no reference clock, after a frame-rate change while running, and after one of its sources is seeked. The fix is in theVisioForge.DotNet.Core.Redist.Basepackages. (#2353) - [Video Capture SDK .Net] Fixed: MP4 output (also in the Video Edit SDK) and the Sensoray direct capture wrote audio encoded by the AAC Encoder v10 starting three AAC frames late (64 ms at 48 kHz) and lost the end of the recording (#2560); direct capture to MP4 from a Sensoray H264 device with multichannel (5.1) audio wrote it stretched to three times its length (#2540); 3.0, 5.0 and 5.1 audio was written with the front channels rotated and other multichannel layouts are now refused (#2539); audio was converted to 44.1 kHz stereo when the AAC bitrate exceeded what the source's sample rate can carry - the format is kept and the bitrate capped. Update
VisioForge_AAC_Encoder_v10*.axin your redistributables. (#2539) - [Video Capture SDK .Net] Fixed: recording to MP4 with direct capture (
VideoCaptureCorewith a Sensoray 2253 andDirectCaptureMP4Output) could not add the AAC audio encoder where the VisioForge AAC Encoder filter is not registered - it now loads from the redist; andMP4Outputwith more than one audio stream recorded an additional stream with the first stream's channel count - each stream now keeps its own. (#2301) - [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: with AAC audio, stopping
MP4HWOutput,MPEGTSOutput,MOVOutputorMKVv2Outputafter the file writer stopped taking audio took about 2 seconds per queued audio frame and cut audio out of the middle of the track; and with the Media Foundation H264/HEVC encoders, a writer that stopped taking video held up the whole capture by up to a second per incoming frame and cut encoded frames out of the middle. The stop and the capture now wait once and then drop only what arrives while the writer is stuck; the video after such a gap may show artifacts until the next keyframe. Needs the updatedVisioForge.DotNet.Core.Redist.MP4package. (#2376, #2513) - [Core] Fixed: on Windows,
DeviceEnumerator.NDISourcesAsyncreturned an empty list while NDI senders were on the network, and an application that listed NDI sources and then played one (NDISourceBlock,NDISourceXBlock,NDISourceSettings.CreateAsync) could not exit - the process stayed alive after its last window closed and could not be ended from Task Manager; the same happened when an application closed while an NDI source search was still running. Sources are now listed through the NDI SDK, on the first call. (#2655) - [Video Capture SDK .Net] Fixed:
IP_Camera_NDI_ListSources(showOnlyLocalSources: true)listed every NDI sender on the network instead of only the ones on this PC, and the extra IP addresses passed to it were ignored unless groups were passed too. (#2655) - [Video Capture SDK .Net] Fixed: the VisioForge H264 Encoder v9 and v10 filters (Intel Media SDK, used on their own) reported an encode failure on their delivery thread as
EC_ERRORABORTwith the genericE_FAIL, posted again for every later frame, silently dropped encoded frames when delivery failed (a failed flush finished as a clean end of stream with a truncated file), and aborted on input they cannot encode with HRESULT 0 - the event now carries the encoder's own failure HRESULT, posted once. Filters 2026.10.11.5 / 2026.10.12.0. (#2561, #2562, #2542) - [Video Edit SDK .Net] Fixed: a trial render of a timeline whose video does not cover the whole timeline - a clip that starts late, the gap between two clips, an audio-only tail - aborted with "Not enough sinkpads to link all objects to the operation ! 1 / 0" and left an unfinished file. The trial watermark is applied to each video clip instead of to the whole video track. (#2464)
- [Demos] Fixed: the Media Player X Uno demo closed when Play was pressed and the media could not be opened; the error is now shown under the controls, and a corrected URL plays on the next Play. The Media Blocks Uno player demo no longer shows a Stop button over a black view when playback fails to start. The Media Player X and Media Blocks Uno player demos open a working sample URL by default (the previous one no longer exists). (#2506)
- [Demos] Fixed: the native iOS demos, every MAUI and Uno demo (and the Uno demos on Mac Catalyst) crashed on launch on iOS 27 / Mac Catalyst 27 before any UI appeared; they now adopt the scene lifecycle the iOS 27 SDK needs, the builds for iOS and Mac Catalyst are fixed, and the minimum versions are stated: iOS 16.4 for the native
VisioForge.CrossPlatform.Core.iOSlibraries, 15.0 for the .NET 10 iOS workload floor, at least 17.0 Mac Catalyst for the MAUI and Uno demos. (#2476, #2495)
2026.10.10¶
- [Media Blocks SDK .Net] [Media Player SDK .Net] [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: on Android, every MPEG-TS source - HLS included - failed to open with "Unable to read file info"; the runtime now ships the MPEG-TS demuxer, and AAC in these sources is decoded in software. Needs
VisioForge.CrossPlatform.Core.Android2026.10.9. - [Video Capture SDK .Net] Fixed: on a webcam exposed through the Windows camera frame server, every
VideoCaptureCoreStop/Start kept one capture-buffer pool (about ten frames, tens of megabytes per cycle, following the camera format). That pool is now released on Stop. A few megabytes and some handles per cycle can still remain. (#2017) - [Video Capture SDK .Net] Added:
VideoCaptureSource.UseMediaFoundation(off unless the app sets it) reads the camera through Media Foundation and sends RGB24 into the graph. In this mode the DirectShow camera-bridge capture-buffer growth on Stop/Start does not happen.VideoCaptureSource.IsMediaFoundationCaptureAvailablereports whether this Windows version has the camera frame server switched on. Audio capture, crossbar, tuner and direct capture are not available together with the flag. (#2017) - [Video Capture SDK .Net] Added:
VideoCaptureCore.Video_MediaFoundationCaptureDeviceslists the cameras Media Foundation can open, with the resolutions and frame rates each camera reports. Sizes that exist only in the DirectShow device list are not included. AVideoCaptureSourcecreated from one of these devices reads that camera through Media Foundation. (#2017) - [Demos] Added: WPF Simple Video Capture (Media Foundation), a separate sample that lists those cameras and previews or records the selected size.
- [Video Capture SDK .Net] Fixed: a Media Foundation camera recording played faster than real time. Each frame is stored at the time it arrived. (#2017)
2026.10.9¶
- [ALL] Added: with a debugger attached and
Debug_Telemetryon, the SDK also reports the names of the features in use - the engine, the types of its blocks, the output format and mode - once per process. No setting values and none of your own classes are reported, and a shipped application still sends nothing. SetDebug_Telemetry = falseto switch it off. - [Core] Added:
Discovery(BaseContext context)logs ONVIF discovery problems to that context as warnings;DeviceEnumerator.ONVIF_ListSourcesAsyncand bothVideoCaptureCore.IP_Camera_ONVIF_ListSourcesAsyncExoverloads now pass their own context. (#1777) - [Core] Changed: GIF frame delays of 10 ms or less now play for 100 ms, as in web browsers, so a GIF with no frame delays animates at 10 fps instead of showing only its first frame. (#2389)
- [Core] Changed: with a debugger attached and
Debug_Telemetryon, an error report from a GStreamer pipeline now also carries the preceding GStreamer warnings and, once per run, the pipeline graph; identical errors from unnamed pipelines now group into one telemetry issue instead of a new one per run. (#2430, #2437) - [Core] Fixed:
QueryActiononGLib.SimpleActionGroup/Application/ActionGroupAdapterand the menu iteratorGetNextcorrupted the heap and never returned their values - breaking: those values are nowoutparameters. A C#IActionGroupImplementorover D-Bus no longer crashes on activation, and the menu and link iterators no longer leak a reference per call. (#2254) - [Core] Fixed: a GStreamer binding subclass that overrides a virtual method and calls
baseno longer crashes when GStreamer has no default implementation; such a call now returns what GStreamer itself would. (#2245) - [Core] Fixed: ONVIF
Discovery.Discoverno longer spins a CPU core for the whole timeout when a receive on one interface keeps failing, no longer misses a camera whose first reply was malformed, and skips an interface whose probe cannot be sent instead of throwing and returning none of the cameras found. (#1777) - [Core] Fixed: on Android and iOS, including Unity apps, video frames converted to
SKBitmapcould have red and blue swapped. (#1904) - [Media Blocks SDK .Net] Added:
MotionDetectionBlockSettings.CompareRed,CompareGreenandCompareBlueselect the channels compared whenCompareGreyscaleisfalse; aMotionDetectionBlockwith greyscale off no longer compares no channel at all. (#2380) - [Media Blocks SDK .Net] Added: multi-bitrate HLS with a master playlist -
HLSSinkBlock.CreateNewInputtakes anHLSVariantStreamorHLSAlternateRenditionper input, andHLSSinkSettings.MultivariantMuxerTypeselects CMAF or MPEG-TS segments. (#2410) - [Media Blocks SDK .Net] Added:
RTSPSourceSettings.AddReferenceTimestampMetastamps each RTSP video frame with the camera's own NTP time, read asVideoFrameX.SenderNTPTime. (#2159) - [Media Blocks SDK .Net] Changed: a muxing or streaming sink now fails the pipeline start when an input has a media type it has no track for, instead of writing the output without that track;
HLSSinkType.Autonow selects hlssink3 (falling back to hlssink2) and an explicitSinkTypewhose element is missing fails the start naming it;HLSSinkBlockwithHlsCmafSinkorHlsMultivariantSinknow starts. (#2374, #2410) - [Media Blocks SDK .Net] Changed: replacing an effect with one of another type in
VideoEffectsBlockorAudioEffectsBlockon a playing pipeline keeps the previous effect until the new one is in;AnimatedGIFSourceBlockoutput format is nowBGRx(wasRGB);SRTSourceBlock,DecodeBinBlockand the blocks built on it no longer decode a stream whose output is not connected. (#2136, #2407, #2355) - [Media Blocks SDK .Net] Changed: a
TeeBlockoutput that fails while streaming no longer stops the other outputs - a recording keeps running when a preview or processing branch beside it fails; the failed output is reported throughOnError. (#2312) - [Media Blocks SDK .Net] Fixed:
StopAsynccould hang or take about 10 seconds - after a source error with aBufferSinkBlockor a non-live recording (#2350, #2294), or after a branch failed caps negotiation (#1781) - and aStoporDisposeracingStartAsynccould raise a spurious error, cancel playback, or release blocks the start was still using (#2391, #2322). - [Media Blocks SDK .Net] Fixed: GIF handling - disposing an
OverlayManagerGIFwhile the block was drawing could throw or crash (#2406); a still or zero-delay GIF was never drawn, a fast GIF fell behind, and the animation ran before the pipeline played and kept running while paused (#2389, #2407); aDecodeBinBlockplaying a file whose only streams have no decoder hung in PAUSED instead of playing to its end (#2409). - [Media Blocks SDK .Net] Fixed: a batch of silent or null-reference starts -
SeparateOutputBlockwith no sink, a bridge sink insideProxySourceBlock,MPEGTSSinkSettings.FileOutputchanged after the block was created,MP4SinkSettings.MuxOnlyon the output-less blocks or with split settings (#2385, #2386, #2373), an AWS S3 separate output ignoring its sink build failure (#2384), and aSubtitleSourceBlockor a block that failed to build leaving its elements behind (#1772, #2288). - [Media Blocks SDK .Net] Fixed: pipeline documents and snapshots - a saved muxing pipeline failed to load when inputs were created in a different order, an input fed from a
TeeBlockor a parser was restored without its media type and a subtitle input was not recorded (#2374), and a snapshot or diagram dropped a custom block's connections (#2209). - [Media Blocks SDK .Net] Fixed: other defects - a custom block with only
Input/Outputpads could not be removed from a running pipeline (#2369),AddOrUpdaterefused an effect at the end of an unconnected chain (#2136),VideoEffectsWinBlockswapped red and blue (#2398),BluRaySourceBlockdelivered no video or audio (#2135),PauseOnStopfailed to replay (#1828), aLiveVideoCompositorV2 kept or disposed the wrong audio renderer (#1872, #2359),RTSPServerBlockheld its encoder (#2214), aTeeBlockrecording was left withoutmoov(#2272) or ended with an "Internal data stream error" on an unconnected output (#2312),SqueezebackBlockleft a temp file per call (#1774), andUniversalTransformBlockrefused an input format one of its caps accepts (#1782). - [Media Blocks SDK .Net] [Media Player SDK .Net] [Video Capture SDK .Net] Fixed:
OnErrorwas raised twice for one error whenLiveVideoCompositorrefused an input add or a live video effect change. (#2341) - [Media Player SDK .Net] Changed:
MediaFileInfo.Container.Formatof an HLS, DASH or Smooth Streaming source now reports the manifest format (for HLSapplication/x-hls) instead of the format of its segments; aSelection_Stopat or beforeSelection_Startnow failsPlay()in every source mode with anOnErrornaming the selection, instead of an error blaming the source. (#2428, #2276) - [Media Player SDK .Net] Fixed: the 2026.10.6 SDK installer and Media Player redist shipped the previous memory source filter, so
MediaPlayerCoreinMemory_DSmode withCustom_Splitter = "AVI Splitter"crashed a 64-bit process again at playback start; update the Media Player redist packages together with the SDK, or install this release. The AsyncEx filter also no longer crashes when it is given its file after it was added to the graph (redist 2026.10.8.6). (#2323, #2405) - [Media Player SDK .Net] Fixed: since 2026.10.6, HLS playback could stop shortly after opening with "Internal data stream error ... not-negotiated" when the stream switched quality, and live MPEG-TS network streams were decoded through a different decoder path; both are back to the earlier behavior. (#2428)
- [Media Player SDK .Net] Fixed:
Stop()orDispose()called on one thread while another was inside a playback call - or while theLooprestart was seeking - could release the player under that call and crash it; the stop or release now runs once that call has returned. (#2314, #2076) - [Media Player SDK .Net] Fixed:
MediaPlayerCoreinFile_DSmode with LAV Splitter failed to open any file unless LAV Filters were installed system-wide, and inFile_DSandFFMPEGmodes it ignoredVideo_Stream_Select; both now work, and a switch that cannot be applied mid-playback (a system splitter, a size or chroma change, no audio) fails with an error asking to select the stream beforePlay. (#2057, #2267, #2268, #2319) - [Media Player SDK .Net] Fixed: with the
File_VLCsource mode, a playback could start over from the beginning instead of ending,Position_Set_Timecould wait for VLC while it was still buffering, and withLoopa cleared selection still stopped each pass at the earlier selection's stop. (#2248) - [Media Player SDK .Net] [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed:
Helpful_GetFrameFromFileAsyncwith theFFMPEGengine could returnnull, throw when FFmpeg exited early, return a skewed frame for a video width that is not a multiple of 4, and left a thread blocked and its frame buffer (about 25 MB for 4K) in memory for the life of the process. (#2329, #1788) - [Media Player SDK .Net] [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: DirectShow engines building their graphs at the same time in one process could read another engine's pin media types, and every enumerated pin media type leaked a small block of native memory. Needs
VisioForge.Libs.External2026.10.7. (#2321) - [Video Capture SDK .Net] Changed: the DirectShow NVENC H.264 encoder is built against the current NVIDIA Video Codec SDK and encodes again on recent NVIDIA drivers, where the old preset set no longer exists. The property-page presets are now P1 (fastest) through P7 (best quality), an unsupported preset or rate-control value fails encoding with the NVENC error instead of silently falling back, and the encoder now needs NVIDIA driver 531.61 (Windows) or 530.41.03 (Linux) or newer. (#2438)
- [Video Capture SDK .Net] Changed: with separate capture,
SeparateCapture_Startwhile a file already records now fails with an error and leaves that file alone (useSeparateCapture_ChangeFilenameOnTheFly);PIP_Mode = PIPMode.MultipleVideoStreamswith a video output other than MP4 or WMV, withMP4Output.UseSpecialSyncMode, or together withSeparateCapture_Enablednow fails the start with anOnError, as these combinations write a file without the PIP streams. (#2311, #2246) - [Video Capture SDK .Net] Fixed: after several record-stop cycles a separate capture stop could hang forever inside a native call and every later stop or start was declined; the stop now gives up after a timeout, completes and names the stuck call, and the GMFBridge filter's unbridge no longer waits forever. (#2446, #2460)
- [Video Capture SDK .Net] Fixed: stopping an IP camera capture with the FFMPEG source hung when the camera stopped sending, because the shipped FFMPEG source filter was still the June build; stop now completes and the stream ends after
FFMPEG_MaxLoadTimeout. Needs the updatedVisioForge.DotNet.Core.Redist.FFMPEGpackage. (#2443) - [Video Capture SDK .Net] Fixed: with
MP4Output(or separate capture), switching the output file while recording -OutputFilename_ChangeOnTheFly,SeparateCapture_ChangeFilenameOnTheFlyor an automatic split - could write a frame of the file just finished into the new file and shift its time base, and a switch racing the capture stop could crash or keep a file open into the next start. (#2421, #2311) - [Video Capture SDK .Net] Fixed: with separate capture to
MP4HWOutput,MKVv2Output,MOVOutputorMPEGTSOutput, resuming a paused capture or reading the output position while the output switched files could crash, and the DirectShow NVENC encoder crashed when its availability check ran on a filter that was encoding. (#1984, #2438) - [Video Capture SDK .Net] Fixed: a CustomOutput written by the Windows File Writer or the WM ASF Writer with a path longer than 259 characters, a screen or window capture region narrower or shorter than 4 pixels, and a
PIP_Sources_ScreenSource_Updateregion withRight/Bottomat 0 all either failed without naming the cause or misbehaved; each now fails the start with an error naming it, and a PiP screen source is moved rather than resized. (#2375, #2392) - [Video Capture SDK .Net] Fixed: a screen capture that could not start could crash with an access violation instead of returning
false; an animated GIF recorded through a separate output was written at 10 fps instead of the GIF's own frame rate; withSeparateCapture_Enableda video file added as a PIP source never appeared; andOnVideoFrameSKBitmapbitmaps had red and blue swapped on BGRA platforms. (#2363, #2435, #2246, #1907) - [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: an
MP4Outputrecording or conversion stopped before every stream had delivered its first sample - with separate capture, a stop or automatic split right after a file started - could hang forever, and every laterStopAsync/StartAsyncwas refused. (#2390) - [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: with AAC audio,
MP4HWOutput,MPEGTSOutput,MOVOutputandMKVv2Outputcut off the last ~50 ms of audio at every stop and separate-capture file switch; a FFMPEG.exe output dropped withoutDisposewas never finalized; and with an NVENC, Intel Quick Sync or AMD hardware encoder a stop or dispose could crash when the driver stayed stuck for more than about 10 seconds. Needs the updatedVisioForge.DotNet.Core.Redist.MP4package. (#2206, #2035, #2208) - [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: converting or recording with a
CustomOutputor the built-in outputs to a path longer than 259 characters failed at start with anIMediaControl.Runerror (HRESULT=80070057) and no hint of the cause; it now fails naming the limit. (#2337) - [Video Capture SDK .Net] [Media Player SDK .Net] Fixed: in Picture-in-Picture, a video file added as a PIP source skipped its first frames and a short file was never shown. The fix is in the
VisioForge.DotNet.Core.Redist.Basepackages. (#2304) - [Video Capture SDK .Net] [Media Player SDK .Net] [Video Edit SDK .Net] Fixed: a motion detection grid of 0, a negative one or one larger than the frame crashed the application; enlarging the grid while video ran corrupted memory and the event's
Matrixkept the old size; the event'sMatrixwas one array reused for every frame; and at a video width whose rows are padded (width x 3 not a multiple of 4) the matrix and the highlight were shifted further on every row. AMatrixis now a copy per event and an invalid grid reports theLevelwith an emptyMatrix. (#2380, #2412, #2377) - [Video Capture SDK .Net] [Media Player SDK .Net] [Video Edit SDK .Net] [Media Blocks SDK .Net] Changed: each motion detection
Matrixcell is now the true average of its area, up to 255 for a fully changed cell - it used to be biased low, most for fine grids, so thresholds tuned onMatrixvalues may need raising. With greyscale off the per-pixel mean absolute change of the selected channels is reported: opposite changes of two channels no longer cancel out, and the values can be up to 3 times higher. (#2380) - [Video Capture SDK .Net] [Media Player SDK .Net] [Video Edit SDK .Net] [Media Blocks SDK .Net] Fixed: an image logo whose file exists but cannot be decoded or opened was re-read from disk and its error logged on every video frame; it is now reported once. (#2408)
- [Video Edit SDK .Net] Fixed: the 3D LUT video effect applied the
.cubefile with the red and blue channels swapped; severalVideoEditCoreinstances converting at the same time in one process could fail to start withVideo stream is not found,IMediaControl.Run is nullor an MP4 muxer error. (#2304, #2321)
2026.10.6¶
- [Media Blocks SDK .Net] Added: ASP.NET Web Forms support. The new
VisioForge.DotNet.Core.UI.WebFormspackage ships theHlsPlayerserver control: the SDK encodes a file, an HTTP URL, an RTSP camera or a capture device to HLS on the server and the control plays it in the browser. Two Web Forms demos are included. - [Media Player SDK .Net] Changed: with
Loopenabled,MediaPlayerCoreraises onlyOnLoopon each restart;OnStopandOnStartare no longer raised per pass. (#2087) - [Media Player SDK .Net] Changed: a synchronous
Play()called while anotherPlay()/PlayAsync()is still starting now returnsfalsewith "Already starting or start in progress" instead of cancelling that stop and leaving the playback running. (#2086) - [Video Capture SDK .Net] [Media Player SDK .Net] Changed: with the
FFMPEGsource engine, a server that stops sending now ends the capture's stream or the playback after aboutFFMPEG_MaxLoadTimeout(rtsp, rtsps, srt, tcp, tls, ftp, mmsh, mmst, upper-case schemes; about 15 s for the player; reconnect viaOnNetworkSourceDisconnect). Needs the updatedVisioForge.DotNet.Core.Redist.FFMPEGpackage. (#2089, #2107, #2120) - [Core] Fixed:
Gst.Video.VideoFrame.Map/MapIdcorrupted the heap,VideoMeta.GetPlaneSize/GetPlaneHeightcrashed, and in 32-bit applicationsRTPBufferread and wrote itsMapInfoat the wrong offset.RTPBuffer.Sizeis nowUIntPtr[], matching the nativegsize. (#1802) - [Core] Fixed:
Gst.RtspServer.RTSPClientoverrides ofOnConfigureClientTransportlost every transport setting, and a transport handed throughRTSPStreamTransportorRTSPSessionMedia.SetTransportcould corrupt the heap. Breaking: the override now takes the transport by reference (ref RTSPTransport ct). (#2223) - [Core] Fixed:
Gst.RtspServer.RTSPClientoverrides ofOnAdjustPlayModereceived garbage for the PLAY range, seek flags, rate, trick-mode interval and rate control and could not change them, a body or status set inOnTunnelHttpResponsewas dropped and could corrupt the heap, and callingbasefrom either crashed the application. Breaking: both take what they may change by reference (ref RTSPTimeRange? range, ref SeekFlags flags, ref double rate, ref ulong trickmode_interval, ref bool enable_rate_control;ref RTSPMessage response). (#2249) - [Core] Fixed: reading a
GLib.Variantfrom the GIO bindings leaked it, and a C#IActionImplementor,IActionGroupImplementororMenuModelsubclass had its state or attribute value freed under it when GLib read it - actionState/StateHint,GetActionState, theGLib.Settingsgetters, menu attribute values and iconSerialize()kept one reference per call. Breaking: where GLib has no value (a stateless action's state, an unset settings key, a missing menu attribute, an unset variantGLib.Value, the parameter of a parameterlessActivate/ActivateActionon a C# implementation) these now givenullinstead of aGLib.Variantwith a zeroHandle- check fornullrather thanHandle == IntPtr.Zero. - [Media Blocks SDK .Net] Fixed: stopping a split recording (
MPEGTSSplitSinkSettings,MP4SplitSinkSettings) at the moment a new segment began raised "The graceful EOS wait ended without End-Of-Stream" and cut the last segment short. (#2226) - [Media Blocks SDK .Net] Fixed: blocks, effects and servers no longer keep their GStreamer elements alive after the pipeline was stopped and disposed until the next garbage collection — the AAC/MP3/Opus encoders, the loudness and channel-mix effects, the screen, subtitle and Spinnaker sources, the bridge blocks, an RTSP server's Media Foundation encoder and internally created renderers are now released with the pipeline. (#2062, #2079, #2090)
- [Media Blocks SDK .Net] Fixed: custom media blocks implementing only some of
Input/Inputs/Output/Outputscould not be used —Connectnow pairs the first free pads of the same media type and returnsfalsewith anOnErrorwhen there is no pair, andGetOutputPadByTypereturnsnullinstead of throwing. (#2169, #2112) - [Media Blocks SDK .Net] Fixed: unlinking an output of a playing pipeline stopped the source with "Internal data stream error" and an
OnDemandConnectoutput stopped it while nothing was linked; an unlinked output now drops its data until it is linked again, and an RTSP audio output is connectable after the start. (#2056, #1799, #2132) - [Media Blocks SDK .Net] Fixed:
RemoveElementsFromPipeline()did nothing on single-chain blocks (video/audio sample grabbers, null renderer), so a branch taken out of a running pipeline kept the graceful stop waiting about 10 seconds; such a block is now taken out and can be disposed. (#2139) - [Media Blocks SDK .Net] Fixed:
UniversalSourceBlockV2delivered only one of an RTSP stream's video and audio, delivered no G.711 (PCMU/PCMA) audio, and froze on an SSRC change;RTSPSourceBlock/RTSPRAWSourceBlocknow skip comfort-noise and DTMF packets instead of muting the track for the rest of the session, survive an SSRC change, play audio-only streams, and an ONVIF metadata track is no longer reported as a video RTP stream. (#2131, #2158, #2154) - [Media Blocks SDK .Net] Fixed: an RTSP source without stream information never started with
CustomVideoDecoderorUseGPUDecoder, andUseGPUDecoderhad no effect on a stream whose information was read — H.264/H.265 now decode on a GPU decoder (D3D11, D3D12, NVIDIA, QSV, VA-API, VideoToolbox), falling back to the CPU with a warning. (#2071) - [Media Blocks SDK .Net] Fixed:
VideoPaddingChangerBlock(andSqueezebackBlock) crashed the process when its rectangle was larger than the frame or the resolution dropped mid-stream; the picture is kept inside the frame and a newInput_Movereplaces one still in progress. (#2036) - [Media Blocks SDK .Net] Fixed: 5.1/5.0 audio with side surround channels encoded to HLS or MPEG-TS could not be played — browsers refused the track; it is now encoded as standard 5.1/5.0 AAC on every AAC output of the SDK. (#2182)
- [Media Blocks SDK .Net] Fixed:
FallbackSwitchSourceBlockdid not apply the main source's connection settings and kept the fallback for good when the ONVIF lookup failed at start — the settings are applied again and the lookup is retried while the fallback plays. (#1950, #1968, #1992) - [Media Blocks SDK .Net] Fixed: a
LiveVideoCompositorV2 input took slots its source never fills — a dead audio slot for a source without audio, a black video slot for one without video — or was added withtruealthough its source could not be connected. Such an input is now refused withfalseand anOnErrorand its slots stay free; applies toUniversalSourceBlock/V2,DemuxerSourceBlock,BluRaySourceBlock, NDI,RTSPSourceBlockandRTSPRAWSourceBlockinputs. (#2125, #2109, #1871, #2112, #2127, #2154, #2175, #2192, #2164) - [Media Blocks SDK .Net] [Video Edit SDK X .Net] Fixed: seeking,
Rate_Set,Pause/Resume,SendEOS,Position_Set,GetSnapshot, the debug dumps andDisposecalled while the pipeline was stopping could hit a released pipeline, log a GStreamer critical or crash the process — the stop now waits for such calls. (#1899) - [Video Capture SDK .Net] Fixed: in Picture-in-Picture, a PIP source that failed to open made every PIP source after it disappear and could stop the capture; it is now reported through
OnErrorand skipped. (#2183) - [Video Capture SDK .Net] Fixed: a separate-capture file switch with an MF mux output blocked the caller for about 2.5 seconds; a switch now returns in a fraction of a second, and stops and
VideoEditCoreconversions to these outputs are faster too. Needs the updatedVisioForge.DotNet.Core.Redist.MP4package. (#2081) - [Video Capture SDK .Net] Fixed: a DirectCapture recording from an IP camera that stopped sending never ended and left an unplayable MP4; it now ends after about
FFMPEG_MaxLoadTimeoutwith a playable file, honorsFFMPEG_CustomOptions["rtsp_transport"], no longer reports harmless "bind failed" lines, and reports a recorder that ended on its own. (#2106) - [Video Capture SDK .Net] Fixed: stopping an IP camera capture hung when the camera stopped sending (
RTSP_LowLatencywith audio,Auto_LAV,Auto_FFMPEG); the stop now completes. Needs the updatedVisioForge.DotNet.Core.Redist.FFMPEGpackage. (#2072) - [Video Capture SDK .Net] Fixed: in separate capture to an MF mux output, a pause in a file started with
SeparateCapture_ChangeFilenameOnTheFlyAsyncshifted that file's video back by the previous files' pauses, and with KLV the writes failed; this release ships the correctedVisioForge_MF_Mux*.ax. (#2045) - [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: every
MKVv2Outputfile with audio had a damaged Matroska header (ffprobe EBML errors, every stream listed twice). Needs the updatedVisioForge.DotNet.Core.Redist.MP4.*package. (#1878) - [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: recording or converting to
MP4HWOutput,MKVv2Output,MOVOutputorMPEGTSOutputwith an output path longer than 260 characters failed or crashed; such paths now record (in .NET Framework applications 4.6.2+; needs the updatedVisioForge.DotNet.Core.Redist.MP4package), while the DirectShow writers refuse a path over 259 characters at once with an error naming the limit. (#2129, #2230) - [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: with an NVENC, Intel Quick Sync or AMD hardware encoder behind
MP4HWOutput,MKVv2Output,MOVOutput,MPEGTSOutputor HLS, a stop, a failed start or a dispose without a stop could crash the application; such a stop can now take up to about 10 seconds. Needs the updatedVisioForge.DotNet.Core.Redist.MP4package. (#2208) - [Video Capture SDK .Net] Fixed:
StartDelayed()/StartDelayedAsync()on a capture whose graph already ran it a second time, and a call just before aStop()could start the next capture early; both are now refused withfalse. (#2105, #2118) - [Video Capture SDK .Net] Fixed:
Start/StartAsynconceDisposehas claimed the engine now returnfalsewith an error instead of starting a capture that is being released. (#1917) - [Video Capture SDK .Net] Fixed: an IP camera on the
Auto_VLCengine corrupted the VLC source filter with aVLC_CustomParametersentry of 50 bytes or more (or more than 50 entries), and crashed onVLC_ZeroClockJitterEnabledor an unknown option; the redist ships VLC source filter 2026.10.5 on VLC 3.0.23, and an unknown option now fails the start with anOnError. (#2165) - [Video Capture SDK .Net] Fixed: an
Auto_VLCIP camera that failed to open raised a second "check the URL" error after the VLC source's own precise one, and a stream without video failed with aNullReferenceException; both are gone. (#2178) - [Video Capture SDK .Net] [Media Player SDK .Net] [Video Edit SDK .Net] Fixed: on .NET Framework, an application that exited without disposing a running
VideoCaptureCore,MediaPlayerCoreorVideoEditCorecould crash on exit. (#1970) - [Video Capture SDK .Net] Fixed: after a refused
OutputFilename_ChangeOnTheFlythe capture reopened the finished file, and a switch called while paused resumed recording into the new file; the finished file is kept and a paused capture stays paused. (#2069, #1909) - [Media Player SDK .Net] Fixed: with the
File_VLCsource mode,Loopnever looped,Position_Set_Timefailed andDuration_Timereturned zero; the VLC redist ships filter 2026.10.6, which seeks, and withSelection_Activethe position counts from the start of the file on every pass. (#2161) - [Media Player SDK .Net] Fixed:
Selection_ActiveonFile_VLCplayed the whole file, andSelection_Stop = TimeSpan.ZeroonFile_DSandFFMPEGended the playback right afterSelection_Start; both now play the documented range. (#2138, #2116) - [Media Player SDK .Net] Fixed:
MediaPlayerCorefailed to play a file with fewer video streams than the lastVideo_Stream_Selectindex, reporting only "Unable to play file or DVD"; such a Play fails with an error naming the index and the file's stream count, and a rejectedVideo_Stream_Selectno longer replaces the index the next Play uses. (#2046) - [Media Player SDK .Net] Fixed: a playback could be left running with
Stop()doing nothing,Dispose()after a synchronousPlay()released the player without stopping it, and aDispose()during aStop()on another thread could crash the process; all three are fixed. (#2088, #1977, #2064) - [Media Player SDK .Net] Fixed: starting the next file from an
OnStophandler did not work (PlayAsync()failed with "Already starting or start in progress", aStop()did not end it, the WPF view stayed black); the playback is now stopped beforeOnStopis raised. (#2077) - [Media Player SDK .Net] Fixed: with the built-in playlist, a
Playlist_PlayNext()/Playlist_PlayPrevious()landing at the same time as the end of a file skipped an entry, anOnStophandler that started the next file itself made the playlist step again, and without a video view — or with aCallbackVideoView, a WinUI/Avalonia view or a view whoseCallInvokethrows — only the first file played; every file now plays in all these cases. (#2145, #2085, #2176, #2188) - [Media Player SDK .Net] Fixed: with
ConsoleUsage,Play()returned after the first file of the playlist and aPlaylist_PlayNext()from another thread blocked until the next file ended;Play()now plays the whole playlist and a move during it hands the next file to the running start. (#2111) - [Media Player SDK .Net] Fixed: with the
HTTP_RTSP_VLCsource mode, a stream the VLC source could not open was reported as opened, and an unplayable URL or a stream with neither video nor audio madePlay()returntruewith nothing playing; the open now fails with the VLC source'sOnError. (#2184) - [Media Player SDK .Net] Fixed: MPEG-TS recordings whose timestamps continue a running stream reported "playback complete" immediately instead of playing in the X player. (#2037)
- [Media Player SDK .Net] Fixed:
Multiple_Video_Streams_Mappings_Addworked only together withVideo_Stream_Select; mappings now work on their own,Video_Stream_Select(-1)selects stream 0, other negative indexes returnfalsewith an error. (#1990) - [Video Edit SDK .Net] Fixed:
VideoEditCore.StartDelayed()/StartDelayedAsync()on a running edit ran the graph a second time, and one racing aStop()could throw or start the new edit early; both are now refused. (#2105, #2118) - [Video Edit SDK .Net] Fixed: inputs added from a stream left their temporary copies behind — on failure, after
Stop(), afterDispose()without aStop(), or after a render that failed to stop cleanly; the copies are now deleted on every path, and a failed copy returnsfalsewith anOnError. (#2098, #2039) - [Video Edit SDK .Net] Fixed: a
VideoEditCoreX.Stop()orDispose()that overlapped the end of a render raisedOnStoptwice or threwInvalidOperationException, andStop()during a render blocked for about 3 seconds and left an unplayable file; the render is finalized, andStop()returnsfalsewhen the output could not be finished. (#1978, #2041) - [Video Edit SDK .Net] Fixed: after a
VideoEditCoreX.Stop(), a later render did not report its pipeline errors throughOnError, and aDispose()orStop()from anOnErrorreaction could crash the process. (#2038) - [Video Edit SDK .Net] Fixed:
VideoEditCoreXwith an output whose encoder GStreamer does not select on its own (the default AAC ofMPEGTSOutput, D3D12, QSV, VA-API) did not start;new MPEGTSOutput(path)now renders as is. (#2189)
2026.10.2¶
- [Media Player SDK .Net] Fixed: legacy
MediaPlayerCoreplaying from memory (Memory_DS,Source_MemoryStream) crashed the process with an access violation — withCustom_Splitter = "AVI Splitter"in a 64-bit process the crash came as soon as playback started, and in any memory playback it could come at process exit, after playback had finished cleanly. The fix ships in the Media Player redist packages; update them together with the SDK. (#2031) - [Media Blocks SDK .Net] Fixed: pipeline bus error messages hid the GStreamer debug string unless
Debug_Modewas on, so the real cause of an error (for example a failed UDP bind) was not visible inOnErroror the log — the debug string is now always included. (#1851) - [Video Capture SDK .Net] Fixed: a
VideoCaptureCorecapturing from an MJPEG IP camera (HTTP MJPEG low latency source) that was dropped withoutDisposewas never garbage-collected — the source's own reader thread and disconnect timer kept the engine alive, so the capture kept running and held its output files until the process exited. The same fix removes the equivalent roots in the RTSP low-latency and NDI DirectShow sources. (#2002) - [Media Player SDK .Net] Fixed: legacy
MediaPlayerCoreinFile_DSmode played the audio of an ASF/WMV file whose audio stream is not WMA (for example uncompressed PCM) even withAudio_PlayAudioturned off — the Null Renderer was connected to the wrong output pin, the connect failed, and the audio stream later went to the default audio device. (#1958) - [Media Blocks SDK .Net] Fixed: after a pipeline was torn down, a late GStreamer call into a disposed custom transform element failed frames with "No transform function set" and answered caps queries with default caps, and Video Padding Changer could crash the streaming thread in the same situation. (#1784)
- [Media Blocks SDK .Net] Fixed: recording an SRT H.264 MPEG-TS stream to MP4 stopped a few seconds after the start and left a file that cannot be played (no moov). (#1933)
- [Video Capture SDK .Net] Fixed: a Stop or a window close during separate-capture start, file switch or resume could report a short empty file, or leave a recorded file with no stopped event and no tags. A file that is already being recorded is reported and closed by that stop. A file that is not recording yet is not started and not reported. (#1932)
- [Video Capture SDK .Net] Fixed:
SeparateCapture_StartorSeparateCapture_StartAsynccalled whileStartwas still running returned false with no error and deleted the previous recording. The call now reports that the capture is still starting and leaves the previous file untouched. Call it again afterStartreturns. (#2018) - [Video Capture SDK .Net] Fixed: on x64, capture with the video sample grabber did not start when the camera delivered NV12 — the grabber asks for RGB24, and the YUV to RGB converter was no longer inserted into the graph, so capture failed to connect. (#2015)
- [Media Blocks SDK .Net] Fixed: calling
MediaBlocksPipeline.Stop()from anOnErrorhandler crashed the process when the error was logged from a GStreamer thread, and a handler that waits synchronously for the UI thread could deadlock when that error was logged while the SDK held a lock.OnErroris now raised on a thread-pool thread, in the order the messages were logged, so a handler may callStop()there. Code that updates UI controls from the handler has to marshal to the UI thread. (#1991, #1993) - [Media Player SDK .Net] Fixed:
MediaPlayerCoreXin trial mode showed no trial mark on Android — the TV-matrix overlay was not inserted into the preview there, so an unlicensed playback looked identical to a licensed one; the trial overlay is now drawn on Android as on the other platforms. (#2004) - [Video Capture SDK .Net] Fixed: legacy DirectShow capture to Ogg Vorbis or Speex wrote a truncated .ogg/.spx that could contain only the codec headers — such a file does not parse (ffprobe reports "End of file"), and in the rest of the runs the buffered tail of audio was silently lost; the Ogg stream is now finalized on stop with a proper end-of-stream page. (#1997)
- [Video Edit SDK .Net] Fixed:
VideoEditCoreconversion failed withInvalidCastException(E_NOINTERFACE) when a clip was added on the UI thread and started withStartAsync, or added in the background and started withStart. The same exception was raised while reporting convert progress and when the editor was disposed off the thread that added the clip. (#1995) - [Core] Fixed: the
VisioForge.DotNet.Core.Redist.MP4.*NuGet packages of 2026.10.1 carried older builds of theVisioForge_MFT*.dllandVisioForge_MF_Mux*.axfilters than the installer — without the KLV and separate-capture native fixes that release announced. The corrected builds (2026.9.30) ship in this release's packages. (#2014) - [Demos] Fixed: a failed ONVIF "Connect" in the IP camera demos leaked the ONVIF client, an error during connect could leave a half-connected client that the PTZ buttons still acted on with no error shown, and the VB.NET demos made an extra device-information request and centred PTZ on the first profile instead of the selected one. (#1957)
2026.10.1¶
- [Video Capture SDK .Net] Fixed:
VideoCaptureCorereported a bare LINQ error ("Sequence contains no matching element") when started with aVideo_CaptureDevicename matching no installed device; the start now fails with an error naming the device as not found, andVideo_CaptureDevice_CrossBar_Initreturnsfalsefor an unknown name instead of throwing. (#1996) - [Core] Fixed: a WPF
VideoViewwith the native renderer (the default) leaked one Windows USER object on every pipeline build and stop, so an application that rebuilds pipelines repeatedly (camera switching, source rotation) hit the Windows limit of 10,000 USER objects per process after enough cycles and stopped creating windows. The video host and its panel are now created once per view and reused across cycles. (#2000)
2026.9.30¶
- [Core] Fixed: the DirectShow helper
FilterGraphTools.AddFilterByNamekept the native filter it had bound from the device moniker loaded until finalization when adding it to the graph failed (the caller then saw the filter as not found), and kept a COM moniker for every device it had enumerated; the filter and the monikers are released now. (#1960) - [Core] Fixed: a WPF
VideoViewwith aStatusOverlayattached leaked one unmanaged frame buffer of the view's size (about 3 MB at 1280x768) on every pipeline start and on every stop or error of the classic engines, so private memory grew without limit in applications that build and stop pipelines repeatedly; the buffer is now freed after it is drawn. (#1999) - [Media Blocks SDK .Net] Changed: a
DecodeBinBlockorSRTSourceBlockoutput connected to an MP4 or MOV recording (MP4OutputBlock,MOVSinkBlock) when no stream of that type reaches it is now reported throughOnErroras soon as the source is opened, instead of only atStopAsync. The file is not written while that input receives nothing, so the application can stop the pipeline and connect only the outputs the source delivers. (#1962) - [Core] Fixed:
MediaPlayerCore,VideoCaptureCoreandVideoEditCorecould crash with anAccessViolationExceptionor corrupt memory when the video resolution grew during playback or capture (a stream that changes resolution, a larger playlist item) whileOnVideoFrameBufferWPFwas subscribed, as the WPFVideoViewdoes. (#1826) - [Media Blocks SDK .Net] Fixed: errors reported by the sink blocks (
MP4SinkBlock,MKVSinkBlock,FileSinkBlock,RTMPSinkBlock,SRTSinkBlockand the other muxer and network sinks), and byTeeBlock,QueueBlock,DecodeBinBlock,SourceSwitchBlock,CustomMediaBlockand several other blocks, never reachedMediaBlocksPipeline.OnErroror the pipeline log; the application saw only a generic build failure or nothing at all. (#1974) - [Media Blocks SDK .Net] Fixed: an application that used
SRTSourceBlockinSRTConnectionMode.Listenercrashed when it exited (exit code0xC0000409), after the pipeline had been stopped and disposed. (#1928) - [Media Blocks SDK .Net] Fixed: a recording through
MKVOutputBlock,WebMOutputBlockor a splitMP4OutputBlock(MP4SplitSinkSettings) wrote nothing when its audio input was connected to a source with no audio stream; the input with no stream is now dropped and the video is recorded. (#1929) - [Video Capture SDK .Net] Fixed:
VideoCaptureCoreXwithRTSPSourceSettings.FallbackSwitchenabled did not resolve an ONVIF camera address (an http or https URL) to its RTSP stream, so the camera never played and the fallback stayed on screen. This hit settings created with the parameterless constructor or loaded from JSON, andCreateAsyncsettings whose ONVIF lookup had failed; the address is now resolved at start as it is without the fallback switch. (#1946) - [Media Player SDK .Net] Fixed:
MediaPlayerCoreXnever played an ONVIF camera address (an http or https URL) inRTSPSourceSettingscreated with the parameterless constructor or loaded from JSON; the address is now resolved to the camera's RTSP stream when the source opens, andOpenAsyncreturnsfalsewith an error when the camera does not answer. (#1969) - [Media Blocks SDK .Net] Fixed:
RTSPSourceBlockandFallbackSwitchSourceBlocknever played an ONVIF camera address inRTSPSourceSettingscreated with the parameterless constructor or loaded from JSON;StartAsyncnow resolves it to the camera's RTSP stream. When the camera does not answer,RTSPSourceBlockdoes not start and reports the address, andFallbackSwitchSourceBlockplays its fallback. (#1969) - [Video Capture SDK .Net] Fixed: a
VideoCaptureCoreseparate-capture file started bySeparateCapture_ChangeFilenameOnTheFlyAsync, an automatic split or a stop and start could hold only a few frames of video when the switch finished within one frame interval (seen on IP cameras withFFMPEGOutput); the file now holds the video recorded into it. (#1895) - [Video Capture SDK .Net] Fixed: KLV metadata in the separate-capture files of an IP camera (
FFMPEGOutputwithMPEG_TS_KLV,MPEGTSOutputwithKLVEnabled) kept the capture's running time instead of starting with each file, so from the third file on it sat past the end of the video, and it went on being written duringSeparateCapture_Pause. KLV is now timed from the start of each file, as the video is, and none is written during a pause. WithFFMPEGOutputthe timing needs the defaultSeparateCapture_GMFModeand noIPCameraSourceSettings.ForcedFramerate; otherwise KLV keeps the capture's running time. WithFFMPEGOutput, KLV that arrives after its file has been switched or paused (up to about half a second) is dropped rather than written into the next file with a wrong time. (#1895) - [Video Capture SDK .Net] Fixed: with
SeparateCapture_GMFMode = false, KLV metadata from an IP camera went on being written into a separate-capture file (FFMPEGOutputwithMPEG_TS_KLV) duringSeparateCapture_Pause. None is written during a pause now. In this mode each file's KLV keeps the capture's running time instead of starting with the file's video;VideoCaptureCorenow warns about it once per capture. LeaveSeparateCapture_GMFModeat its default to time KLV per file. (#1967) - [Video Capture SDK .Net] Fixed: with
MP4HWOutput,MKVv2Output,MOVOutputorMPEGTSOutputand separate capture, a file started bySeparateCapture_ChangeFilenameOnTheFlyAsyncafter aSeparateCapture_Pausein the previous file had its video (and KLV) stamped back by that earlier pause after its own first pause, overwriting part of what it had recorded; each file now counts only its own pauses. (#1895) - [Video Capture SDK .Net] Fixed: with
MPEGTSOutput { KLVEnabled = true }and separate capture,SeparateCapture_Stop,SeparateCapture_Startor a file switch could crash the process when it met a KLV packet being written; afterSeparateCapture_StopKLV no longer raises an error for every packet until the next start. (#1895) - [Video Capture SDK .Net] Fixed: a webcam recording to
MP4HWOutput,MKVv2Output,MOVOutputorMPEGTSOutputplayed its video ahead of the sound by the time the camera took to deliver its first frame (about 0.7 s, longer in a dim room), and the video ended that much before the audio. The video track now starts where the camera's first frame actually arrived. (#1938) - [Video Capture SDK .Net] Fixed: stopping an
MKVv2Outputrecording before its first video frame had been encoded (a very short recording, or a camera slow to deliver its first frame) crashed the process. The output file is left empty and an error is reported instead. (#1938) - [Media Player SDK .Net] Fixed:
MediaPlayerCorewith a video stream selected throughVideo_Stream_Selectshowed the wrong stream, or a black window, in the extra windows added withMultiple_Video_Streams_Mappings_Add; each window now shows the stream passed asstreamIndex, and a window mapped to a stream already shown in the main window or in another mapped window is reported throughOnErrorand left out instead of failing silently. (#1961) - [Media Player SDK .Net] Fixed:
MediaPlayerCorein theFile_DSmode went on withPlaywhen the source file could not be opened, or failed with an exception when the Windows Media decoder was missing; aBluRaysource went on withPlayand played nothing when a LAV decoder was missing.Playnow fails with "Unable to add source file", "Unable to load file for WM ASF Source", "WMVideo Decoder DMO not found", "WMAudio Decoder DMO not found", "LAV Video Decoder not found" or "LAV Audio Decoder not found". (#1920) - [Media Player SDK .Net] Fixed:
MediaPlayerCore.PlayandPlayAsyncfailed with anArgumentNullExceptionwhenDebug_Modewas enabled andDebug_Dirwas never set or was set tonull; playback now starts and the debug dumps are written to the working directory, the same place the log goes. (#1943) - [Media Player SDK .Net] Fixed:
MediaPlayerCore.OnFilterAddedwas not raised for the source filter in theFile_DSmode with a file other than WMV/ASF and noCustom_Splitter, nor for the splitter set inCustom_Splitter(File_DSandMemory_DS), nor for the source and the MIDI Parser in theMIDImode. A handler that configures the source filter now receives it in these modes too. (#1963) - [Media Player SDK .Net] Fixed:
MediaPlayerCore.DisposeAsyncafter a synchronousPlayraised a spurious "For non-async API use Stop call." error throughOnError. The player is stopped and released as before, without the error. (#1931) - [Video Capture SDK .Net] Fixed: setting
VideoCaptureCore.Debug_Dirtonullmade a later start withDebug_Modeenabled fail with anArgumentNullException; a nullDebug_Dirnow behaves like an unset one. (#1943) - [Video Edit SDK .Net] Fixed: setting
VideoEditCore.Debug_Dirtonullmade a later start withDebug_Modeenabled fail with anArgumentNullException; a nullDebug_Dirnow behaves like an unset one. (#1943) - [Core] Fixed: on .NET Framework, an application that exited while a
MediaPlayerCore,VideoCaptureCoreorVideoEditCorewas still running and never disposed could crash or hang on the way out. An undisposed engine is now left to the exiting process; dispose it before exit to stop it cleanly. (#1942) - [Video Capture SDK .Net] Fixed:
VideoCaptureCoreseparate capture inSeparateCaptureMode.SplitByDurationmade segments longer thanSeparateCapture_TimeThresholdwhen the webcam lowered its frame rate after the capture started, as it does under auto-exposure in a dim room: a 1 s segment ran for up to 3 s. Segment length now follows the frames' own timestamps. (#1936) - [Media Blocks SDK .Net] Fixed:
MediaBlocksPipeline.StopAsyncwaited about 10 seconds when stopped before a live source had delivered any data (for example anSRTSourceBlockwhose peer had not sent its first packet yet, or a listener no publisher had connected to); it now stops at once. (#1798) - [Media Blocks SDK .Net] Fixed: an
SRTSourceBlockorDecodeBinBlockwith an audio output connected to a stream that carries no audio froze the video on its first frame, and forSRTSourceBlockStopAsyncthen never returned; the output with no stream is now ended, so the video plays and the pipeline stops normally. The same now applies to an output into an MPEG-TS recording, which records the video; an output into an MP4 recording is left as it was (except the split MP4 case above), since ending it empty would leave an unplayable file. (#1798) - [Media Blocks SDK .Net] Fixed: when an input of a recording output never received a stream (for example the audio input of
MP4OutputBlockconnected to a source with no audio),StopAsyncwaited about 10 seconds or, with another live source in the same pipeline, never returned; it now returns at once and reports that the input never received a stream (throughOnErrorwhen a file is left unfinished). That recording is still not written, nor is any other file output of a pipeline it held at its first frame. (#1798) - [Core] Fixed: a
MediaPlayerCore,VideoCaptureCoreorVideoEditCoredropped withoutDisposewas never freed — it kept playing or capturing, and held its files, until the application exited. This hit everyVideoCaptureCoreand everyVideoEditCorejob, and aMediaPlayerCoreusing the legacyVideoRendererfrom a non-UI thread or a sample grabber. Once neither the application nor a video view still attached to it holds the engine, it is now stopped and released when it is garbage collected. A network source that runs its own reader, such as an MJPEG IP camera, can still keep it alive;Disposeremains the way to stop an engine at a known moment. (#1939) - [Video Edit SDK X .Net] Fixed: on a
VideoEditCoreXinstance reused for another render,Duration()returned the first timeline's length andOnProgresswas computed against it, so a longer render reached 100% early and a shorter one never got near it. (#1982) - [Video Edit SDK X .Net] Fixed:
VideoEditCoreXcould throw aNullReferenceExceptionon the GStreamer main-loop thread when playback or a render reached its end while it was being stopped or disposed. (#1898) - [Demos] The ONVIF "Connect" button in the IP camera demos now turns into "Disconnect" after a successful connect, and is enabled again after a missing login or a failed connect instead of staying stuck on "Connecting". (#1945)
2026.9.29¶
- [Demos] Live Video Compositor Demo (WPF): an RTSP source is listed under the RTSP URL actually opened, with its codec, frame size and frame rate, so an ONVIF device address shows which stream it resolved to; the RTSP dialog says that an ONVIF address is accepted, and the LOGS panel timestamps each error, scrolls to the newest one and no longer hides lines past its height. (#1890)
- [Core]
RTSPSourceSettings.CreateAsyncandVideoCaptureCoreXtreat any http or https URL as an ONVIF camera address, so a camera whose ONVIF endpoint is not at/onvif/device_service(another path, a port, different letter case) is resolved to its RTSP stream instead of failing to open. (#1922) - [Demos] The IP camera demos no longer play an ONVIF camera's first profile by default: "Connect" via ONVIF now passes the camera's ONVIF address to the SDK, which picks the best video stream (H.264/H.265 over MJPEG, then the larger frame), and a profile chosen in the list is played instead. Affects the RTSP Preview/Capture demos (WPF, WinForms, MAUI, Uno), IP Capture (X and classic, WPF, WinForms, VB.NET), the classic Main Demo and IP MJPEG Restreamer. (#1922)
- [Media Blocks SDK .Net] Changed: an ONVIF device-service URL (
http://<camera>/onvif/device_service) given toRTSPSourceSettings.CreateAsyncorVideoCaptureCoreXnow resolves to the profile with the best video stream instead of the camera's first profile, which on several cameras (for example Hanwha/Wisenet QNP-6250) is a 3 fps MJPEG stream. H.264 and H.265 rank above MPEG-4 and JPEG, then the larger frame size, then the higher frame rate; only profiles on the first profile's video input are considered. Profiles are read over ONVIF Media 2.0 when the camera offers it, so H.265 profiles are seen too; an H.265 profile is chosen only when an H.265 decoder is available (the Libav redist package or GPU decoding). The chosen profile is written to the log. (#1889) - [Media Blocks SDK .Net] New:
RTSPSourceSettings.CreateAsync(uri, login, password, audioEnabled, onvifProfile, ...)streams a specific ONVIF profile, named by its token or its name. (#1889) - [Video Capture SDK .Net] Changed: with an ONVIF URL and an empty
IPCameraSourceSettings.ONVIF_SourceProfile,VideoCaptureCorenow picks the profile with the best video stream (including H.265 profiles reported over ONVIF Media 2.0) instead of the first one;ONVIF_SourceProfilealso accepts a profile token, and a camera that does not report its frame rate is no longer assumed to run at 25 fps. SetONVIF_SourceProfileto keep a specific profile. (#1889) - [Core] Fixed: ONVIF cameras refused every authenticated request (
NotAuthorized) when the camera's clock and the computer's differ;ONVIFClientX.ConnectAsyncnow reads the camera clock and signs its requests by it. (#1889) - [Core] Fixed:
RTSPSourceSettings.CreateAsyncthrewNullReferenceExceptionfor an ONVIF URL when the camera's profiles could not be read, andONVIFClientX.GetMedia2ClientAsyncreturnednullon Media 2.0 cameras unless another call had loaded the camera's service list first. (#1889) - [Media Player SDK .Net] Fixed: a
MediaPlayerCorewhoseDisposeAsynccould not release the player (another teardown still running) was later released by the .NET finalizer, which could crash or hang the process.DisposeAsyncnow behaves asDispose()does: call it again to finish the release. The same applies to aDisposeorDisposeAsyncthat fails with an exception. (#1916) - [Media Player SDK .Net] Fixed: on .NET Framework, an application that exited without disposing a
MediaPlayerCorestill playing through the legacyVideoRenderer- started withPlayAsync, or withPlayfrom a non-UI thread - could hang on exit. That player's graph is now left alone at exit and an error is logged; callDisposeorDisposeAsyncbefore exiting. (#1934) - [Video Capture SDK .Net] Fixed: a
VideoCaptureCorewhoseDisposeorDisposeAsyncfailed with an exception, or whoseDisposeAsyncwas handed to a runningStart, could later be released by the .NET finalizer, which could crash or hang the process. CallDisposeagain to finish the release. (#1916) - [Media Blocks SDK .Net] Fixed: stopping a pipeline at the moment a
Looppass restarted or a seek was sent could produce an output file without its trailer (an MP4 with nomoov), and the stop then took about 10 seconds. (#1886) - [Media Player SDK .Net] Changed:
MediaPlayerCorewith aCustom_Splitterthat is not installed or cannot be connected now failsPlaywith "Unable to add custom splitter" (or "Unable to connect custom splitter") instead of playing through another splitter picked by DirectShow. A source file that cannot be loaded ahead of the custom splitter failsPlaywith "Unable to load source file". In theLAVandGPUmodes a missing LAV decoder now failsPlaywith "LAV Video Decoder not found" or "LAV Audio Decoder not found" instead of a generic error, and a decoder that connects with a partial-render result is no longer reported as "Unable to connect". (#1905) - [Media Blocks SDK .Net] Fixed:
FallbackSwitchSourceBlockcould not be used -StartAsyncfailed with "The method or operation is not implemented", andVideoOutput/AudioOutputwerenulluntil the pipeline built the block. The outputs now exist from construction, the pipeline starts, and the block switches to the text, image or URI fallback when the main source fails and back when it recovers. The main source (RTSP, SRT, RTMP, HTTP or NDI) is opened and decoded by the block itself, with the connection settings of its settings object (credentials, latency, transport) applied; the timeouts are now honoured as configured (the 5 s default was previously sent as a wrong value), andStaticTextFallbackSettings.BackgroundColoris applied. - [Video Capture SDK .Net] Fixed:
VideoCaptureCoreX.Audio_Source_GetInforeturned no sample rate or channel count for an RTSP, NDI or universal source that carries both video and audio - it read the video stream's format instead of the audio's. - [Media Blocks SDK .Net] Fixed:
RTSPSourceSettings.GetInfo()reported 0x0 for an MJPEG (or other) camera stream that declares its frame size only in the SDPa=framesizeattribute (for example Hanwha/Wisenet QNP-6250), and for an RTP/JPEG stream that declares it nowhere; the size is now read froma=framesize, and for RTP/JPEG from the stream's packets when the SDP has none. The same applies toRTSPRAWSourceSettingsand to RTSP URLs inUniversalSourceSettings. (#1888) - [Media Blocks SDK .Net] Fixed: RTSP stream info named no codec for a stream using a static RTP payload type without
a=rtpmap(JPEG, PCMU, PCMA, L16 and the other RFC 3551 types), and ana=rtpmapora=fmtpfor another format on the same media line - such astelephone-eventnext to PCMU - replaced the stream's own codec or size;RTSPRAWSourceBlockcould then find no depayloader for the stream. Ana=rtpmapwithout a channel count now reports one channel. (#1888) - [Media Blocks SDK .Net] Changed:
LiveVideoCompositor(V1 and V2) andLiveSourceSwitchBlock/LiveSourceSwitchBlockDynamicrefuse a video input whose frame size is unknown (a width or height of 0 in itsVideoFrameInfoX) -Input_AddAsync/Input_AddToSlotAsyncreturnfalseand the compositor raisesOnErrorwith the reason - instead of accepting it and failing when the input starts. (#1888) - [Media Blocks SDK .Net] Fixed: a
LiveVideoCompositorinput from an RTSP camera whose stream carries no frame rate of its own (for example Hanwha/Wisenet QNP-6250) stopped a few seconds after start with "Internal data stream error" (not-negotiated) and never showed; the same happened to any bridge input whose real frame rate differed from the one in itsVideoFrameInfoX. The frame rate inVideoFrameInfoXis now a preference rather than a requirement. (#1881) - [Media Blocks SDK .Net] Changed: a
LiveVideoCompositorinput, or anyBridgeVideoSinkBlock, whose frames differ in size or pixel aspect ratio from itsVideoFrameInfoXis now scaled to that size and letterboxed instead of failing with "Internal data stream error"; aVideoFrameInfoXwith no width or height is refused with an error that says so. (#1881) - [Core] Fixed: with
CustomRedist.Enabled, a DirectShow filter file in the redist folder that could not create the filter (a wrong or old version) threw an exception instead of falling back to the registered filter; it now logs the error and uses the registered one. The same applies to the GMF bridge used by separate capture, which withCustomRedist.Enablednever fell back to the registered bridge before. A filter file not found in the redist folders is now looked up in the application folder rather than the current directory, so it is found when the app runs as a service or from a shortcut with another start-in folder. (#1883) - [Core] Changed:
VisioForge.Libs.IClassFactory.CreateInstancenow returns the HRESULT instead of throwing on failure; its return value was meaningless before.LockServernow passes its flag as a Win32BOOL. (#1883) - [Media Player SDK .Net] Fixed: in memory-stream playback (
Source_Mode = Memory_DS), theOnFilterAddedevent for the LAV Splitter carried the memory source filter and the LAV Splitter Source CLSID, so a handler configuring the splitter got the wrong filter. It now carries the LAV Splitter itself. A LAV Splitter or LAV decoder that cannot be created, or a splitter that cannot be connected to the memory source, fails the play with an error instead of an exception or a graph with no streams. WithCustom_Splitterset, the memory source is demuxed by that splitter alone: the LAV Splitter is no longer added behind it, and the stream flags come fromMemoryStreamSource.IsVideoPresent/IsAudioPresent. (#1880) - [Core] Fixed:
MediaInfoReader.GetStreamAvailabilityFromMemoryStreamalways returnedfalse, even when it had found the video and audio streams. It now returnstrueon success, reports a missing LAV Splitter as an error instead of throwing, and releases the source stream on every exit path. (#1880) - [Video Capture SDK .Net] Fixed:
Dispose()orDisposeAsync()called on two threads at the same time could releaseVideoCaptureCoretwice and crash the process; only one of the two calls now releases it. (#1910) - [Media Player SDK .Net] Fixed:
Dispose()orDisposeAsync()called on two threads at the same time could releaseMediaPlayerCoretwice and crash the process; only one of the two calls now releases it. (#1910) - [Video Capture SDK .Net] Fixed: a separate capture file paused with
SeparateCapture_Pausestarted recording again when the application calledPauseand thenResumeon the capture. It now stays paused untilSeparateCapture_Resume. (#1831) - [Video Capture SDK .Net] Fixed: after
OutputFilename_ChangeOnTheFly,VideoCaptureCorewrote theTagsinto the first output file atStopand left every later file untagged; each file now gets them when it is finished. (#1896) - [Video Capture SDK .Net] Fixed: with separate capture enabled,
OutputFilename_ChangeOnTheFlyleftStopwriting theTagsinto the first file and raisingOnSeparateCaptureStoppedfor it a second time, while the file recorded last got neither; onMP4HWOutput, MOV, MPEG-TS and MKV (v2) outputs the switch could also fail with "Unable to save file". For a capture started with separate capture enabled, the call now switches files exactly asSeparateCapture_ChangeFilenameOnTheFlydoes: the capture is not stopped,OnSeparateCaptureStoppedis raised for the old file andOnSeparateCaptureStartedfor the new one, and afterSeparateCapture_Stopit starts recording the new file. (#1908) - [Video Capture SDK .Net] Changed:
SeparateCapture_Enabledis read when the capture starts. Changing it during a capture no longer switchesSeparateCapture_Start,SeparateCapture_Stop,SeparateCapture_Pause,SeparateCapture_Resume,SeparateCapture_ChangeFilenameOnTheFly,Pause,ResumeorStopbetween the separate-capture and the plain path half-way through a session; the new value applies from the nextStart. (#1908) - [Video Capture SDK .Net] Fixed: in
CustomCaptureandPushSourceCapturemodes,SeparateCapture_StartandSeparateCapture_ChangeFilenameOnTheFlyto a file name that already existed left the end of the old file inside the new recording; the old file is now deleted first, as in the other capture modes. (#1908) - [Video Capture SDK .Net] Fixed: disposing
VideoCaptureCorefrom a window close while aPause,Resume,StartDelayed,OutputFilename_ChangeOnTheFlyorSeparateCapture_*call was still running on the UI thread could crash the process; the dispose is now carried out when that call returns, and the call returnsfalse. The same call made again from inside it is refused withOnError. (#1896) - [Video Capture SDK .Net] Changed: stopping a running
VideoCaptureCorecapture -Stop,StopAsync,Dispose, or aStartthat fails - takes 300 ms less; a synchronousStopon the UI thread no longer freezes it for that extra time, and the recording now ends when the stop begins instead of about 300 ms later. (#1721) - [Media Blocks SDK .Net] Fixed:
Position_GetandDurationcalled while the pipeline was stopping - for example from a position timer when a file reached its end - could hit a released pipeline, log a GStreamerGST_IS_ELEMENTcritical or crash the process; they now return zero. (#1817) - [Video Edit SDK X .Net] Fixed:
VideoEditCoreX.Position_GetandDurationcould throwNullReferenceExceptionwhen called while the preview was stopping. (#1817) - [Core] Changed: when the Windows native redist is missing or of the wrong architecture,
VisioForgeX.InitSDK, the X-engine constructors and the other entry points that initialize GStreamer (MediaInfoReaderX,MediaBlocksPipeline) now fail with aDllNotFoundException(orBadImageFormatExceptionfor the wrong architecture) whose message names the folder the files must be in, the process architecture and theVisioForge.CrossPlatform.Core.Windows.<arch>package to add, instead of a generic "GStreamer libraries not found" log line and a bare loader error.VideoEditCoreX.SDKInitthrows instead of returningfalse. On every platform,InitSDKno longer reports success when the GStreamer libraries cannot be loaded or GStreamer itself fails to start - the loader or startup exception now reaches the caller ofInitSDKor of the constructor instead of being logged and swallowed - a thread waiting on a concurrentInitSDKgets the failure asInnerException, and a retriedInitSDKno longer grows the processPATH. (#1882) - [Core] Fixed: snapshots and
SKBitmapframes taken from BGRA video whose rows are padded - for example from a hardware decoder - came out sheared, each row shifted further than the one before;VideoSampleGrabberBlock.GetLastFrameAsSKBitmap, theOnVideoFrameSKBitmapevents,VideoRendererBlock,MediaPlayerCoreXandVideoCaptureCoreXsnapshots and the HTTP MJPEG output now honour the frame stride.DataMatrixDecoderBlockno longer misreads padded RGBA and BGRA frames. TheSkiaHelperframe conversions now throwArgumentOutOfRangeExceptionfor a frame whose stride is shorter than one row of pixels, asBitmapHelper.VideoFrameToBitmapalready did. (#1807)
2026.9.28¶
- [Media Blocks SDK .Net] Fixed: with
Loopenabled, a source that cannot seek back to the start (a non-seekable stream) leftMediaBlocksPipelineandMediaPlayerCoreXinPlayat the end of the stream -OnStopnever fired and the nextStartAsyncwas refused untilStopwas called; it now raisesOnError, stops, and raisesOnStop. (#1816) - [Media Player SDK .Net] Fixed: with the WPF
VideoView, everyMediaPlayerCorereverse-playback step (ReversePlayback_PreviousFrame,ReversePlayback_NextFrame,ReversePlayback_GoToFrame) leaked a full-size frame. (#1832) - [Media Player SDK .Net] Fixed: with the WinForms
VideoView, a reverse-playback step could show a red cross, and the last stepped frame leaked when playback resumed. (#1832) - [Media Player SDK .Net] Changed: with a video view that cannot show cached frames (WinUI, MAUI, Avalonia, Uno,
CallbackVideoView,JPEGCallbackVideoView), a reverse-playback step now raisesOnErrorsaying so; before, WinUI and MAUI reported "Unable to draw cache frame" and the others did nothing. (#1832) - [Core] Changed: a bitmap passed to
PictureBoxSetImagenow belongs to the video view, which disposes it: the WPFVideoViewright away, the WinFormsVideoViewwhen a new one is set or the picture box goes away (PictureBoxDestroy, playback or capture start, disposing the view). Pass a new bitmap each time, for example aClone()of one you keep. (#1832) - [Core] Changed:
PictureBoxGetImageon the WinFormsVideoViewnow returns a copy the caller disposes, as the WPF one already did; before, it returned the image on screen, and disposing it broke the view. On the WinUI and MAUI views it returnsnullinstead of throwing. (#1832) - [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: the AAC bitrate chosen for the hardware-encoder MKV, MP4, MOV and MPEG-TS outputs, their settings dialog and HLS network streaming was ignored - the audio track was always encoded at 128 kbps. The chosen bitrate now reaches the encoder. The MF AAC encoder is MPEG-4 AAC-LC only and AAC framing follows the container, so an explicitly set AAC version, profile or RAW/ADTS output format is reported in the log instead of being applied. (#1876, #1859)
- [Video Capture SDK .Net] [Video Edit SDK .Net] Changed: the output settings dialogs for the hardware-encoder MKV, MP4, MOV and MPEG-TS formats no longer show the AAC options (output format, version, object type, bitrate). The values were accepted but never reached the encoder - the audio track was always encoded with the defaults - so offering them only mislead. (#1859)
- [Media Blocks SDK .Net] Fixed:
LiveVideoCompositorraisedOnError"Internal data stream error" about two seconds afterStartAsync, and its audio stopped, when audio was enabled with noAudioOutputrenderer in the settings and no audio output added; the same happened to video with noVideoViewand no video output. (#1849) - [Video Capture SDK .Net] Fixed: when
OutputFilename_ChangeOnTheFly(or its Async form) was given a file name that could not be created, the file already recorded was overwritten from the start. The call now returnsfalsewith an error and the capture keeps recording to the current file; if the writer still refuses the name after the current file has been finished, the capture stays stopped untilStopis called instead of recording over it. Switching to a name that already holds a longer file no longer leaves the end of that old file inside the new recording. (#1795) - [Video Capture SDK .Net] Fixed:
OutputFilename_ChangeOnTheFly(or its Async form) called on another thread whileStop,StopAsyncorDisposewas running could start the capture again in the middle of the stop. A call already in progress now finishes before the stop tears the capture down, and one made while the stop runs returnsfalse, asPauseandResumealready do. (#1836) - [Media Blocks SDK .Net] Changed: on a
LiveVideoCompositorwith audio disabled,Output_AddAsyncnow refuses anLVCAudioOutputadded beforeStartAsync- it returnsfalseand raisesOnError- instead of accepting an output that never received anything; a running compositor already refused it. (#1850) - [Media Blocks SDK .Net] Fixed: on a running
LiveVideoCompositorwith audio disabled,Output_AddAsyncrefused anLVCVideoAudioOutput; it now records video, as it already did when added before start. (#1850) - [Media Blocks SDK .Net] Fixed: changing
AudioEnabled,AudioFormat,AudioSampleRateorAudioChannelson theLiveVideoCompositorSettingsafter theLiveVideoCompositorwas created left inputs and outputs disagreeing with the audio mixer, and turning audio on could fail the start; these settings now take effect only when the compositor is created. (#1863) - [Media Blocks SDK .Net] Fixed:
MediaBlocksPipeline.NextFramethrewInvalidCastExceptionwith an OpenGL video renderer, and returnedfalse("video renderer is null") with the video views that receive frames from the SDK - WPF, WinUI, MAUI, Avalonia software rendering, the managed Android views, iOS andCallbackVideoView; it now steps one frame on all of them. The JPEG callback view still cannot step and now raisesOnErrorsaying so. (#1804) - [Media Blocks SDK .Net] Fixed: while paused, the video views that receive frames from the SDK (WPF, WinUI, MAUI, Avalonia software rendering, the managed Android views, iOS,
CallbackVideoView) kept showing the old picture after a frame step or a seek; they now show the new frame. (#1804) - [Media Player SDK .Net] Changed: during reverse playback
MediaPlayerCoreX.NextFramesteps one frame backwards andPrevFrameone frame forwards, both keeping the reverse rate; before,NextFrameswitched playback forward andPrevFramestepped backwards and reset the rate to 1.0.MediaBlocksPipeline.NextFramealready stepped in the playback direction. (#1804) - [Media Player SDK .Net] Fixed:
MediaPlayerCoreX.NextFrameat a playback rate other than 1.0 applied the rate twice to the stepped frame (at 2.0 it was timed at 4.0), which could show as a jump or a dropped frame afterResume. (#1804) - [Core] Fixed:
Helpful_GetFrameFromFilewitholdWay: falseand theLAVengine waited about 10 seconds before returningnullfor a timestamp past the end of the file, and reported nothing; it now returns at once and raisesOnErrorwith the reason. (#1858) - [Video Capture SDK .Net] Fixed: an IP camera on the FFMPEG engine could start as if it had opened the stream when opening it - or the RTSP fallback from UDP to TCP - failed with an internal error; the start now fails and reports the cause. (#1830)
- [Video Capture SDK .Net] [Media Player SDK .Net] Fixed: the application could crash some time after the engine was stopped or disposed, or after reading media info from a stream, when the SDK filters are loaded from the redistributable files. (#1810)
2026.9.27¶
- [Video Edit SDK .Net] Removed:
MKVv1OutputfromVideoEditCore. AVideoEditCorerender toMKVv1Outputproduced a file no player could open.MKVv1Outputis no longer anIVideoEditBaseOutputandVideoEditOutputFormat.MKVv1is gone (the otherVideoEditOutputFormatvalues keep their numbers); render MKV withMKVv2OutputorVideoEditCoreX.MKVv1OutputonVideoCaptureCoreis unchanged. (#1847) - [Core] Fixed:
Helpful_GetFrameFromFilewitholdWay: false(MediaPlayerCore,VideoCaptureCore,VideoEditCore) returnednullfor video whose width is not a multiple of 4 (854×480, 1366×768 and the like), and always returnednullwith theLAVengine when LAV Filters were not installed system-wide; the LAV filters now load from the SDK redist, as in playback. A call that returned no frame also kept the file open and leaked memory. (#1837) - [Media Blocks SDK .Net] Fixed: any call that builds the Media Blocks catalog — block lookup, pipeline serialization and validation included — threw
InvalidOperationException"MediaBlockType collision: 'CustomMediaBlock' and 'VideoCompositionBlock' both report Custom". The video composition block now reports its ownMediaBlockType.VideoCompositionenum member (new value) instead of reusingCustom. (#1790) - [Video Capture SDK .Net] Fixed: with an IP camera delivering KLV metadata into an
FFMPEGOutputwithMPEG_TS_KLVand separate capture on,SeparateCapture_StartAsync,SeparateCapture_ChangeFilenameOnTheFlyAsync, automatic splitting andSeparateCapture_StopAsynccould crash the application or reportWriteKLVData failederrors. (#1720) - [Core] Fixed:
Video_Composition_EnabledwithVideo_Composition_Adddrew nothing onMediaPlayerCoreXandVideoCaptureCoreX. The added images are now drawn over the video, each at its ownX/Y(every image after the first used to land at 200, 200) and with itsWidth,Height(one side left at 0 follows the other at the image's aspect ratio) andAlpha(Alphanow defaults to 1, opaque), images added or removed during playback show up on the next frame, and the images now stay untilVideo_Composition_Remove/Video_Composition_Clearor disposal instead of being dropped by everyOpenAsyncandStop— which also dropped images added beforeMediaPlayerCoreX.OpenAsync. New:VideoCompositionElementtakes anSKBitmap, so video composition works on macOS, Linux, Android and iOS too — outside WindowsVideo_Composition_Addused to do nothing,Video_Composition_Addnow throwsArgumentExceptionfor an element with no image it can draw, andInvalidOperationExceptionfor an element already added to another engine — create one element per engine. (#1790) - [Core] Fixed: the BDA source leaked COM references — starting it again on the same
DSBDASourceinstance leaked the previous video decoder, and a start on a service with no video (radio) kept the capture graph builder alive until finalization. (#1838) - [Media Player SDK .Net] Fixed: video whose width is not a multiple of 4 (854×480, 1366×768 and the like) failed to play with
Video_Effects_Enabled, and withVideo_Sample_Grabber_UseForVideoEffectsor anOnVideoFrameBuffersubscriber it delivered sheared frames, in the LAV, GPU, memory and Blu-ray source modes. A LAV decoder chosen by name (Custom_Video_Decoder) or picked by DirectShow inFile_DSmode is not affected. The LAV Video Decoder the SDK adds now runs on LAV's default settings instead of the ones in the registry, and the SDK no longer writes its own settings there, where they changed LAV's behaviour in other applications. (#1825) - [Video Capture SDK .Net] Fixed: H264, HEVC and MJPEG cameras, IP cameras and BDA tuners decoded by LAV delivered sheared frames to
OnVideoFrameBufferand video effects when the width was not a multiple of 4, or failed to build the graph with video effects on. A decoder chosen throughMPEGVideoDecoderis not affected. The LAV Video Decoder the SDK adds now runs on LAV's default settings instead of the ones in the registry. (#1825) - [Core] Fixed: after the first
Stop,VideoCaptureCoreX,MediaPlayerCoreXand Live Video Compositor stopped raisingOnError— errors reported between sessions (a failedStart, device or licence errors) were dropped silently, and withDebug_Modeon the component's own log file stopped receiving entries as soon as the first session was built. Live Video Compositor lost them from the first added input or output. Errors raised while aVideoCaptureCoreXorMediaPlayerCoreXsession runs now follow the engine's own rule too: with noOnErrorhandler andDebug_DisableMessageDialogsoff, they are shown in the video view's error log window. (#1803) - [Media Player SDK .Net] Fixed: reverse-playback frame stepping in
MediaPlayerCorecould show a frame with skewed or garbage bottom rows, report a misleading "Unable to draw cache frame" for a negative frame number inReversePlayback_GoToFrame, or fail when frame stepping ran while playback was still caching frames; a negative frame number is now reported as such, and turningReversePlayback_Enabledoff during playback releases the cache memory. - [Video Capture SDK .Net] Fixed:
SeparateCapture_Resumecould returntruealthough nothing more was recorded into the separate-capture file. When recording cannot continue it now returnsfalsewith an error, and the file recorded up to the pause is finished and reported throughOnSeparateCaptureStopped(MP4_HW,MPEGTS,MOVandMKVv2stay paused instead).SeparateCapture_PauseandSeparateCapture_Resumenow returnfalsewhen no separate-capture file is recording (afterSeparateCapture_Stop, or before the first one starts) instead of restarting the stopped recording or making the nextSeparateCapture_Startfail, andPause()/Resume()no longer touch a separate capture that is not recording. (#1739) - [Video Capture SDK .Net] Fixed:
Pause(),Resume()orStartDelayed()(and their Async forms) called from another thread whileStop(),StopAsync()orDispose()was running could pause or run the capture graph again after the stop had stopped it. Such a call now returnsfalsewith the error "The capture is stopping", and the stop finishes normally. AStop()made from a handler that runs on the same thread while one of these calls (or aSeparateCapture_*call) is still in progress now returns at once; that call stops the capture before it returns and then returnsfalse. (#1727) - [Core] Fixed: a failed tag read logged the hint "ReadTags failed. Be sure that file extension is correct." twice; it is logged once now, right after the exception itself.
- [Core] Fixed: a picture decode failure while reading tags was silent — the embedded pictures were dropped from the result with nothing in the log; the failure is logged now.
- [Media Blocks SDK .Net] Fixed: when a file ended at the same moment the pipeline was being stopped, a
NullReferenceExceptioncould be thrown and the stop then waited for its timeout instead of completing. - [Media Blocks SDK .Net] Fixed: with
PauseOnStop, stopping right as the file ended could report a spuriousOnError, and a quickStopand restart could pause the new playback on its own. - [Media Blocks SDK .Net] Fixed:
Close()called while the pipeline was recovering from an error or pausing at the end of the file could crash the application. - [Media Blocks SDK .Net] Fixed: MISB ST 0601 mapped elements with 1- or 2-byte payloads (platform heading, pitch and roll angles, air temperatures, flags and the like) decoded to zero or the bottom of their range instead of the real value; the 1- and 2-byte fixed-point forms are now decoded like the 4- and 8-byte ones.
- [Media Blocks SDK .Net] Fixed: an
OnErrorhandler that waited on the UI thread (Dispatcher.Invoke,Control.Invoke) could deadlock the application when the error came from a seek, a rate change, a frame step or a Loop restart while the UI thread was itself callingPosition_Set,Position_SetRangeorRate_Set. Applies toMediaPlayerCoreXtoo. - [Media Blocks SDK .Net] Fixed: MISB ST 0601 tags 73 and 74 (RVT Local Data Set and VMTI Local Set) always decoded to a null value regardless of the payload bytes; they now return the raw local-set bytes. Both classes now derive from
BytesElementParserinstead ofMappedElementParser, so their unusedDomain/Range/Errormembers are gone. - [Media Blocks SDK .Net] Fixed: in 32-bit applications (x86 Windows, armv7 Android), video frames passed to
BufferSinkBlock.OnVideoFrameBuffercould carry wrong strides and plane offsets, and frames from the Android camera source showed wrong colour planes. - [Media Blocks SDK .Net] Fixed: planar frames passed to
BufferSinkBlock.OnVideoFrameBufferreported every plane offset as 0 when the frame carried no video metadata, so code that located the U and V planes throughOffsetsread the Y plane instead. - [Media Blocks SDK .Net] Fixed:
PlaneCountwas always 0 on frames passed toBufferSinkBlock.OnVideoFrameBuffer. - [Media Blocks SDK .Net] Fixed: frames passed to
VideoSampleGrabberBlock.OnVideoFrameBuffercarried noStrides,OffsetsorPlaneCount, so the planes of an I420 or NV12 frame could not be located. - [Media Blocks SDK .Net] Fixed:
VideoSampleGrabberBlock.OnVideoFrameBufferreported the stride implied by the caps even when the frame's video metadata described padded rows (as hardware decoders produce), so such frames were read with the wrong row length. - [Media Blocks SDK .Net] Fixed: a frame without a timestamp reached
VideoSampleGrabberBlock.OnVideoFrameBufferwith aTimestampof about 585 years; it is now zero, as inBufferSinkBlock. - [Media Blocks SDK .Net] Fixed: an audio buffer without a timestamp reached
AudioSampleGrabberBlock.OnAudioFrameBufferwith aTimestampof about 585 years; it is now zero. - [Core] Fixed:
VideoFrameX.Cloneof a planar frame (I420, NV12 and the like) wrote past the end of the new frame's buffer, which could corrupt memory or crash the application; it now allocates the whole frame. - [Core] Fixed:
VideoFrameX.CopyFrominto a frame of a different size left the copy with zero width, height and stride. - [Core] Fixed:
VideoFrameX.Clone,CopyFrom,CopyInfoToandCopyInfoFromdid not copyStrides,OffsetsandPlaneCount, so a copy of a planar frame lost its plane layout. - [Core] Changed:
VideoFrameX.Freenow also clearsStrides,OffsetsandPlaneCount. - [Video Capture SDK .Net] Fixed: with separate capture on
FFMPEGOutput,SeparateCapture_StartAsync,SeparateCapture_ChangeFilenameOnTheFlyAsyncand automatic splitting crashed the application. - [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: the application could crash when HLS network streaming was rebuilt, when the video resize filter was removed, when an RTSP source fell back to TCP, after enumerating audio input devices, after
DirectShow_Filter_GetVideoFormats/DirectShow_Filter_GetAudioFormats, or after the NVENC availability check, when the SDK filters are loaded from the redistributable files. - [Video Capture SDK .Net] Fixed: an RTSP IP camera on the FFMPEG engine left an unused source filter behind every time it fell back from UDP to TCP - in the capture graph, and with a forced frame rate also a whole internal graph. Only the TCP source is kept now.
- [Video Capture SDK .Net] [Media Player SDK .Net] [Video Edit SDK .Net] Removed:
DSContext.DLLCache. The SDK no longer records the filter DLLs it loads there. - [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: a failure to write tags to the finished output file (for example, the file held open by another process) was silent - no log entry, no error, and the file was simply left without tags. The failure is now reported to the SDK log.
2026.9.26¶
- [Media Blocks SDK .Net] [Media Player SDK .Net] Fixed: after reverse playback, switching back to a forward rate stopped playback at the point where reverse playback began instead of at the end of the media or of the playback range;
MediaPlayerCoreX.PrevFramehad the same defect, and after itRate_Getstill reported the reverse rate although playback resumed forward.SetRateon the renderer and sink elements used on their own now plays forward to the end of the media, and the OpenGL renderer's returnsfalsewhen the rate change is refused. - [Media Blocks SDK .Net] Changed:
VideoRendererBlock.SetRatein a pipeline is nowMediaBlocksPipeline.Rate_Set— it changes the rate of every branch of the pipeline, not only the one feeding that renderer, keeps the playback range, stores a rate set before playback starts, andRate_Getreports it. Outside a pipeline it still seeks through the renderer. - [Media Blocks SDK .Net] [Media Player SDK .Net] Fixed: reverse playback ignored the start of a playback range (
Position_SetRange,StartPosition, orMediaPlayerCoreX.Segment_Start) and played back to the beginning of the media. It now ends at the range start; on AVI files with widely spaced keyframes it can end at a keyframe before reaching it, as Loop passes in reverse already did. - [Core] Fixed:
Gst.Video.VideoInfo.FromCapsandGst.Audio.AudioInfo.FromCapswrote a whole info structure over the caller's stack on every call, which could crash the application or silently corrupt its state. Both now always return an info that the caller disposes; its fields are valid only when the method returnstrue. - [Media Blocks SDK .Net] Fixed:
MQTTOutputBlockpublished no JPEG frames — encoded JPEG reaches the block as a data frame, which it ignored, so a camera-to-MQTT pipeline ran without error and the broker received nothing. JPEG frames are now published, one at a time: a frame that arrives while the previous one is still being sent is skipped, so a slow broker receives fewer frames rather than a growing backlog. A broker that disconnects mid-stream is reported throughOnErroronce per outage, instead of terminating the application. - [Media Blocks SDK .Net] Fixed:
MQTTOutputBlockpublished duplicate JPEG frames after a pipeline rebuild. - [Core] Fixed:
GIFDecoder.IsAnimatedreportedtruefor a still, single-frame GIF. It is nowtrueonly for a GIF with more than one frame, so a still GIF used as an image logo onVideoCaptureCore,MediaPlayerCoreorVideoEditCoreis drawn as an ordinary image.AnimatedGIFSourceBlockstill plays a still GIF, as a still picture. - [Media Blocks SDK .Net] Fixed:
SubtitleSourceBlockcould not open SubRip (.srt) or WebVTT (.vtt) files — the pipeline failed to start with "Unable to create some pipeline elements". Both formats are now read, as documented. Standalone SSA/ASS files, which GStreamer cannot parse on their own, are now reported byIsAvailableas unsupported and refused with a clear error; the documentation no longer lists them. - [Core] Fixed:
ColorspaceConverter.RGBToRGBAwith abyte[]source did not pin the array while reading it, so a garbage collection during the conversion could produce a corrupted image or an access violation. - [Core] Fixed: ONVIF
Discovery.Discover(timeout)could return a list missing a camera that answered near the end of the timeout, and could corrupt the list when several cameras answered at once.Discoverwith a callback now completes only after every callback has returned. - [Core] Fixed:
BitmapHelper.VideoFrameXToBitmapswapped red and blue for RGB and RGBA frames and rejected BGRA and ARGB frames. It now converts likeVideoFrameToBitmapandToBitmap. - [Core] Changed:
BitmapHelper.RAWImageToBitmapandRAWVideoFrameToBitmapnow applyhorizontalFlip, which they used to ignore. Code that passedtrueand relied on an unflipped result should passfalse. - [Core] Fixed:
BitmapHelper.VideoFrameToBitmap,VideoFrameXToBitmap,ToBitmap,RAWImageToBitmapandRAWVideoFrameToBitmapproduced a skewed image for a frame whose rows are padded or packed tighter than 4-byte alignment (for example an RGB frame of odd width). The frame's own stride is now honoured. A stride shorter than one row of pixels throwsArgumentOutOfRangeException, and a frame whoseDataSizeis smaller than its rows is converted up to the rows it holds, instead of reading or writing past the frame buffer. - [Video Edit SDK .Net] Fixed: with an RGB32 source, video frames carried the stride of the 32-bit frame instead of the 24-bit one, and the frame buffer could be overrun, which could corrupt the picture passed to
OnVideoFrameBufferor crash the application; a later clip with a larger frame could also overrun it. - [Media Blocks SDK .Net] Fixed: returning an empty list from
UniversalTransformBlock.OnTransformFramesent an unfilled frame downstream instead of dropping the input frame. The frame is now dropped, as documented. - [Media Blocks SDK .Net] Fixed: a
UniversalTransformBlockwhose caps leave out the format or size (for example"video/x-raw") failed to negotiate with the next block, and two such blocks with different caps in one application interfered with each other. The output caps now describe only what the transform changes — every field they leave out is taken from the input, and from a list or range the value nearest to the input's is chosen — and each block uses only its own caps. An output frame larger than the input frame (for example RGB to RGBA) is no longer cut short. Input that does not match the block's input caps is now refused during negotiation instead of reachingOnTransformFrame, and caps that cannot be parsed fail the pipeline start with an "Invalid caps" error. - [Media Player SDK .Net] Fixed:
MediaInfoReader.IsFilePlayablecould returnfalsewitherrorCodeset toOKand noerrorText. A refused file now always reports an error code and a message. - [Video Capture SDK .Net] [Media Player SDK .Net] [Video Edit SDK .Net] Fixed: an animated GIF image logo crashed the application with the
LetterboxorCropstretch mode, was drawn garbled withStretch, was resized again on every video frame, and showed each GIF frame one frame early. Every stretch mode now draws the logo at the size it promises, resized once. - [Media Blocks SDK .Net] Fixed: Data Matrix results reported placeholder geometry —
Cornerswere always (0,0)-(100,100) andSymbolInfo.Rows/Colswere 0 whatever was detected, so a frame drawn around a detected code landed in the wrong place.DataMatrixDecoderEventArgsandDmtx.Decodenow report the symbol's real corners in image pixels, its size, codeword counts and angle, andDmtx.Encodereports the symbol size in modules instead of the bitmap size in pixels. - [Core] Fixed:
Dmtx.Encodefailed with "Failed to get encoded image" in 32-bit (x86) applications. - [Media Blocks SDK .Net] Fixed:
UniversalSourceBlockMinithrew aNullReferenceExceptionon the streaming thread when a file had an audio or video track whose output was not connected. That track is now ignored. (#1769) - [Video Capture SDK .Net] Fixed: a
SeparateCapture_Startthat failed while separate capture was paused madeSeparateCapture_Resumereturntruewithout resuming theMP4_HW,MPEGTS,MOVorMKVv2recording, and an automatic split could then resume it on its own. A start refused before the file is switched (the output file cannot be created, or the encoder refuses the new file) now leaves the recording as it was - still paused, and with its next split by duration still on time. (#1738) - [Video Capture SDK .Net] Fixed:
SeparateCapture_Startreturnedtrueand raisedOnSeparateCaptureStartedwhen the AVI, MKVv1, WMV, WMA, DV, PCM_ACM, MP3, Custom, WebM or MP4 writer was missing or refused the new file name, although nothing was written to it. It now returnsfalsewith an error, asSeparateCapture_ChangeFilenameOnTheFlyalready did. (#1738) - [Video Capture SDK .Net] Fixed: with a
CustomOutputwhose mux filter writes the file itself (no separate file writer), a new file name never reached the mux -SeparateCapture_Startreturnedtrueand kept writing the previous file,SeparateCapture_ChangeFilenameOnTheFlyreturnedfalse, andOutputFilename_ChangeOnTheFlyreported "Unable to change file name on the fly" and kept writing the old file. The new name is now given to the mux. (#1738) - [Video Capture SDK .Net] Fixed: with the
M4Aoutput,SeparateCapture_StartandSeparateCapture_ChangeFilenameOnTheFlyalways failed with an unsupported-format error, andOutputFilename_ChangeOnTheFlyreported "not implemented" and kept writing the old file. All three now switch to the new file. (#1738) - [Video Capture SDK .Net] Fixed:
OutputFilename_ChangeOnTheFlyreturnedtruewhen the writer refused the new file name, and for an output that cannot change its file it stopped and restarted the recording before refusing. It now returnsfalsein both cases, and refuses the second one without touching the recording. (#1738) - [Core] Added:
Debug_NativeCriticalsonMediaPlayerCoreX,VideoCaptureCoreX,VideoEditCoreX,SimplePlayerCoreXandMediaBlocksPipeline, for diagnosing random native crashes. A GStreamer/GLib critical (a native call that failed a sanity check, typically an object used after release) does not throw, and can precede an uncatchableExecutionEngineExceptionorAccessViolationExceptionelsewhere. With the property on, every critical is written immediately, with the .NET call stack that raised it (during a burst, for the first 20 each second), to agstreamer_criticals_*.txtfile inDebug_Dir, and is reported throughOnError. Off by default; it costs nothing while no critical is raised. (#1759)
2026.9.25¶
- [Media Player SDK .Net] Fixed: with audio playback off (
Audio_Play = false, or noAudio_OutputDeviceset),MediaPlayerCoreXraisedOnErrorwith "Internal data stream error" when a file opened withUniversalSourceSettingsorStreamSourceSettingsthat has an audio track reached its end after a seek, and withLoop = trueit stopped looping. The same applied to the video track withVideo_Play = false, and to a subtitle track opened withrenderSubtitle: true. In Media Blocks,UniversalSourceBlockandDecodeBinBlockno longer feed a stream into an output no block is connected to. (#1702) - [Video Capture SDK .Net] Fixed: with
SeparateCapture_GMFModeoff, separate capture did not record the camera picture,SeparateCapture_StopraisedOnSeparateCaptureStoppedwhile the file kept growing, andStop()/StopAsync()could hang. The recording now stops whenSeparateCapture_Stopreturns. This mode needs theVisioForge.DotNet.Core.Redist.VirtualCamerapackage. (#1737) - [Media Blocks SDK .Net] Fixed: Data Matrix codes were not detected from camera or file frames — the decoder told libdmtx the pixels were 3 bytes per pixel while every frame bitmap it receives is 4 bytes per pixel, so the symbol image was garbled and no code was ever found. The correct 32-bit pack order is now used, and Data Matrix detection works end to end, including the
DataMatrixDecodermedia block and theDmtx.DecodeAPI. - [Core] Fixed: KLV
DateTimeValue.Bytes()encoded a timestamp as little-endian .NET ticks while decoding reads MISB ST 0601 big-endian microseconds, so an encoded value parsed back to a different instant. Encoding now writes big-endian microseconds since the Unix epoch, matching the decoder and the ST 0601 wire format. (#1753) - [Core] Fixed: converting a
System.Drawing.RectangletoVFRectIntland back withVFRectHelperinflated the rectangle's width and height by the origin offset —ToRectangle()passed theRight/Bottomcoordinates whereRectangleexpects width and height, so aRectangle(10, 20, 30, 40)came back asRectangle(10, 20, 40, 60). It now converts coordinates to size, and the round trip is value-preserving. - [Video Capture SDK .Net] Fixed:
VideoCaptureCorecould freeze when an error was raised on the capture thread whileStop()was running on the UI thread, for example becauseOnVideoFrameBitmapthrew during the stop. The error is now reported on the UI thread beforeStop()returns. (#1733) - [Video Capture SDK .Net] Fixed:
DisposeAsync()on the UI thread, while a stop was already running, could freeze the UI for 10 seconds and then release the capture before that stop had finished. (#1719) - [Media Player SDK .Net] Fixed: a playback rate set on
MediaPlayerCoreXdid not survive pausing at the end of the file (PauseOnStop) and then resuming, andRate_Setwhile playback was parked there failed. The rate now stays for that replay, including one set while parked. After the file ends or afterStop, the next play is at normal speed andRate_Getreports 1.0. A reverse rate is not carried into that replay unless a start position is set before it; without one,Rate_Getreports 1.0 while playback is parked. A rate set after the file has ended is rejected; set it again after opening the media. (#1698) - [Video Capture SDK .Net] Fixed: with separate capture on
MP4HWOutputorMKVv2Output, an automatic split by duration reportedencoder is nullonOnErrorand dropped those frames, and could crash while switching to the next file. (#1714) - [Media Blocks SDK .Net] Fixed:
GetVideoStreamInfo()logged an error on every call made before the video stream became active - for example while a source was still connecting, or after it failed to open. Returningnullthere is the documented behavior; it now logs at debug level instead, and an error is kept only for a malformed caps structure. Applies toVideoRendererBlock, the renderer buffer sink,VideoSampleGrabberand the LUT processor. (#1740) - [Media Blocks SDK .Net] Fixed:
Stop()/StopAsync()could crash the process while removing the pipeline's bus handlers if the native bus had already been destroyed. Unsubscribing the handler is ignored once that object is gone. - [Media Blocks SDK .Net] Added: software rendering mode for the Avalonia
VideoView- callSetNativeRendering(false)on the view before starting the pipeline and the video renders into aWriteableBitmapinside the Avalonia visual tree instead of a native child window. The video is then clipped and overlapped like any other control: panels and buttons can draw on top of it, and it clips correctly inside aScrollViewer. Native window embedding remains the default; software mode trades a CPU copy per frame for full layout integration. On WSLg, where native child-window embedding fails, software mode renders normally. - [Core] Fixed: an expired license, or one that does not cover this SDK build, stopped capture, playback and editing with the reason only in the log. The reason is now shown on the video view and written to the debug trace, as an expired trial already is. A license whose edition is too low now names the edition that is required and the feature that required it. The Live Video Compositor no longer reports a license that does not cover this build as an expired certificate. (#1744)
2026.9.24¶
- [Video Capture SDK .Net] Fixed: with the
FFMPEGoutput,SeparateCapture_StartandSeparateCapture_ChangeFilenameOnTheFlyreported success, and raisedOnSeparateCaptureStarted, for a file nothing was writing when the output could not be rebuilt for it - they now returnfalsewith an error. With any output,SeparateCapture_Startnow also returnsfalsewhen the separate-capture graph cannot be run or bridged. WithSeparateCapture_GMFModeoff,SeparateCapture_ChangeFilenameOnTheFlyon theFFMPEGoutput now records the new file instead of reporting a switch that recorded nothing.Start()/StartAsync()with theFFMPEGoutput now fail when the video cannot be connected to the encoder, instead of starting without recording. (#1718) - [Media Blocks SDK .Net] Fixed: with
Loopenabled and bothStartPositionandStopPositionset, playback froze at the stop position -OnLoopnever fired and the loop never restarted. WithoutLoopthe pipeline now stops withOnStopat the stop position, as it does at the end of the file. The first pass of such a range now starts exactly atStartPosition, like every loop pass, instead of at the keyframe before it.Position_SetRangewithseekToKeyframe: truealso ends at its stop position the same way. (#1704) - [Media Blocks SDK .Net] Fixed: with
Loopenabled, later passes did not repeat the range the playback was set to - afterPosition_SetRangethey started from the beginning instead of the range start, and aStopPositionreplaced the range's stop. Every pass now plays the last range set byPosition_SetRangeor byStartPosition/StopPosition;Position_Setdoes not change the range later passes play. AStopPositionset withoutStartPositionnow applies from the first pass (playing from the beginning), not only from the second. (#1706) - [Media Blocks SDK .Net] Fixed: with
Loopenabled, assigningStartPositionorStopPositionduring playback could let one pass read a half-written value - starting at the wrong position, or playing to the end of the file instead of stopping at the stop position, with no error reported. (#1734)
2026.9.23¶
- [Video Capture SDK .Net] Fixed: a separate-capture call made from another thread while the capture was stopping could restart the recording the stop had just ended, and
Stop()/StopAsync()then never returned -SeparateCapture_Start,SeparateCapture_Stop,SeparateCapture_Pause,SeparateCapture_ResumeandSeparateCapture_ChangeFilenameOnTheFlynow returnfalsewith an error until the stop has released the graphs, andPause()/Resume()returnfalsewhen their separate-capture step is refused this way. Calls from anOnStophandler still work. (#1724) - [Video Capture SDK .Net]
Stop(),StopAsync()andDispose()now raiseOnSeparateCaptureStoppedand write the tags for the separate-capture file still recording, so the last file is reported without aSeparateCapture_Stopcall. A fileSeparateCapture_Stopalready reported is not reported again. (#1724) - [Video Capture SDK .Net] Fixed: with separate capture split by duration or file size, an automatic split that coincided with
SeparateCapture_Stopcould start recording a new file after the stop had returned - that file was never reported as stopped or tagged. An automatic split that coincided withSeparateCapture_Pauseno longer resumes the recording, and one that coincided withSeparateCapture_ChangeFilenameOnTheFlyno longer cuts the new file short. (#1703) - [Media Blocks SDK .Net] Fixed:
SRTSourceSettings.CreateAsync(andMediaInfoReaderXon a source that reports itself live, such as SRT or UDP) reported no video for a live MPEG-TS whose PMT lists a stream that never carries data, soSRTSourceBlockandVideoCaptureCoreXshowed nothing - the probe now reports the streams that deliver data. On such a stream the probe takes about 20 seconds. A live source that delivers no audio or video data during the probe is now reported as a failure byMediaInfoReaderX- so theCreateAsyncof source settings that probe through it throws - instead of as a success with no streams. (#1717) - [Media Blocks SDK .Net]
MediaInfoReaderXon a live source reports a subtitle stream that carries no data during the probe (read from the container) instead of waiting it out, and fails at once, rather than after 10 seconds, on a live stream nothing can identify. (#1717) - [Media Blocks SDK .Net] Fixed: a
MediaInfoReaderXopened more than once kept the streams of the earlier files inInfo- each open now reports only its own file. (#1717) - [Video Capture SDK .Net] Fixed: stopping a separate capture whose output had failed to start could leave the capture device and graph held - the stop logged an error and returned without releasing them, so the camera could stay busy after the stop. The stop now always releases them. A separate-capture pause that fails now leaves the recording running rather than reporting it as paused. (#1690)
- [Video Capture SDK .Net] Fixed: with the redist from NuGet, a synchronous
Dispose()from the UI thread while a separate capture was recording afterStartAsyncloggedUnable to cast COM object ... IGMFBridgeController ... E_NOINTERFACE- for example when the window closes. Separate-capture pause, resume and stop called from another thread than the one that started the capture no longer fail the same way. (#1690) - [Video Capture SDK .Net] Fixed: with separate capture split by duration or file size,
OnSeparateCaptureStoppednamed the file that was just starting, and the finished file never got its tags - the event and the tags now go to the finished file, once it is closed. (#1696) - [Video Capture SDK .Net] Fixed: separate capture split by file size did nothing without a
VideoView, and with the FFMPEG output automatic splitting stopped after the first split. (#1696) - [Video Capture SDK .Net] Fixed:
SeparateCapture_ChangeFilenameOnTheFlyreported success for a switch that failed, including with aVideoViewattached - it now returnsfalse, and a switch refused before the current file is closed keeps recording to it. (#1696) - [Video Capture SDK .Net] Fixed:
OnSeparateCaptureStoppedcould be raised twice for one file - callingSeparateCapture_Stopagain no longer reports and tags the same file a second time. (#1709) - [Video Capture SDK .Net] A file switch made while separate capture is paused keeps it paused until
SeparateCapture_Resume, except with theMP4_HW,MPEGTS,MOVandMKVv2outputs, where a switch always resumes recording. (#1696) - [Video Capture SDK .Net] An exception thrown by an
OnSeparateCaptureStoppedorOnSeparateCaptureStartedhandler, or by the tag write, is now logged instead of making the separate-capture call returnfalse. (#1696) - [Video Capture SDK .Net] The
AnimatedGIFoutput and DirectCapture from a device cannot switch files:SeparateCapture_ChangeFilenameOnTheFlyreturnsfalsefor them, and automatic splitting logs a warning at start. WithAnimatedGIF,SeparateCapture_Startaccepts onlyOutput_Filename, once per capture. (#1696) - [Video Capture SDK .Net] With DirectCapture from a device, which records
Output_Filenamefor the whole capture,SeparateCapture_Startfor another file andSeparateCapture_Stopreturnfalseinstead of reporting a file finished while it is still written; the capture's own stop raisesOnSeparateCaptureStoppedand writes the tags for that file. (#1696) - [Media Player SDK .Net] Fixed:
MediaPlayerCoreX.Rate_Setcalled afterOpenAsyncbut before playback failed withUnable to set the playback rateand the rate was lost - the rate is now stored and applied when playback starts, andRate_SetbeforeOpenAsyncnames the reason in its error. (#1692) - [Media Player SDK .Net] Fixed: a playback rate set with
MediaPlayerCoreX.Rate_Setdropped back to normal speed on everyLooppass and afterPosition_Set, whileRate_Getstill reported it - the rate is now kept across loops and seeks, including theStartPositionseek at playback start. (#1697) - [Media Blocks SDK .Net] Changed:
BlockPipelineContext.Rateis now a read-only property (it was a writable field). Assigning it changed the value the pipeline re-applies on its next seek without changing the playback speed; useMediaBlocksPipeline.Rate_Setto change the rate. Code compiled against the field must be recompiled. (#1697) - [Media Blocks SDK .Net] Fixed:
MediaBlocksPipeline.Rate_Setcalled beforeStartAsync, or right after it before the pipeline had started playing, failed withUnable to retrieve current positionand the rate was lost - the rate is now stored and applied when playback starts, from the source's start position if one is set.Rate_Setnow rejects a zero, NaN or infinite rate with an error instead of passing it to GStreamer, and a PauseOnStop replay now plays at the forward rate that was set rather than at normal speed. (#1699) - [Video Capture SDK .Net] [Media Player SDK .Net] [Video Edit SDK .Net] Fixed: the WinForms and WPF
VideoViewerror log dialog did not open when an engine reported an error, and the WinFormsVideoViewlogged a spurious error when playback stopped before the view was shown - the dialog now opens on the UI thread, reopens on the next error after the user closes it, and a stop on a view with no window is ignored. (#1691) - [Media Blocks SDK .Net] [Media Player SDK .Net] [Video Capture SDK .Net] Fixed:
DecodeBinBlockandSRTSourceBlockshowed no video, with no error, on a live MPEG-TS stream whose PMT lists a stream that never carries data (for example an audio PID a device announces but never sends). They now decode with GStreamer'sdecodebin3, which does not wait for such a stream. So doStreamSourceBlockWithDecoder,DecryptorPlayerBlock,MediaPlayerCoreXplaying aStreamSourceSettingsstream, andVideoCaptureCoreXcapturing from SRT. To restore the previousdecodebin, set the newUseLegacyDecodeBinproperty: onDecodeBinBlock,StreamSourceBlockWithDecoderorDecryptorPlayerBlock, onSRTSourceSettingsfor SRT (not read withFallbackSwitchenabled, which takes a different source), or onStreamSourceSettingsforMediaPlayerCoreX.DecodeBinBlock.GetElement()andSRTSourceBlock.GetElement()now return adecodebin3element: code that setsdecodebin-only properties or connects itsautoplug-*signals must setUseLegacyDecodeBin.
2026.9.22¶
- [Media Blocks SDK .Net] Fixed: a block added to a running pipeline with
AddBlockLive/ConnectLive/SyncBlockStateLivecould stop the data flow whileSyncBlockStateLivereported success - affected the OpenGL effect blocks (GLResizeBlockand the rest of theGL*Blockeffects), the H264 encoder, video resize, and file output blocks such asMP4SinkBlock(a live-started recording ended without a playable file). Every element of such a block is now started together with it. (#1688) - [Video Capture SDK .Net] [Media Player SDK .Net] Fixed: an engine finalized without
Dispose()logged anErrorfor every dropped instance, even one that was never started - an app creating many players or capture objects and dropping them could flood the log with identical errors. An instance that had a graph or a start in flight still logs theError; one that never started now logs aWarning, and both messages name the source file or capture device to help locate the dropped instance. (#1680) - [Video Capture SDK .Net] [Media Player SDK .Net] [Media Blocks SDK .Net] Fixed: removing a video effect from a running capture could freeze the preview until the capture was restarted - most often at 1080p with a USB camera, with another effect still applied, and logged as
the pipeline did not return to Playing. Video effects are now added and removed while the pipeline keeps playing, without pausing it. (#1673) - [Media Blocks SDK .Net] Fixed:
StopAsync()on the Live Video Compositor, Live Video Compositor V2 and Live Source Switch reported "Unable to stop ... pipeline" errors for pipelines that were not running — for example when stopping after a failed start (such as an expired trial), calling stop a second time, or when two stops overlapped. Stopping a pipeline that is not running is now handled quietly. (#1676) - [Media Blocks SDK .Net] Fixed: the OpenGL video effect blocks (
GLResizeBlock,GLGrayscaleBlock,GLShaderBlock, and the rest of theGL*Blockeffects) failed to link when placed between regular system-memory video blocks - the pipeline reported a bareNoformaterror and never started. The blocks now upload frames to the GPU and download the result back internally, so they work between any video blocks, and non-RGBA input formats (NV12, BGRx) that previously failed even with explicitGLUploadBlock/GLDownloadBlockare supported. The explicit blocks remain optional, not required. (#1677) - [Video Capture SDK .Net] [Media Player SDK .Net] [Video Edit SDK .Net] Fixed: when a DirectShow filter had no redist file name for the running architecture, creating it threw
ArgumentNullException(Parameter name: path2) instead of reporting the deployment problem. The engine now logs the usual "Unable to create filter (from file) ... Please check Deployment" error, as it does when the file exists but cannot be loaded. (#1678) -
[Media Blocks SDK .Net] Fixed: an app using the HTTP MJPEG live sink (
HTTPMJPEGLiveSinkBlock) crashed when a browser client disconnected — for example, when the page showing the stream was refreshed. The whole process terminated withSystem.ObjectDisposedExceptioninstead of just dropping the stale connection; the server now logs the disconnect and keeps serving new viewers. (#1675) -
[Video Capture SDK .Net] [Media Player SDK .Net] [Video Edit SDK .Net] Fixed: with the EVR or VMR-9 video renderer, a resize,
Video_Renderer_Update()or video adjustment (ProcAmp) call made while a capture or playback was restarting could logCOM object that has been separated from its underlying RCW cannot be used. Such a call is now skipped quietly while the renderer is being rebuilt; the video position and size are applied when the restart completes. (#1560) - [Video Capture SDK .Net] [Media Blocks SDK .Net] [Video Edit SDK .Net] Improved: when an Intel Quick Sync (QSV) encoder cannot be created on Windows, the error now names the encoder and the package that provides it -
VisioForge.CrossPlatform.Core.Windows.Intel.x64(or.x86) - instead of a bareUnable to create H264 encoder.(#1670) - [Demos] The WPF demos that offer QSV encoders now reference
VisioForge.CrossPlatform.Core.Windows.Intel.x64, so selecting "QSV H264" records instead of failing withUnable to create H264 encoder.(#1670) - [Video Capture SDK .Net] [Media Player SDK .Net] [Video Edit SDK .Net] Fixed: with
VideoRendererMode.VideoRenderer- the legacy DirectShow Video Renderer - the hosting window could not be made always-on-top while video played: settingForm.TopMost(or callingSetWindowPoswithHWND_TOPMOST) reported success and changed nothing. (#1668) - [Video Capture SDK .Net] [Media Player SDK .Net] [Video Edit SDK .Net] Fixed: with the EVR video renderer, shrinking the video area left the previous, larger picture on screen around the new one. The part of the video window the picture no longer covers is now cleared. (#1654)
- [Media Player SDK .Net] Fixed: with
VideoRendererMode.VideoRenderer- the legacy DirectShow Video Renderer -StopAsync()/Stop()could take a minute and a half or never return at all, leaving the player impossible to stop or dispose. Playback with that renderer now starts and stops as quickly as it does with EVR, VMR-9 and Direct2D, whether it was started withPlayAsync()or withPlay(), and whichever thread started it. (#1573, #1659) - [Video Capture SDK .Net] Fixed: with
VideoRendererMode.VideoRenderer- the legacy DirectShow Video Renderer - a capture or preview started withStart()from a thread that runs no message loop - a thread-pool thread, a worker thread, a consoleMain- could never be stopped or disposed.VideoCaptureCorenow builds and tears that graph down on a dedicated message-pumping thread, asMediaPlayerCoreandVideoEditCorealready did. (#1658) - [Media Player SDK .Net] Fixed:
VideoRendererMode.VideoRenderertook the desktop foreground away from the hosting application on everyVideo_Renderer_Update(), dropping the application window's always-on-top state and letting other windows cover it. The video window is still shown on each update, but no longer changes which window is in front. (#1573) - [Video Capture SDK .Net] [Media Player SDK .Net] [Video Edit SDK .Net] Fixed: with
VideoRendererMode.VideoRenderer- the legacy DirectShow Video Renderer - the picture was drawn too large and cropped to the video window in an application whose process DPI awareness differs from that of the window it plays into - a scaled display showed only the top-left part of the frame, which could look like frozen video. The renderer's window is now created and positioned in the DPI awareness context of the window it is given. (#1658) - [Video Capture SDK .Net] [Media Player SDK .Net] Fixed:
OSD_Layers_Draw_Image(id, filename, left, top)drew the image in the top-left corner of the layer with its firstleftxtoppixels cut off, instead of placing it at (left,top). Code that compensated by passing negative offsets must now pass the intended position; code that used theOSD_Layers_Draw_Image(id, filename, srcRect, destRect, ...)overload instead is unaffected. (#1570) - [Media Player SDK .Net] Fixed:
Stop()/StopAsync()called whilePlay()/PlayAsync()was still opening the source was ignored, and the playback started anyway. The stop is now carried out as soon as the start finishes:PlayAsync()returnsfalse, the player ends stopped, and the task returned byStopAsync()completes once it has. (#1646) - [Media Player SDK .Net] Fixed: disposing a
MediaPlayerCorethat was still playing never returned, and neither did its finalizer when the player was dropped withoutDispose(). The playback is now stopped before the player is released, soDispose()works without a priorStop(). (#1643) - [Video Capture SDK .Net] Fixed:
Stop()/StopAsync()called whileStart()/StartAsync()was still building the graph tore the graph down while it was being built. The stop now waits for the build and is carried out when the start finishes, which then returnsfalse. (#1646) - [Video Capture SDK .Net] [Media Player SDK .Net] Fixed: a Picture-in-Picture source added, deleted or cleared from another thread at the moment
Start/Playbegan could still slip into the graph build, failing the start with "Unable to set PIP layer settings" or a "Collection was modified" error, and PiP calls made from several threads at once could lose sources. The PiP source list now changes atomically with the start. (#1569) - [Media Player SDK .Net] Fixed: calling
Play()on a player that was already playing, or on a paused one to resume it, left it unstoppable -Stop()/StopAsync()returned without stopping playback, and the Picture-in-Picture sources could be changed under the running graph. (#1569, #1644) - [Video Edit SDK .Net] Fixed:
FFMPEGEXEOutput.AddFakeAudioSourcehad no effect inVideoEditCore. A job with no audio now gets a silent audio track, as inVideoCaptureCore, for both file output and network streaming.KLVEnableddoes not apply to Video Edit sources and now logs a warning instead of being silently ignored. (#1576) - [Video Edit SDK .Net] Fixed: in Preview mode,
VideoEditCore.StopAsync()/Stop()could hang for minutes or never return, andOnStopnever fired; the stop at the end of the timeline could hang the same way. This now holds for a job started withStart()from a thread with no message loop - a thread-pool thread, a worker thread, a consoleMain- as well as forStartAsync(). (#1645, #1659) - [Video Edit SDK .Net] Changed:
VideoEditCore.Start()called while a job is already running or starting now reports an error and returnsfalseinstead of restarting in place.StartAsync()has always refused it; callStop()before starting again. (#1659) - [Video Edit SDK .Net] Fixed: two
VideoEditCore.Start()/StartAsync()calls issued at almost the same moment - a double-clicked Start button, for instance - could both be accepted and build two jobs over one instance, giving a truncated or corrupt output file, a preview that could not be stopped, a leaked thread, or a crash. The second call is now always refused, and a job started withStart()is always stoppable withStop(). (#1661) - [Video Edit SDK .Net] Fixed: disposing a
VideoEditCorewhileStart()/StartAsync()was still building the job - closing the window right after pressing Start, for instance - released the objects the build was still using, which could crash the application or leave a job running with no owner. The release is now carried out as soon as the start finishes, and the start returnsfalse. (#1663) - [Video Edit SDK .Net] Fixed: starting the next job with
Start()from theOnStophandler of a finished conversion - the batch-convert pattern - stalled for ten seconds and was then refused with "Previous graph pump thread is still running". The next job now starts straight away. (#1664) - [Video Capture SDK .Net] Fixed:
Dispose()called whileStart()/StartAsync()was still building the graph - from anOnStartorOnErrorhandler, or by closing the window right after starting - tore the graph down under the build, after which the start still reported a running capture on the disposed engine; with the legacyVideoRendererMode.VideoRendererstarted from a thread with no message loop it was instead refused with an error or blocked for about 40 seconds. The release is now carried out as soon as the start finishes, and the start returnsfalse. (#1663) - [Video Edit SDK .Net] Fixed: converting to
FFMPEGEXEOutputwithUsePipe = falserecorded only the first few frames of the timeline and reported success.VideoEditCorenow always feeds FFMPEG.exe through a pipe and logs a warning whenUsePipe = false. (#1641) - [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed:
FFMPEGEXEOutputwith the MPEG-4, MPEG-1, MPEG-2, H.263 or FLV1 video encoder failed to start with the defaultVideoBufferSize("Either both buffer size and max rate or neither must be specified"). (#1641) - [Media Player SDK .Net] Fixed: with NDI or virtual camera output enabled,
MediaPlayerCorenever raisedOnAudioFrameBuffer, and the VU meters and audio effects did nothing. Playback itself was unaffected, and no error was reported. The audio sample grabber now sits in front of every output, so the NDI stream and the virtual microphone carry the same processed audio as the speakers. (#1595) - [Media Player SDK .Net] [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: the virtual microphone and NDI audio did not work for a source with no video.
MediaPlayerCorefailed to play an audio-only file (MP3, WAV, AAC, ...) with the virtual camera or NDI output enabled,VideoCaptureCorefailed to start an audio capture with the virtual camera output enabled, andVideoEditCoresilently ignored both outputs when previewing a timeline with only audio. All three now send the audio to the virtual microphone or the NDI stream. (#1592) - [Video Edit SDK .Net] Fixed: with the virtual camera or NDI output enabled,
VideoEditCorepreview played no sound through the speakers whenAudio_Preview_Enabledwas on. (#1592) - [Media Player SDK .Net] Fixed: with the virtual camera output enabled,
MediaPlayerCoreignoredAudio_OutputDevice_Volume_SetandAudio_OutputDevice_Balance_Set. The calls reported nothing and the speakers kept playing at the original level. (#1594) - [Video Capture SDK .Net] Changed:
VideoCaptureCorenow respectsMultiScreen_Enabled. Screens added withMultiScreen_AddScreenare shown only whileMultiScreen_Enabledistrue, as inMediaPlayerCore; before, they were shown whenever any screen was added, and the property had no effect. (#1561) - [Video Capture SDK .Net] Fixed: window capture on a scaled display (125%, 150%, ...) captured only the top-left part of the window, enlarged.
ScreenCaptureMode.Windownow captures the whole window whichever thread starts the capture. (#1561) - [Video Capture SDK .Net] Fixed: closed captions were not shown while
VideoCaptureCoremultiscreen was on. (#1561) - [Video Capture SDK .Net] Fixed:
VideoCaptureCoreshowed and recorded no video from a BDA/DVB source (BDAPreview/BDACapture). The tuner's stream now reaches the preview and the output, with or without audio. (#1589) - [Video Capture SDK .Net] Fixed:
SeparateCapture_StopAsynccould never return withMP4HWOutputusing Intel Quick Sync, leaving the recording unfinished. The Quick Sync H.264 and HEVC encoders could stop accepting frames mid-recording; they no longer do, and an encoder that stops accepting frames for any other reason now delays the stop by a few seconds instead of hanging it. (#1622) - [Video Capture SDK .Net] Fixed: with Separate Capture enabled on
MP4HWOutput,OnErrorcould fire "encoder is null" for every frame between the preview start and the firstSeparateCapture_StartAsync. (#1622) - [Video Capture SDK .Net] Fixed: an
FFMPEGEXEOutputpipe output withKLVEnabledand a muxer that cannot carry KLV (for example, FLV for RTMP streaming, or MP4) recorded nothing. KLV metadata is kept with the MPEG-TS, RTP/MPEG-TS and HLS muxers; with any other muxer the video and audio are now recorded without it and a warning is logged. (#1581) - [Video Capture SDK .Net] Fixed: with network streaming through
FFMPEGEXEOutput, the stream ignored the settings ofNetwork_Streaming_Output. It was encoded with FFmpeg's default codec for its container (Sorensonflv1for RTMP) at the source resolution, or with the file's settings when both used the same container. The stream now uses its own encoder, bitrate, resize andCustom_Additional*Args. (#1579) - [Video Capture SDK .Net] Fixed: stopping an
FFMPEGEXEOutputpipe output could occasionally raiseOnErrorwith "The handle is invalid", although the recording had finished normally. - [Video Capture SDK .Net] Fixed: stopping a hung
FFMPEGEXEOutput/VLC.EXE task could report the stop as done while the ffmpeg.exe/vlc.exe process still ran and held the output file locked. The stop now waits for the killed process to actually exit before reporting completion. (#1598) - [Video Edit SDK .Net] Fixed: with network streaming through
FFMPEGEXEOutput, the stream used the container and encoder settings of the output file instead ofNetwork_Streaming_Output. (#1579) - [Video Edit SDK .Net] Added:
FastEdit_CutFileAsynccan seek before opening the input, which makes cutting from a long file fast wherever the cut starts. PassFastEditSeekMode.Inputas the new fifth argument; the four-argument overload keeps the previous behavior, where cutting near the end of a multi-hour MPEG-TS recording read the whole file up to the cut. For MPEG-TS input (.ts,.m2ts,.mts) the cut starts on the keyframe preceding the requested start, so the output is decodable from its first frame and audio and video stay in sync. The Video Edit demos and agent skills show the new mode for transport streams. (#1623) - [Video Edit SDK .Net] Fixed: an operation stopped with
FastEdit_StopAsyncwas reported as failed with an error ("No process is associated with this object"). A stopped cut, join, audio extraction or mux now raisesOnStopwithSuccessful = falseand no error. The tasks returned byFastEdit_CutFileAsync,FastEdit_JoinFilesAsyncandFastEdit_ExtractAudioStreamAsyncnow carry the operation's result as documented, instead of alwaystrue. (#1597)
2026.9.17¶
- [Media Player SDK .Net] [Media Blocks SDK .Net] Changed: a resize, crop, aspect-ratio crop or box effect can no longer be removed from a running
MediaPlayerCoreXorLiveVideoCompositorpipeline. Removing one changes the frame size the graph has negotiated, so the call is now refused with a message instead of silently changing it — the same ruleVideoCaptureCoreXalready enforced. Stop the pipeline, remove the effect, and start again.LiveVideoCompositor(both versions) also pauses the pipeline aroundVideo_Effects_Clearnow instead of removing effects while playing, andMediaPlayerCoreXgainsVideo_Effects_ClearAsync, the pausing variant ofVideo_Effects_Clear. (#1612) - [Video Edit SDK .Net] Fixed: with the virtual camera output enabled,
VideoEditCore.Startcould report success while nothing reached the virtual camera. A virtual camera filter that could not be created, or could not be connected to the graph, left the preview running without it and the call still succeeded. The failure is now reported andStartfails, matchingVideoCaptureCoreandMediaPlayerCore. (#1590)
2026.9.16¶
- [Media Blocks SDK .Net] Fixed: an Android app could crash with
NotSupportedException: Unable to activate instance of type …while a screen-capture, camera or USB-camera source was in use. The SDK's Java callback and view classes missed the(IntPtr, JniHandleOwnership)constructor Xamarin.Android needs to rebuild the managed side after the garbage collector has taken it, so a callback the system still held — for exampleMediaProjection.Callback.OnStopon projection revocation — could bring the app down instead of firing. The constructors are in place now, and a rebuilt screen-capture callback still reports the projection revocation instead of silently ignoring it. (#1602) - [Media Blocks SDK .Net] [Core] Fixed: H264 hardware encoding on Android produced sheared, diagonally distorted video whenever the recording resolution was not one the device's encoder naturally aligns. The Android MediaCodec encoder plugin filled its input buffers with a guessed row stride and never asked the codec which layout it actually uses; Qualcomm and Samsung Codec2 encoders ignore the guessed layout and read rows at their own alignment, so every frame came out shifted and wrapped. The shipped Android runtime now reads the input format back from the codec after configuration and fills the buffers accordingly.
OpenH264EncoderSettingswas never affected. The same guessed layout also broke software H264 encoding outright at widths not divisible by four - 854x480, for one - where the guess asked for more bytes than the encoder's own input buffer holds and the recording failed on its first frame; and that failure was reported by crashing instead of raising an error. Both are fixed. Separately, a software or vendor H264 encoder whose codec reports both a profile and a level could not be used at all on Android - the encoder failed to start with "Unsupported amc level id" - or produced a stream tagged with the wrong level; both are fixed too. The Android HEVC encoder had the same defect twice over - its profile was looked up among the H264 profiles, so Main was reported as Baseline and an HDR10 profile refused the encoder outright, and its tier and level were read from the wrong table entry - and an encoder reporting a level the SDK does not know now keeps working, tagging the stream without that level rather than refusing to start. (#1601) - [Video Capture SDK .Net] [Media Player SDK .Net] [Video Edit SDK .Net] Fixed:
Frame_GetCurrentFromRenderercould return a corrupt frame. The returned bitmap was built over a buffer the SDK had already released, so a later draw or save could read freed memory; on the VMR-9 renderer the bitmap also started at the DIB header instead of the pixels, shifting every row, and row stride ignored the DIB 4-byte alignment. The bitmap now owns its pixels, and an unsupported pixel format reports an error instead of throwing. (#1558) - [Video Capture SDK .Net] [Media Player SDK .Net] [Media Blocks SDK .Net] Fixed: twenty documented video effects could not be added at all.
SVGOverlayVideoEffect,CropVideoEffect,AspectRatioCropVideoEffect,BoxVideoEffect,AgingVideoEffect,CircleVideoEffect,DiceVideoEffect,KaleidoscopeVideoEffect,MarbleVideoEffect,MovingBlurVideoEffect,MovingEchoVideoEffect,MovingZoomEchoVideoEffect,OpticalAnimationBWVideoEffect,Pseudo3DVideoEffect,QuarkVideoEffect,RippleVideoEffect,SMPTEAlphaVideoEffect,SquareVideoEffect,WarpVideoEffectandWaterRippleVideoEffectwere listed for the X engines, but adding one withVideo_Effects_AddOrUpdateAsynclogged "Wrong ID specified" and the effect never reached the pipeline. All twenty are applied now;SMPTEVideoEffectis a two-input transition that cannot sit in an effect chain and now says so instead of reporting a wrong ID. An output that records or streams follows a crop's size — a 640x480 capture with a 20 px crop on each edge records 600x440 — and property changes onAspectRatioCropVideoEffectorBoxVideoEffecttake effect on the next start rather than immediately. - [Video Capture SDK .Net] Changed: a resize, crop, aspect-ratio crop or box effect can no longer be removed from a running capture. Removing one changes the resolution the recording was configured for, so the call is now refused with a message instead of silently changing it. Stop the pipeline, remove the effect, and start again.
- [Video Capture SDK .Net] Fixed: an MP4 recording could start, report success and silently drop what it was told to do.
VideoCaptureCoreread a positive HRESULT from a partially rendered connection as a failure, and ignored the real failures: a crop or resize whose filter did not connect left the encoder on the raw source pin, so the file was written withoutVideo_CroporVideo_Resizeapplied; a resize was aligned against the source size rather than the requested one, discarding it; andStartcould answer success for an input that was never connected. Those cases now fail with a message naming the pin, instead of producing a recording that looks right and is not. - [Video Edit SDK .Net] Fixed: an MP4 or M4A output could be written without one of its tracks.
VideoEditCorewas told the stream had been muxed even when the muxer connection failed, so the conversion finished and reported success with the video or audio track missing. - [Media Player SDK .Net] Fixed:
MediaPlayerCoremultiscreen worked for one playback only. The extra windows added withMultiScreen_AddScreenshowed video the first time and then kept the last frame of it, because stopping playback disposed their renderers and forgot the screens with them. The screens are remembered now and their renderers are built again on everyPlay, with whateverMultiScreen_SetParameters,MultiScreen_UpdateSizeandMultiScreen_SetZoomwere last given. One consequence for existing code: when the window behind a screen is destroyed, callMultiScreen_Clearand add the screens again — a handle is kept until then. - [Media Player SDK .Net] [Video Capture SDK .Net] [Media Blocks SDK .Net] Fixed:
TextOverlayVideoEffect.TimeFormatwas ignored in System Time mode. The clock overlay element names the format propertytime-format, while the SDK only ever wrotedatetime-format— the name the timestamp overlay uses — so the format string was dropped without a message and the overlay kept showing its default%H:%M:%S. The property is now chosen per element, and a format that cannot be applied is logged. (#1604) - [Video Capture SDK .Net] [Media Player SDK .Net] [Media Blocks SDK .Net] Fixed: saving a snapshot as BMP or GIF crashed the application with a
NullReferenceExceptioninstead of saving the frame. The Skia build the SDK ships has no encoder for BMP or GIF, and the missing result was used without checking it; PNG, JPEG and WebP were unaffected. BMP is now written by the SDK itself, and a format it cannot write (GIF, ICO, WBMP) is refused with a message naming the supported formats — PNG, JPEG, WebP and BMP — instead of a crash.VideoCaptureCoreX.Snapshot_Save,MediaPlayerCoreX.Snapshot_SaveandVideoRendererBlock.Snapshot_Saveall behave the same way, and so doesPhotoCaptureView.SavePhotoAsyncon iOS and Windows. - [Demos] Fixed: the capture demos offered a GIF snapshot the SDK cannot write. BMP, PNG and JPEG remain in the snapshot save dialog of the Simple Video Capture and IP Capture demos (WPF and Avalonia).
- [Video Capture SDK .Net] [Media Player SDK .Net] [Media Blocks SDK .Net] Fixed: taking photos with
PhotoCaptureViewon iOS and Android retained full-resolution bitmaps until the garbage collector ran.TakePhotoAsyncis documented as handing the bitmap to the caller, who must dispose it. (#1610)
2026.9.15¶
- [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: stopping a capture or conversion with FFMPEG.EXE output could return while the encoder process was still exiting and still holding the output file, so an application that reopened, moved or deleted the recording right after the stop could find it locked. The stop now waits for the process to actually release it, and a process slower than that is handed to the background close instead of being walked away from.
- [Video Capture SDK .Net] [Media Player SDK .Net] [Video Edit SDK .Net] Fixed: an aspect ratio override was applied to the wrong axis for many ratio and window combinations, so instead of being letterboxed inside the window the picture was drawn at full height with its sides cut off — a 16:9 override in a 4:3 window lost 80 pixels from each side.
- [Video Capture SDK .Net] [Media Player SDK .Net] [Video Edit SDK .Net] Fixed: the application crashed with
Internal CLR error (0x80131506)when a capture or playback using the Direct2D video renderer was disposed. The renderer unloaded the filter's module while the graph could still hold the filter, so the next call into it landed in freed memory and took the process down. - [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: with network streaming enabled, the FFMPEG.EXE output encoded the streamed copy with the container's default encoder. The configured video and audio encoders, their bitrates, the output resize and all three
Custom_Additional*Argsproperties applied to the local file only and were silently ignored for the stream. Both outputs now get them, on both the pipe and the non-pipe output, whenever the stream uses the same container as the file. A stream on a different container still takes the defaults — it needs its own settings object, which the SDK does not pass down yet. - [Video Capture SDK .Net] Fixed: a capture written through the FFMPEG.EXE pipe output with
AddFakeAudioSourceenabled produced an unplayable MP4 or MKV. The silent audio source never ends, so the recording could not be finished by closing the inputs and was ended by killing the encoder instead - before it had written the file's index. Those recordings are now finalized normally; MPEG-TS output was unaffected. Two combinations are not covered yet and still need MPEG-TS output:KLVEnabled, and a fully custom FFMPEG command line (Custom_AllFFMPEGArgs). - [Demos] Fixed: the two Blazor Hybrid demos (Media Player SDK X and Video Capture SDK X) referenced
Microsoft.AspNetCore.Components.WebView.Wpf8.0.0, which pulled inSystem.Text.Json8.0.0 and with it two high-severity advisories (GHSA-8g4q-xg66-9fp4, GHSA-hh2w-p6rv-4g7w) that a vulnerability scanner would flag. Updated to 10.0.101, matching the demos'net10.0-windowstarget. - [Core] Fixed: projects targeting plain
net10.0-windows(or any othernetX.0-windowswithout a Windows version) no longer inherit anNU1701warning from the SDK.SkiaSharp.Views.WPF, which ships no matching asset for those target frameworks and was restored through the .NET Framework fallback, is no longer a dependency ofVisioForge.DotNet.Core;OpenTK.GLWpfControl, which only came in with it, is gone from the dependency graph as well. The skinned WPF controls are unaffected and keep working on every Windows target framework. - [Core] Changed: the base class of the skinned WPF control
SkinButtonis nowVisioForge.Core.UI.WPF.Skins.VFSkiaElementinstead ofSkiaSharp.Views.WPF.SKElement. It exposes the same members (CanvasSize,IgnorePixelScaling,PaintSurface,OnPaintSurface); only code that casts aSkinButtontoSKElementneeds updating. If your own code used types fromSkiaSharp.Views.WPF(SKElement,SKGLElement,ToWriteableBitmap, …) and relied on the SDK bringing the package in, add<PackageReference Include="SkiaSharp.Views.WPF" Version="3.119.4" />to your project — 3.119.4 is the version the SDK's own SkiaSharp is on, and under Central Package Management the version goes intoDirectory.Packages.propsinstead. OnnetX.0-windows10.0.19041targets it restores without theNU1701warning.
2026.9.14¶
- [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: an
ffmpeg.exeprocess could be left running after a capture or conversion with FFMPEG.EXE output ended, with its file never finalized. Disposing the engine performed none of the orderly shutdown, so whenever the stop failed or was never reached the recorder outlived it and nothing held a handle on it any more. Disposal now closes the recorder itself, giving it a few seconds to finish the file before ending it. - [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed: stopping a capture or conversion with FFMPEG.EXE output could hang the calling thread - the UI thread in a desktop application - indefinitely when the encoder did not respond to the quit command. The stop is now bounded and ends the process itself if it overruns.
- [Video Capture SDK .Net] Fixed: stopping an RTSP Low Latency or NDI source, or a capture writing through the FFMPEG.EXE pipe output, could crash with an access violation or heap corruption when a frame callback was still running while the graph was being disposed, and the RTSP Low Latency source leaked memory on every 32-bit float audio frame. The frame buffers are now freed under a lock the callbacks also hold, so a callback either finishes before the free or sees the stop signal and exits.
- [Media Blocks SDK .Net] Fixed: every pipeline serialization, validation and materialization call threw
MediaBlockType collision: 'GPUPixelBeautyBlock' and 'UDPRAWMPEGTSSourceBlock' both report GPUPixelBeauty, so no pipeline document could be saved or loaded and both blocks were unreachable through the block catalog. The betaGPUPixelBeautyBlockdiscriminator moves from 443 to 445. No saved document can have carried the old number, because every path that reads or writes one threw; but C# bakes enum constants into the calling assembly, so an application compiled against 2026.9.11 must be recompiled - otherwise its ownMediaBlockType.GPUPixelBeautycomparisons silently test forUDPRAWMPEGTSSourceinstead. - [Video Capture SDK .Net] [Media Player SDK .Net] [Video Edit SDK .Net] Fixed: the EVR video renderer leaked one Media Foundation video-processor object - and the EVR mixer behind it - on every start, and the fake video renderer used by the FFMPEG.exe output leaked its display-control object the same way, so memory grew slowly in applications that start and stop repeatedly on one engine instance.
- [Media Player SDK .Net] Fixed: the extra windows added by
MultiScreen_AddScreenstayed black from the second playback onwards with both the EVR and the VMR-9 renderer, and each of them leaked a whole renderer filter - with, on EVR, its mixer - per playback. Those renderers are re-initialized on every playback rather than recreated, and the filters and interfaces of the previous run were kept and used instead of the new ones. - [Media Blocks SDK .Net] Fixed: on iOS and Mac Catalyst, audio ran ahead of the video in a recording. The iOS camera, the iOS and Mac Catalyst screen sources and the iOS broadcast extension timed their frames from their own first frame rather than from the pipeline clock, while a live audio source such as the microphone is timed from the moment the pipeline starts playing. The two timelines were therefore offset by however long the pipeline took to build and start, and the offset stayed for the whole recording.
- [Video Capture SDK .Net] Fixed:
Video_CaptureDevice.Format_UseBestcould pick a video format the graph cannot connect to, so every start failed withVFW_E_CANNOT_CONNECT. On devices offering several subtypes at their top resolution (a Logitech BRIO among them) the pick depended on enumeration order and could land on NV12, and the RAW sample grabber additionally demanded RGB24 whenever the format name named no known subtype or auto selection was on. Selection now prefers MJPG at equal resolution, then any subtype the sample grabber supports, the chosen format is logged, and the grabber connects to whatever the device offers instead of failing to connect. - [Video Capture SDK .Net] [Media Player SDK .Net] [Video Edit SDK .Net] Fixed: disposing a video renderer or a DirectShow filter twice - or having one collected while the capture graph was being torn down - could release the same COM object twice, reported as
RaceOnRCWCleanuporCOM object that has been separated from its underlying RCW cannot be used, and occasionally as a crash during shutdown. Cleanup now runs exactly once per object and never from the finalizer thread. - [Video Capture SDK .Net] [Media Player SDK .Net] [Video Edit SDK .Net] Fixed: the same double-release could still be reported from the BDA/DVB source, the Decklink device list, the timeline objects, the Picture-in-Picture sources, the virtual camera streamer and the device enumerator, all of which released COM interfaces and disposed child filters from the garbage collector's finalizer thread. None of them do any more.
- [Video Capture SDK .Net] [Media Player SDK .Net] Fixed: an application that dropped a capture or player without calling
Dispose()could freeze on exit. Cleaning up such an instance ran a synchronous refresh of the video view - and, in the player, a wait for the garbage collector - on the finalizer thread, which never returns once the window it refreshes is gone. Neither step runs there any more, and the player now logs thatDispose()was missed, as the capture already did. - [Media Player SDK .Net] Fixed: a Picture-in-Picture file source never appeared unless the LAV source mode was selected - the wrong filter was asked for its output pin, and the resulting error was swallowed.
- [Media Player SDK .Net] Fixed: each start rebuilt the Picture-in-Picture source filters without releasing the previous ones, so memory grew with every start/stop cycle that used PiP. The renderer input pin each source connects to was never released either. The Video Capture SDK was not affected - it releases its PiP sources at stop.
- [Video Capture SDK .Net] [Media Player SDK .Net] Fixed:
OSD_Layers_Draw_Image()threw instead of returningfalsewhen the image file was missing or unreadable, so a logo path that had moved took the application down rather than being reported. - [Video Capture SDK .Net] [Media Player SDK .Net] Fixed: every OSD layer method accepted a layer id one past the last layer, and a negative one, instead of rejecting it -
OSD_Layers_Clear(id)threw out of the call rather than logging the wrong id. - [Video Capture SDK .Net] [Media Player SDK .Net] Fixed:
OSD_Layers_Clear()andOSD_Layers_Delete()dropped an OSD layer without releasing its bitmap, despite documenting that they did; an application that rebuilt its OSD repeatedly held one full-frame 32-bit surface per layer until the next garbage collection. Note that a bitmap obtained fromOSD_Layers_GetBitmap()is now disposed with its layer, so it must not be used after the layer is cleared or deleted. - [Video Capture SDK .Net] [Media Player SDK .Net] Fixed:
PIP_Sources_Clear()andPIP_Sources_Delete()dropped a Picture-in-Picture source without releasing its filters, so memory and device handles grew every time the sources were reconfigured. The Media Player also kept them until the process exited. They now release what they remove - and, because those filters are connected in the graph while it runs, the whole PiP source list declines and logs instead of changing anything while a capture or playback is in progress. Changing it mid-run never took effect anyway: the sources are read when the graph is built. - [Media Blocks SDK .Net] Fixed: on Android, audio ran ahead of the video in a recording. The camera, screen and playback-capture sources timed their frames from their own first frame rather than from the pipeline clock, while a live audio source such as the microphone is timed from the moment the pipeline starts playing. The two timelines were therefore offset by however long the pipeline took to build and start - a fraction of a second with a camera, a couple of seconds with a hardware encoder and screen capture - and the offset stayed for the whole recording. Windows was not affected.
2026.9.13¶
- [Video Capture SDK .Net] Fixed: closing or disposing a WinForms application froze it for 10 seconds while a capture was stopping. Disposing
VideoCaptureCorewhile aStopAsyncwas still running deadlocked the UI thread against the stop thread until an internal timeout expired, after which the graph was released while the stop was still using it. The freeze is gone and the stop now completes in well under a second. - [Video Capture SDK .Net] Fixed: calling
Start()while a previous stop was still finishing could tear down and rebuild the capture graph from two threads at once, producingCOM object that has been separated from its underlying RCW cannot be usederrors and unstable behaviour afterwards.Start()now refuses with a clear message instead; awaitStop()/StopAsync()before starting again. - [Video Capture SDK .Net] Changed: starting capture from inside an
OnStophandler is now refused and reported, instead of appearing to succeed and leaving a capture the engine could no longer stop. Start afterStop()/StopAsync()has returned. - [Core] New: on Windows, WASAPI (1) audio endpoints (
wasapisrc/wasapisink) can be listed alongside WASAPI2 by settingDeviceEnumerator.Shared.LegacyWasapiDeviceProviderEnabled = truebefore enumerating. Off by default — both APIs describe the same physical endpoints, so enabling it lists each one twice, tagged[WASAPI]and[WASAPI2].
2026.9.12¶
- [Media Blocks SDK .Net] [Video Capture SDK X .Net] [Media Player SDK X .Net] Fixed: the Uno
VideoViewstopped responding toVisibilityafter a pipeline restart. Starting a pipeline forced the control back toVisibility="Visible", overwriting whatever the application had bound to it. Since the bound source property itself had not changed, no later binding update put it back, so from that point the view could never be collapsed again - it stayed on screen with a frozen frame and hid whatever the page drew underneath it. This showed up most often after leaving a page and returning to it, where the pipeline is rebuilt while the application already considers the view hidden. The control no longer writes its ownVisibility; showing and hiding it is the application's decision. - [Media Blocks SDK .Net] Fixed: collapsing the Uno
VideoViewnow hides the native video surface on iOS and Mac Catalyst, where it is a window-level overlay outside the XAML tree and previously kept drawing over the page. - [Media Blocks SDK .Net] Fixed: leaving a page that holds a Uno
VideoViewon Android now releases the native view. Its render thread and frame buffers used to stay alive for the rest of the process, once per navigation.
2026.9.11¶
- [NuGet] Release packaging now verifies that fixed-cadence native packages are locally prepared and published before the release is signed.
- [Demos] iOS and Mac Catalyst demos now declare local-network usage, so streaming or playback to a LAN host prompts for permission instead of failing silently (#829).
- [Media Blocks SDK .Net] Fixed: a stalled SRT MPEG-TS sink no longer freezes the rest of the pipeline, including camera preview (#829).
- [Media Blocks SDK .Net] New (beta):
GPUPixelBeautyBlockapplies GPU skin smoothing and whitening. ReferenceVisioForge.CrossPlatform.GPUPixel.Windows.x64. Face slim, eye enlarge, lipstick and blusher are no-ops on Windows until a face detector ships (#1495). - [Media Blocks SDK .Net] Fixed: a
VideoResizeBlock(or aResizeVideoEffect) no longer drops the stream when the source changes frame size mid-take. A 90° rotate, a device orientation change or an adaptive stream switching resolution used to end the recording after one frame (#1514). - [Media Blocks SDK .Net] Fixed: adding or removing a LUT effect while a pipeline is playing no longer leaves it stuck short of PLAYING (#1513).
- [Media Blocks SDK .Net] Fixed:
RTMPSourceBlockdelivered no video. An RTMP stream that carried audio left the reader stalled a moment after connecting - the connection succeeded,flvdemuxparsed the FLV header and the AVC sequence header, and then nothing: the video output pad was never created and a recorder behind the block wrote an empty file. The block now links the demuxer's video and audio streams to its outputs as they appear and discards any stream the caller left unconnected, so video flows andGetVideoStreamInfo()reports the real frame size (it returned0x0on a live source) (#1489). - [NuGet] CrossPlatform GStreamer redistributable packages are now 2026.9.11 (GStreamer 1.28.6) for Windows, Apple, Android and Linux.
2026.9.10¶
- [Media Blocks SDK .Net] Fixed:
NDISourceXBlocknever delivered a stream and prevented the process from exiting. Source settings now apply; enumerating sources no longer breaks a running connection; receiving audio no longer leaks memory (#1490). - [Media Blocks SDK .Net] [Video Capture SDK X .Net] Fixed: a frame-size change during recording (for example an Android rotation) now raises
OnErrorand stops that output instead of silently corrupting the file. CallStopAsync/StopCaptureAsyncwhen you get it. Live streaming, MPEG-TS and preview are unchanged (#1496). - [Media Blocks SDK .Net] [Video Capture SDK X .Net] [Video Edit SDK X .Net] Changed: H.264 outputs now default to the platform hardware encoder on iOS, macCatalyst, macOS and Android. Construct the output after
InitSDK. Pass anIVideoEncoder, or setVideo, to keep software H.264 (#1505). - [Media Blocks SDK .Net] Fixed: text overlays on Android now use fonts bundled with the application. Name the font family as recorded inside the file, not the file name (#1500).
- [Media Blocks SDK .Net] [Video Capture SDK X .Net] [Video Edit SDK X .Net] New:
GetVideoEncoders()now lists Android and Apple hardware encoders. On Android an entry appears only when the device actually provides that encoder (#1499). - [Media Blocks SDK .Net] Fixed:
AndroidAV1EncoderSettingsauto-detection now finds the device's AV1 encoder (#1499). - [Media Blocks SDK .Net] Fixed: choosing "AMF H265" in an encoder picker no longer throws
MissingMethodException(#1499).
2026.9.9¶
- [Video Capture SDK X .Net] [Media Blocks SDK .Net] New: the Android camera can follow device rotation. Call
Video_Source_UpdateOrientation()/UpdateOrientation(), or setAutoUpdateOrientation = true. Default is unchanged. Turn automatic mode off around a recording — a 90° turn swaps width and height, which a recording already in progress cannot follow (#297). - [Media Blocks SDK .Net] Fixed:
SilenceDetectorBlockcould report a silence period ending in the year 2554.Timestampis nowTimeSpan?and isnullwhen the position is unknown. Breaking: code readingTimestamp, orPeriodonOnSilenceEndedwithout a null check, needs updating. - [Media Blocks SDK .Net] Fixed:
OnSilenceEndedfromFinalizeSilencePeriodsnow reports the last measured level, not the threshold, and no longer records a period whose end precedes its start. - [Media Blocks SDK .Net] Fixed:
TextOverlayBlockcrashed whenSettingsorFontwasnull. Null settings now pass video through with no overlay (#1497).
2026.9.8¶
- [Media Blocks SDK .Net] Added:
EbuR128LevelBlock.OnMeasurementreports momentary, short-term and integrated loudness, relative threshold and loudness range (#1442). - [Core] Fixed: an application that did not call
VisioForgeX.DestroySDK()never exited after building a pipeline.DestroySDK()is still the right way to release the SDK (#1448). - [Media Blocks SDK .Net] Fixed: playing an audio file through
AudioRendererBlockplayed a few frames then fell silent, and stopping took about ten seconds (#1464). - [Media Blocks SDK .Net] Fixed: stopping a pipeline that writes no file no longer raises a warning about a missing trailer (#1464).
2026.9.7¶
- [Media Blocks SDK .Net] Fixed: stopping a RIST output took about 10 seconds (#1463).
- [Media Blocks SDK .Net] Fixed: a detector added to a running pipeline with
AddBlockLivenever raised its event. Removing it live now also stops its events (#1473). - [Media Blocks SDK .Net] Fixed:
VUMeterBlockcould not be connected toAudioMixerBlock(Unable to link pads ... Error Noformat). - [Media Player SDK .Net] Fixed:
MediaPlayerCorecould crash playback with an access violation when Clear unloaded a DirectShow filter still in use (#1471). - [Core] Fixed: DirectShow filter DLLs could be unloaded or freed twice during teardown, crashing the next graph (#1462).
2026.9.6¶
- [Video Capture SDK .Net] Fixed:
VideoCaptureCore.Clear()could crash the next capture with an access violation by unloading a DirectShow filter still in use (#1455). - [Video Capture SDK .Net] Fixed:
Audio_OutputDevice_Volume_Getblocked the calling thread andAudio_OutputDevice_Volume_Setapplied the volume late when started withStartAsync(#1454). - [Core] The
AutoH264EncoderSettings,AutoHEVCEncoderSettingsandAutoAV1EncoderSettingstypes, announced in 2026.4.21, were removed in 2026.4.30. Choose a per-runtime settings class (AMF, NVENC, QSV, Media Foundation, D3D11/D3D12 or software) and checkIsAvailable()before building the pipeline.
2026.9.5¶
- [ALL] Anonymous error telemetry works again while you develop against the SDK. It runs only with a debugger attached; a shipped application never sends anything. Reports go to
https://telemetry.visioforge.organd contain no file paths, device identifiers, media or configuration. SetDebug_Telemetry = falseto switch it off.
2026.9.4¶
- [Core] Fixed:
Gst.Uri.QueryTableandGst.Uri.MediaFragmentTablethrewArgumentExceptionon any URI that had a query or fragment. - [Media Blocks SDK .Net] Fixed: stopping a pipeline parked in READY after a natural end-of-stream (
PauseOnStop) could start it playing again. - [Media Blocks SDK .Net] Fixed:
Stopcould report success over an unplayable recording when the graceful wait expired. The truncation is now logged as an error. - [Media Blocks SDK .Net] Fixed: a recording could lose its trailer after an errored source was removed from a running pipeline.
- [Media Blocks SDK .Net] Fixed:
SendEOScould throwNullReferenceExceptionwhenDisposeran at the same time. - [Core] Fixed: the MAUI Skia, Apple and Windows video views ignored the background color you set (#301).
- [Core] New:
VideoView.BackgroundColoron WinUI and Android (VideoViewTX) (#301). - [Media Blocks SDK .Net] Fixed: stopping a pipeline whose source had errored before the first frame waited ~23 seconds. Such a stop now completes promptly; recordings that were playing still get their trailers (#1382).
- [Media Blocks SDK .Net] Fixed: a live add whose build failed left its elements inside the running pipeline (#1409).
- [Media Blocks SDK .Net] Fixed:
DemuxerSourceBlockpublished a silent subtitle pad for streams it never fed (#1414). - [Media Blocks SDK .Net] Fixed:
DemuxerSourceBlockhung at start on MPEG-TS files and barely played MOV files (#1425). - [Media Blocks SDK .Net] Fixed: unconnected output pads stalled the streams you did connect. Set
OnDemandConnecton a pad you intend to connect after the build (#1415).
2026.9.3¶
- [Media Blocks SDK .Net] Fixed:
LiveVideoCompositor(V2) could not be stopped and started again.GetVideoMixer()andGetAudioMixer()now returnnullwhile stopped (#1377). - [Core] Fixed: on macOS, an application embedding the SDK's native plugins could be killed at startup with "Code Signature Invalid". If you notarize an app that embeds
libMoltenVK.dylib, re-sign it withcodesign --options runtime(#1371). - [Media Blocks SDK .Net] Fixed: demuxed closed captions, WebVTT, TTML, DVB teletext and ONVIF metadata were discarded instead of reaching an output pad (#1387).
- [Core] Removed:
VideoViewUIEngine.iOS_CGandIVideoViewPushFrame.PushSample. ReportApple_MetalorApple_OpenGLand render throughPushFrame(#1401). - [Media Blocks SDK .Net] Changed:
VideoRendererBlocknow fails withNotSupportedExceptionwhen the video view's UI engine is unrecognised (#1401). - [Media Blocks SDK .Net] Fixed: live Whisper subtitles ran ahead of the picture. Captions now follow the frame timestamp.
CaptionTimelineis public for driving your own caption label (#822). - [Media Blocks SDK .Net] New: play at normal speed with live captions. Split audio with a
TeeBlockso one branch plays while the other feeds speech-to-text. See the Live Subtitles guide (#822). - [Demos] File-playback speech-to-text demos gained a "Real-time playback" switch, on by default (#822).
- [Core] Fixed: on iOS, reading a GStreamer format or metadata descriptor, or implementing a GStreamer/GLib interface, aborted the application (#1391).
2026.9.2¶
- [Core] Fixed: on iOS, any pipeline with a sample grabber, custom transform or custom colorspace crashed or failed to build (#820).
- [Core] Changed: on Mac Catalyst, audio output device names now carry their API tag (
[CoreAudio] <name>). PersistNameandUniqueID, notDisplayName(#1397). - [Core] Changed: device display names now follow one rule — the API tag appears only where the platform offers more than one API. On iOS both
DisplayNameandToString()are the bare device name. On macOS and Mac CatalystVideoCaptureDeviceInfo.DisplayNamenow carries the tag. PersistName(andUniqueID/AvfUniqueIDon Apple), not the display string (#1400). - [Core] Changed:
VideoCaptureDeviceInfo.IsFlashAvailableandIsTorchAvailableare no longer available on Mac Catalyst (#1397). - [Media Blocks SDK .Net] Fixed: chroma key on a video mixer input could not be switched off, and updating one input's chroma key could change another input's (#1366).
- [Media Blocks SDK .Net] Fixed: a property set while the pipeline was being stopped from another thread could be silently ignored (#1366).
- [Core] Fixed: on macOS, starting any child process while an SRT pipeline was running could hang the application (#1381).
- [Media Blocks SDK .Net] Fixed: on iOS, stopping an SRT sink whose peer keeps disappearing could block indefinitely (#1349).
- [Media Blocks SDK .Net] Fixed:
LiveVideoCompositor(deprecated V1) reported success when an input failed to start. If you derive from V1LVCInput,Buildnow returnsbool(#1383). - [Media Blocks SDK .Net] Fixed: restarting
LiveVideoCompositor(deprecated V1) built a second composition on top of the first (#1388). - [Media Blocks SDK .Net] Fixed: in
LiveVideoCompositor(deprecated V1), an output added after another was removed took over a live output's stream (#1398). - [Media Blocks SDK .Net] Fixed: a failed
Input_AddAsyncorOutput_AddAsynconLiveVideoCompositor(V2) left the failed input or output inside the compositor (#1384). - [Media Blocks SDK .Net] Fixed: on a
LiveVideoCompositor(V2) with audio disabled, every video/audio input carrying audio was wired to the same internal audio channel (#1384). - [Media Blocks SDK .Net] Changed:
LiveVideoCompositor(V2) now enforces input and output limits (MaxVideoInputsCountand related, default 10). An eleventh add that used to succeed is now refused — raise the setting if needed (#1384). - [Video Capture SDK .Net] Fixed: DirectCapture from an IP camera could record with an unrelated FFmpeg found on
PATH, producing video with no audio (#83). - [Video Capture SDK .Net] Fixed: DirectCapture from an IP camera always recorded the camera's audio.
Audio_RecordAudionow governs it (#83). - [Video Capture SDK .Net] Fixed:
DirectCaptureDVandDirectCaptureCustomwith an IP camera started, reported success and wrote no file. Both are now refused (#83). - [Video Capture SDK .Net] Fixed: with separate capture and
SeparateCapture_AutostartCapture = false, a DirectCapture IP camera capture began writing onStart(). Recording now begins atSeparateCapture_Start(#83). - [Video Capture SDK .Net] Fixed: DirectCapture accepted an NDI source and produced nothing. The combination is now refused (#83).
- [Media Blocks SDK .Net] On macOS, RT-DETR object detection now runs on the CPU by default (
Auto), using less than half the memory. SetOnnxInferenceSettings.Provider = CoreMLto keep CoreML (#862). - [Media Blocks SDK .Net] Fixed: disposing an object detector while it was processing a frame could crash the process (#862).
- [Media Blocks SDK .Net] Fixed: stopping a pipeline built on
MPEGTSDemuxBlockorQTDemuxBlockcould crash, and an extra stream in the file was dropped (#1365). - [Media Blocks SDK .Net] Fixed: removing an output from a running Live Video Compositor left a tee branch behind.
TeeBlock.RemovePadLiveis the public counterpart toAddNewPadLive(#1367). - [Media Blocks SDK .Net] Fixed:
VideoMixerBlock.Inputsgrew without bound on a Live Video Compositor that added and removed video inputs (#1367).
2026.9.1¶
- [Media Blocks SDK .Net] Fixed: changing the background image of
SqueezebackBlockV2stalled for half a second. The swap now completes in about a frame on a running pipeline (#832). - [Media Blocks SDK .Net] Fixed: the Letterbox mode of
ImageVideoSourceCairoBlockcentred the image on the wrong dimensions (#832). - [Media Blocks SDK .Net] New:
ImageVideoSourceCairoBlock.UpdateFilenameAsync/TryUpdateFilename, andSqueezebackBlockV2.BackgroundImageFile(#832). - [Media Blocks SDK .Net] Fixed:
ImageVideoSourceCairoBlocklogged a GStreamer critical every time the pipeline stopped (#832). - [Media Blocks SDK .Net] Fixed: an image overlay fade could crash the application when the pipeline was stopped during the fade.
VideoPaddingChangerBlock.Input_Moveis fixed the same way (#837). - [Core] Fixed:
MediaInfoReaderXfile snapshots could return a frame from the previous file, throwArgumentExceptioninstead ofnull, leak temp files, wait out the full timeout on an undecodable file, and hold the captured frame in memory after return (#837). - [Media Blocks SDK .Net] Fixed: a Unity player built with the IL2CPP scripting backend could not use the SDK at all (#820).
- [Demos] Fixed: in the Android demos the bottom button row was drawn under the system navigation bar (#1358).
- [Video Capture SDK .Net] Removed: the RTSP X network streaming output (
NetworkStreamingFormat.RTSP_X,RTSPXOutput, and theVisioForge.DotNet.Core.Redist.RTSPX.x64package). UseVideoCaptureCoreXwithRTSPServerOutput(#1262). - [Media Blocks SDK .Net] Fixed: on Windows, stopping an SRT pipeline never returned when the receiving peer had gone away (#1190).
- [Media Blocks SDK .Net] Fixed: the same SRT stop hang on Android (#1350).
- [Core] The RAV1E AV1 encoder now encodes across CPU cores.
RAV1EEncoderSettings.Tilesdefaults to 16; setTiles = 0for the previous single-tile output (#1345). - [Media Blocks SDK .Net] Fixed: a Basler camera was opened by its position in the device list, not by the camera you named (#1344).
- [Media Blocks SDK .Net] Android now ships GStreamer 1.28.6, matching every other platform (#1268).
- [Video Capture SDK .Net] Fixed: a capture that could not build its graph killed the process on stop. Update
VisioForge_MP4_Muxer_v10*.axandVisioForge_AAC_Encoder_v10*.axin your redistributables (#841). - [Video Capture SDK .Net] Fixed: stopping or disposing a capture could kill the process with an access violation (#841).
2026.8.31¶
-
[Media Blocks SDK .Net] Fixed: a video mixer could save a source that would not load back, and a restored Basler source could report zero frame rate. A mixer source whose camera name had been cleared was written into the document without it, the snapshot reported success, and loading that document failed - it is refused at save time now, naming the block. And a Basler camera whose frame rate could not be read when the document was saved kept a zero frame rate on every later load, which reached the recording's frame info; it is re-read now, as the sensor size already was.
-
[Media Blocks SDK .Net] Fixed: a Spinnaker source could open a different camera than the one it was told to, without saying so. The camera was addressed by its position in the enumerated list rather than by its own index, so one camera failing to initialize - held by another process, for instance - shifted every camera after it, and the source silently opened its neighbour. A name matching no camera at all, or matching two identical bodies (the name is the model name, which they share), was equally silent. The index is now the camera's own,
SpinnakerCameraInfocarries the serial number, and all three cases are reported. two handles leaked during enumeration are released; one camera failing to answer no longer hides every other camera on the rig, and no longer leaves a truncated list cached; a camera whose model name cannot be read is listed under its serial number instead of under a name every unreadable camera shares; and a camera index the element cannot address fails the source instead of quietly opening a different camera - the element accepts 0-7, so on a rig with nine or more cameras the ninth and beyond now report an error at build time rather than streaming a neighbour. -
[X-engines] Fixed: an SDK error killed the process when the application had not subscribed
OnError.VideoEditCoreXreported such an error by logging it, and the log is what raises the error event, so every error re-entered the reporting path and recursed until the stack overflowed - the process died with no exception and no message. A render that could not build its encoder was the common way in. The error is now reported once, and shown on the video view exactly as the other engines do.MediaBlocksPipelinehad the same loop on its two "VisioForge_MFP.dll not found" messages, which recursed whenever a debugger was attached (#1173). -
[Media Blocks SDK .Net] Fixed: a virtual camera sink with an input that was created but never connected wedged the pipeline.
VirtualCameraSinkBlockbuilt the chain for a pad that exists rather than for one that is connected, so an unconnected input left a branch with nothing feeding it - a branch that can neither preroll nor reach End-Of-Stream, leaving eitherStartAsyncorStopAsyncnever returning. Two connected inputs of the same type are now reported as an error too - only one of them was ever linked (#1288). -
[Media Blocks SDK .Net]
NDISinkBlock.IsAvailable()now reportsfalsewhen the NDI runtime is missing. It answered from the GStreamer element alone, so on a machine carrying the plugin but no NDI runtime it reported the sink as available and the pipeline then failed to start (#1288). -
[Media Blocks SDK .Net] Fixed: stopping a pipeline whose
NDISinkBlockhad only a video input never returned.StopAsyncblocked forever and the pipeline could never be disposed; adding an audio input was the only workaround. The sink built its audio chain even when no audio was connected, and the unfed combiner pad stalled the End-Of-Stream a graceful stop sends. A video-only NDI sink now stops normally. An NDI sink with no video input, which cannot produce an NDI stream at all, is now reported as a build error instead of hanging the same way (#1288). -
[Media Blocks SDK .Net] Fixed: nothing decoded when a decoder was connected to
UniversalDemuxBlock. The demuxer hands out encoded data, so a decoder behind it is the normal way to use it - and that graph delivered no frames at all, while the pipeline reported a successful start and put nothing on the bus. A stream the demuxer was told not to render was sent to a plain null sink, which stalled the demuxer until the pipeline reached playing, and the pipeline could not reach playing because the decoder branch was starved of the frames it needed. This affectsUniversalDemuxBlockandUniversalAutoDemuxerBlockwithrenderVideoorrenderAudioturned off, and every decoder behind them,UniversalDecoderBlock,DecodeBinBlockand the codec-specific decoder blocks alike. A demuxer also no longer throws when the file turns out to hold more streams of a type than its media info reported, andUniversalDemuxBlockcan now output a metadata stream (#836). -
[Media Blocks SDK .Net]
UniversalDemuxSettings.Typecan now be set. It was declared without a setter, so that settings class always meant automatic container detection whatever was assigned to it; the per-format settings classes were the only way to pick a specific demuxer. The default is unchanged (#836). -
[Media Blocks SDK .Net] Pipeline documents now write enum settings by name instead of by number. Many of the SDK's enums declare their members per platform, so the same ordinal meant a different member elsewhere -
1wasWASAPIon Windows andDecklinkon macOS - and a document moved between platforms silently restored the wrong device API, encoder or format. A saved pipeline now reads"api": "WASAPI". Documents written before this still load; a document written by this build cannot be opened by an earlier one (#1322). -
[Media Blocks SDK .Net] A pipeline document now restores the audio device a block was using.
AudioRendererBlock,SystemAudioSourceBlockand the WASAPI, WASAPI2, DirectSound, loopback and PulseAudio audio sources hold anAudioOutputDeviceInfoorAudioCaptureDeviceInfo, and neither could be written to a document and read back - so a saved pipeline came back either refusing to load or holding no device at all. A document now stores what identifies the device (its name, path, API and, on macOS, the stable CoreAudiounique-id), and materialization matches that against the devices the machine actually has, handing the block a live device again. This also fixes a saved configuration opening the wrong speaker or microphone: the numeric CoreAudio id and the WASAPI path are both reassigned between runs, and the match now re-reads the current ones. When the named device is gone, the pipeline still builds on a system device of the same API and materialization reports it as the newMBS063warning naming both devices.AlliedVisionSourceSettingsrestores from the camera's identity the same way, without opening the camera (#1322). -
[Media Blocks SDK .Net] Fixed: a pipeline document silently lost mandatory block settings and restored a block wired to the wrong thing. A setting exposed as a read-only property - the bridge
Channelabove all, but alsoCustomMediaBlockSettings.ElementName,GLOverlaySettings.Filename,GLEquirectangularViewSettings.VideoWidth/VideoHeight,AlliedVisionSourceSettings.Cameraand the GenICam region, frame rate and pixel format - was never written into a saved document, and came back asnullor0with validation, deserialization and materialization all reporting success. Two app bridges saved on different channels reloaded onto the same one. Those settings now round-trip, a document missing one is reported asMBS043naming the property instead of restoring a mis-wired block, andMediaBlockDescriptor.Propertieslists them (with the newIsRequiredandIsReadOnlyflags) so an editor can author them. Eight settings types could not be restored at all, because a constructor parameter matched no property and the serializer refuses to bind such a constructor - every document holding aBridgeAudioSource,HTTPSource,AudioRenderer,OpenCVTemplateMatch,LiveSourceSwitch,LiveSourceSwitchDynamic,AlliedVisionSourceorVideoAspectRatioCropblock failed to load. All of them now restore. The parameters are renamed to match their properties:BridgeAudioSourceSettings(channel, info),HTTPSourceSettings(location, isLive),AudioRendererSettings(info),CVTemplateMatchSettings(templateImage)andLiveSourceSwitchSettings(videoWidth, videoHeight, videoFrameRate). Positional calls are unaffected; code passing these by name must be updated (#1322). -
[Media Blocks SDK .Net] Fixed: a pipeline document holding a
SpinnakerSourceblock could not be loaded, and a mixer holding a Spinnaker source could not be saved. The constructor's first parameter matched no property, which the serializer refuses outright, and the region, frame rate and pixel format were never written into the document. All four settings now round-trip. The parameter is renamed to match its property:SpinnakerSourceSettings(name, region, frameRate, pixelFormat). Positional calls are unaffected; code passing the first argument by name must be updated (#1338). -
[Media Blocks SDK .Net] Fixed: a pipeline document holding a
GenICamSourceorBaslerSourceblock came back without its camera.GenICamSourceSettingsdeclares two constructors and no parameterless one, which the serializer refuses outright, so no document holding the block loaded at all - while its region, frame rate and pixel format were written into the document regardless.BaslerSourceSettings.Camerawas never written, so the block restored with no camera while saving, validation and loading all reported success. Both now round-trip from the identity the document carries, and a Basler document that carries the sensor size no longer opens the camera to re-read it. The first parameter of bothGenICamSourceSettingsconstructors is renameddeviceName->nameto match its property; positional calls are unaffected. ASpinnakerSourceorGenICamSourcedocument carrying no camera name, or an empty one, is now reported asMBS043instead of silently opening the first camera on the machine (#1338). -
[Media Blocks SDK .Net] Fixed: a video mixer holding an Allied Vision or GenICam camera could not be saved. The mixer wrote a source only when it could read it back, and that check looked at public constructors alone - so it refused a settings class whose deserialization constructor is private, with an
MBS060, even though loading a document restores it correctly. Both cameras now save and reload as mixer sources. A mixer source missing a mandatory setting - the region above all - is reported now too, where it used to load as a camera with no region and then fail when the pipeline started (#1338). -
[Core] Fixed: a capture device whose sample rate range lies outside 22050-96000 Hz disappeared from the device's format list. A narrow-band device publishing, say,
rate=(int)[ 8000, 16000 ]matched none of the rates the enumeration samples a range at, so it produced no entries at all. Its own bounds are published instead (#1317). -
[Core] Fixed: a capture device publishing its sample rate or channel count as a list disappeared from the device's format list entirely.
AudioCaptureDeviceInfo.Formatsread only the single-value and range forms, so a caps structure written asrate=(int){ 44100, 48000 }produced no entries at all rather than one per combination (#1317). -
[Core] Fixed: audio frames delivered as 24-bit-in-32 or as 20-/18-bit reported the wrong bytes per sample.
AudioFrame.Info.BPScarried the number of significant bits rather than the container width, so a consumer ofBufferSinkBlockorAudioSampleGrabberBlockread 3 bytes per sample where the buffer holds 4 (S24_32*) - a 25% undercount that garbles the audio - and 2 bytes where 20- and 18-bit formats hold 3.S24BEreported 0. Unchanged for 8-, 16-, 32- and 64-bit formats, which is everything the SDK produces by default (#1317). -
[Core] Fixed: 24-bit-in-32 audio formats were dropped from capture-device format lists and could not be requested. GStreamer writes these as
S24_32LE/S24_32BE/U24_32LE/U24_32BEwhile theAudioFormatXenum spells them without the underscore, and the SDK converted between the two by name. A device offering one of them lost it fromAudioCaptureDeviceInfo.Formats, and asking for it anywhere a format is applied - audio capture, the audio mixer, WAV output, a push source, the iOS/Mac audio renderer - produced a format name no element accepts. Both directions are now translated (#1317). -
[Core] On macOS and Mac Catalyst the default audio capture format now follows the device's own sample rate.
AudioCaptureDeviceInfo.GetDefaultFormat()preferred 44100 Hz and, when a device published no 16-bit stereo combination at all, fell back to whichever entry sorted first alphabetically. Since the capture format is applied to the capture device itself, that could ask CoreAudio to run an input at a rate it does not use - CoreAudio cannot resample an input, so the hardware's nominal rate was changed instead. The rate now comes from the format the device reports as its own; 16-bit stereo is still preferred for the sample format and channel count, which CoreAudio does convert. Devices publishing 16-bit stereo at 44100 or 48000 Hz - the common case - keep the format they had (#1317). -
[Media Blocks SDK .Net]
IsAvailable()on the video and audio encoders and decoders no longer reports a codec that cannot actually be created. It answered from the GStreamer registry alone, and the registry caches a plugin's element list while the elements a plugin registers are decided when it loads — the Media Foundation plugin names its encoders by hardware-MFT enumeration index, and the NVIDIA, Intel and Direct3D plugins register their elements only for the hardware present at scan time. After a driver, GPU or Windows-codec change the registry could still list an element the plugin no longer provides;IsAvailable()returnedtrueand the pipeline then failed to build with an unrelated-looking error. The check now also loads the element's plugin and asks it again, which refreshes the registry's list for that plugin. The firstIsAvailable()call for a given backend is correspondingly slower, since it now loads that backend's plugin — around 0.3 s for NVIDIA and 0.7 s for Media Foundation on the measured host, once per plugin per process — and that plugin's vendor libraries are loaded into the process even if the pipeline ends up encoding in software (#1175). -
[Media Blocks SDK .Net]
MFH264EncoderSettings.GetDeviceIDs()andMFHEVCEncoderSettings.GetDeviceIDs()no longer list a Media Foundation device that cannot be created, and they identify each device from the loaded MFT rather than from the cached registry metadata, which could name a different encoder. Two consequences on a host where such a stale entry existed: a device that used to appear and then fail is now absent, andDeviceID— a position in this list — can shift, so an application that persisted aDeviceIDshould re-resolve it againstGetDeviceIDs()rather than assume last run's number (#1175). -
[Media Blocks SDK .Net] Windows: using a Media Foundation encoder no longer permanently breaks every later NVIDIA NVENC encode in the process. GStreamer eagerly activated NVIDIA's Media Foundation H.264 and HEVC MFTs while registering the plugin, even when the pipeline only requested the Microsoft AAC encoder. If the public NVENC API had already been initialized, the next
nvh264enc/nvh265encsession failed withNV_ENC_ERR_INVALID_VERSION(0xf) and no later session could recover. The bundled Media Foundation plugin now excludes NVIDIA's video MFTs beforeIMFActivate::ActivateObject. Microsoft, Intel, AMD, software Media Foundation video encoders, all Media Foundation audio codecs, video capture (mfvideosrc) and device enumeration remain available. What changes on an NVIDIA machine: NVIDIA's Media Foundation video encoders are no longer registered by the plugin.MFH264EncoderSettingsandMFHEVCEncoderSettingskeep selecting the same encoder and the sameDeviceIDnumbering as before — they already excluded NVIDIA entries when enumerating — with one exception: a host whose only Media Foundation HEVC encoder was NVIDIA's. There the settings class enumerated nothing and fell back to the baremfh265encelement, which used to be the NVIDIA one; nothing registers that name now, soHEVCEncoderBlock.IsAvailable(new MFHEVCEncoderSettings())returnsfalseandHEVCEncoderType.MF_HEVCis unavailable. Install the Microsoft HEVC Video Extensions, or encode HEVC throughNVENCHEVCEncoderSettings. H.264 is not affected in the same way: Windows always registers the Microsoft software H.264 MFT. What changes is the plain GStreamer element:mfh264encandmfh265encare now backed by the next non-NVIDIA MFT on the host — Intel or AMD hardware where present, otherwise the Microsoft software H.264 MFT and the HEVC Video Extension — so a hand-written pipeline string naming them gets a different encoder. UseNVENCH264EncoderSettings,NVENCHEVCEncoderSettingsorNVENCAV1EncoderSettingsfor NVIDIA hardware encoding; they are unaffected and are the faster path in any case (#842). -
[Media Blocks SDK .Net]
MFAACEncoderSettingsis no longer deprecated. It was marked obsolete because using it broke NVENC later in the same process; that was never the AAC encoder's doing — requesting it loads the Media Foundation plugin, whose video-MFT registration was the real cause, and that is fixed above. Code using it no longer produces a compiler warning.AVENCAACEncoderSettingsstays the Windows default forMP4Output; preferMFAACEncoderSettingsforVideoEditCoreXrender paths, where libav AAC does not round-trip the GstPreset (#842). -
[Media Blocks SDK .Net] Fixed:
AudioRendererBlock.Mutecould not turn audio back on on iOS and Mac Catalyst. Setting it tofalsewrote volume 0 again, leaving the renderer silent and reporting itself muted. Muting now preserves the configured volume, and unmuting restores audible output (#1318). -
[Core] Fixed: HTTPS and RTSPS connections on Mac Catalyst could not initialize TLS. The GStreamer runtime was searched for in a
libsubfolder that Mac Catalyst app bundles do not contain, so its OpenSSL TLS backend and certificate database were never loaded. The SDK now finds the bundled runtime and verifies TLS peers as on macOS (#1327). -
[Core] On macOS and Mac Catalyst an application no longer re-scans the whole GStreamer plugin set on every launch. The scan is now cached in the application's own Caches directory (
Library/Caches/VisioForge/<bundle-id>/gstreamer/, inside the sandbox container for a sandboxed app) and paid once - on the first start after installing or updating the application, and after that only for plugins whose files changed. Nothing needs to be deployed or configured; deleting the cache folder costs one more scan (#1299). -
[Core] On macOS and Mac Catalyst
GST_PLUGIN_PATHis no longer set in the .NET environment. It is published to the process environment GStreamer itself reads, which the .NET one on Unix never was - soEnvironment.GetEnvironmentVariable("GST_PLUGIN_PATH")now returns nothing on these platforms, and a child process started by the application no longer inherits the application's own plugin directory. Pass it explicitly to a child that needs it (#1299).
2026.8.30¶
-
[Media Blocks SDK .Net] Fixed: a chroma key saved into a pipeline document lost its source video resolution, and restored as a block that never worked.
ChromaKeySettingsX.SourceVideoResolutionis the one setting the keying filter cannot do without - it builds its video format from it - and it was read-only, so it was never written into a saved document and every restored chroma key came back with no resolution at all. Materialization reported success, and the failure showed up only when the pipeline was started: the block could not be built, and a block that cannot be built stops the whole pipeline from starting, with nothing in the diagnostics to say why. The property is now settable and round-trips, andChromaKeyBlockrefuses settings whose resolution is missing or has a zero extent, so such a document is reported as failing withMBS040naming the property instead of restoring a dead block (#1319). -
[Media Blocks SDK .Net] The OpenCV blocks now work on macOS. All sixteen blocks in the
VisioForge.Core.MediaBlocks.OpenCVnamespace,VideoStabilizationBlockamong them, were documented as cross-platform but their GStreamer plugin shipped for Windows only, so on macOS every one of them reportedIsAvailable()asfalse. Add the new VisioForge.CrossPlatform.OpenCV.macOS redistributable alongsideVisioForge.CrossPlatform.Core.macOSand they work as they do on Windows. The package is one universal (x64 + ARM64) plugin with OpenCV 4.14.0 linked into it, so there are no separate OpenCV libraries to deploy. Linux, iOS, Mac Catalyst, Android and Windows arm64 still have no OpenCV redistributable and the blocks stay unavailable there (#1283). -
[Media Blocks SDK .Net] Fixed: on macOS
CVFaceDetectBlock,CVFaceBlurBlockandCVHandDetectBlocknever found their default Haar cascade files. The default cascade names were resolved against anx64orx86subfolder of the application directory and nowhere else - a layout only the Windows redistributables create. Detection silently produced no results, with the cause visible only in the GStreamer log. The cascades are now looked up in the redistributable's own layout on every platform. Setting a cascade property to a full path is unaffected (#1283). -
[Core] Fixed: reading or writing a GStreamer property whose type is
glongorgulongthrewEntryPointNotFoundExceptionon Windows. Those two value types were read and written through four native functions that no shipped GStreamer build has ever exported, so every access to such a property failed on x86, x64 and ARM64 alike. They now go through the standard GLib accessors, and a value too large for the 32-bit Windowsglongis reported as an overflow rather than stored as a different number (#1160). -
[Demos] Fixed: restarting the Bridge Demo no longer leaves an MP4 recorder running in the background. Starting another recording now finalizes and releases the preceding recorder first, whether Start is pressed again directly or after Stop. The output file is no longer held open by an abandoned muxer, and completed recordings retain their MP4 index.
-
[Demos] Fixed: several demos started an operation and moved on without waiting for it. The Bridge, Bridge Source Switch, Audio Extractor and all three PreEventRecording demos (WPF and both Avalonia heads) destroyed the SDK, or let the process go, while engine teardown was still running - a recording being closed with the window could be left unfinalized, and the Media Blocks Avalonia one disposed its pipeline without stopping it first. Those window-close handlers now cancel the close, finish stopping and disposing, and then close for real; a second close request during teardown no longer slips past. The RTSP MultiViewSync demo's Stop button returned before the three pipelines had stopped, and the Video Edit Main Demo's Join button reported completion immediately; both now wait. The macOS Simple Media Player closed its window without blocking the main thread on player teardown, and the two Avalonia PreEventRecording motion handlers no longer block an SDK callback thread on the UI thread.
-
[Media Blocks SDK .Net]
OSXAudioSourceBlockhas been removed - useSystemAudioSourceBlockwithOSXAudioSourceSettings. It was a leftover second macOS audio capture block: it built the sameosxaudiosrc, but ignored the requested audio format and offered no volume or mute control, and nothing in the SDK, the demos or the documentation samples that actually ran ever created it -OSXAudioSourceSettings.CreateBlock(),DeviceEnumeratorand every macOS demo have built aSystemAudioSourceBlockfor years. Replacenew OSXAudioSourceBlock(settings)withnew SystemAudioSourceBlock(settings); the settings class, the device selection and the captured audio are unchanged. A pipeline JSON document saved with that block in it names a block type the SDK no longer has, so it is reported as unknown at validation and restores without its audio source - rebuild and re-save such a document (#1290). -
[Media Blocks SDK .Net] Fixed: on macOS and Mac Catalyst the audio format requested through
OSXAudioSourceSettings.Formatwas silently ignored. The capture device negotiated whatever it preferred - typically 32-bit float - so an application asking for 16-bit stereo got something else without any warning. The requested sample format, sample rate and channel count now reachosxaudiosrc.Formatno longer defaults to a hardcoded 16-bit 44100 Hz stereo, because that value is now enforced and no longer a placeholder: leave it null to let the device choose, or take a real one from the enumeration withAudioCaptureDeviceInfo.GetDefaultFormat(), which is whatCreateSourceSettings()already does (#1290). -
[Media Blocks SDK .Net] The Metal video processing blocks now work on an iOS device.
MetalVideoCompositorBlock,MetalConvertScaleBlock,MetalTransformBlock,MetalDeinterlaceBlock,MetalOverlayBlockandMetalVideoFilterBlockwere documented as available on iOS and compiled there, but the Metal plugin behind them was never loaded, so every one of them reportedIsAvailable()asfalseand could not be built into a pipeline. The plugin is now part of the iOS runtime, and it is the same current build the macOS and Mac Catalyst packages carry - soMetalVideoCompositorBlockalso composes onto an output of any size, rather than failing negotiation whenever something downstream asked for a size other than the size of its inputs. Two limits remain, both unchanged: the Metal renderer (MetalVideoRendererSettings) is macOS only, and the blocks are unavailable in the iOS Simulator, whereIsAvailable()still returnsfalse(#1296). -
[Media Blocks SDK .Net] Fixed: a pipeline document naming
VideoMixerSourcepassed validation and then failed to build, and the mixer's sources were never saved in the first place.MediaBlocksPipelineValidatorreported the block as constructible whileMediaBlocksPipelineMaterializerthrewMBS040: ... The method or operation is not implementedand discarded the whole pipeline, becauseVideoMixerSourceSettings.CreateBlock()was not implemented. It now builds the block, so a document restores it. The settings also persist their inputs: the sources, their rectangles and their chroma keys were held in a private list that was silently left out of every saved document and everyToDocument()snapshot, so a two-camera mixer came back as an empty canvas. They are now the publicVideoMixerSourceSettings.Sourceslist ofVideoMixerSourceStream, written and read with the source's own settings class named in the JSON; a source class this build does not contain - several are platform-specific - is reported rather than restored as an empty input. Capturing a live pipeline now also warns (MBS060) about any block the document cannot rebuild, instead of reporting the snapshot complete. API change:VideoMixerSourceBlocknow derives fromSuperMediaBlockrather thanSourceMediaBlock, which is what lets a block built fromVideoMixerSourceSettings.CreateBlock()wire itself up when you connect only its output - previously that produced a pipeline that stalled at start with no error. It keeps behaving as a source; the only members it no longer inherits areStop(), which did nothing, andIsSubtitlesAvailable(), which it still provides. Renamed arguments:VideoMixerSourceSettings.Add(source, left, top, width, height)never took a width and a height - the last two arguments went straight intoRect(left, top, right, bottom), soAdd(src, 960, 0, 960, 1080)produced a zero-width input, not a 960-wide one. The parameters are now namedrightandbottom. Behaviour is unchanged, so positional calls keep working; a call that passed the arguments by name (width:/height:) no longer compiles, and it was producing the rectangle the new names describe all along (#1230). -
[Core] The Windows GStreamer plugin cache is now kept per SDK version, and a rebuilt plugin of the same size is no longer ignored. On Windows the SDK mirrors an application's
x64/x86native folder into a shared folder under%PUBLIC%\.gstreamerand loads from there, so that every VisioForge application on the machine shares one warm GStreamer plugin registry instead of each paying a full cold scan. That folder was shared by every SDK version ever run on the machine and was only ever added to, so a native library a newer release no longer ships stayed on the load path indefinitely - an application could keep working on a machine that had run an older release and fail on a clean one. It is now%PUBLIC%\.gstreamer\<sdk-version>-<native-set>\<arch>, keyed to the SDK version together with a stamp of the core and Libav redistributables the application actually deployed, so deployments on different natives no longer overwrite each other's files on every start; a cache the SDK created and nothing has started for 30 days is removed, while a folder left by an older SDK that still uses the previous shared layout is left alone. Whether a cached file is up to date is decided by its size and its timestamp, rather than by size alone - a rebuilt library of the same size used to be kept forever. The first start after an SDK upgrade repopulates the cache and rebuilds the registry once.VisioForgeX.CacheFolderstill overrides the location: point it at the application's own native folder beforeInitSDKto skip the shared cache entirely and load exactly what the application deployed (#1289). -
[Core] Fixed: an ARM64 Windows application could not find the SDK's native libraries. The runtime looked for them in an
x64subfolder whatever the process architecture, while the ARM64 redistributable packages deploy toarm64, so initialization failed with "GStreamer libraries not found. Check the deployment and add required NuGet packages." x86, x64 and ARM64 processes now each use their own folder (#1289). -
[Media Blocks SDK .Net] Fixed:
AOMAV1EncoderSettingscan now create and configure the AOM AV1 encoder on macOS, Mac Catalyst, and Linux. The settings are applied for both Media Blocks pipelines and Video Capture / Video Edit output; the required AOM runtime is bundled for the Apple packages. Two defaults changed so that rate control actually works:MaxQuantizernow defaults to 63 - at its previous 0 the quantizer was pinned, the encoder ignoredTargetBitrate, the buffer sizes and the overshoot/undershoot values, and a 720p clip asked for 1500 kbits/sec was written at about 66 Mbits/sec - andTargetBitratenow defaults to 0, meaning the encoder scales its own default to the frame size (256 kbits/sec at 320x240, about 6900 kbits/sec at 1920x1080) instead of applying 256 kbits/sec at every resolution. Any value the encoder would refuse -CPUUsedoutside 0-9,DropFrame,OvershootPCTorUndershootPCTabove 100,TileColumnsorTileRowsabove 6, a resize or super-resolution denominator outside 8-16, a super-resolution threshold outside 1-63, aTargetBitrateabove 2000000 kbits/sec, a quantizer above 63 or a minimum above the maximum - is now left unapplied and reported as a warning rather than dropped in silence or failing the whole pipeline inside the encoder; a refused quantizer pair encodes at 0-63 rather than at the element's own 0, which would have disabled rate control.Threadsis now always resolved by the SDK: 0 and any value above the 64 threads the encoder accepts both become this machine's processor count, clamped to 1-64, because the encoder's own automatic count is not clamped and fails to initialize on a host wider than that.TileColumnsandTileRowsare log2 counts (0 = one, 1 = two, 2 = four), as the encoder takes them. AOM is intended for quality-focused offline encoding; prefer SVT-AV1 for general software encoding because it is substantially faster. On Windows, iOS and Android theav1encelement is still not part of the runtime, soAOMAV1EncoderSettings.IsAvailable()staysfalsethere (#1286). -
[Core] The OpenCV redistributable packages are rebuilt on OpenCV 4.14.0 and are much smaller.
VisioForge.CrossPlatform.OpenCV.Windows.x64and.x86shipped OpenCV 4.7.0 from February 2023 together with 42 OpenCV libraries the GStreamer OpenCV elements never load. They now carry OpenCV 4.14.0 and only the libraries those elements need, so the x86 package drops from 94 MB to 44 MB and the x64 package from 113 MB to 64 MB. Part of what the x86 package shed is a 26 MB 64-bitopencv_videoio_ffmpeg470_64.dllthat no 32-bit application could ever load. All 23 OpenCV elements are unchanged. The plugin now requires GStreamer 1.28 or newer - the version it is built against, and the version the matchingVisioForge.CrossPlatform.Core.Windows.*packages ship; it previously declared 1.22. An application that puts an older GStreamer ahead of the SDK's own onPATHwill find the plugin refused, and GStreamer reports that as a single warning, so the OpenCV elements would simply be missing (#1276). -
[Media Blocks SDK .Net] Fixed:
AV1EncoderBlockignored every SVT-AV1 setting, and several of them did nothing on the other engines too. In Media Blocks the encoder was built and then never configured, soPreset,TargetBitrate,MaxBitrate,CQP,CRFandIntraPeriodLengthwere all dropped and the encoder ran at its own defaults (preset 10, CRF 35). On every engine,Threads,Tier,TileColumnsandTileRowswere written to element propertiessvtav1encdoes not have, which GStreamer answers with a warning and no effect; they now reach the encoder the way SVT-AV1 takes them, andTileColumnsandTileRowsare log2 counts (0 = one, 1 = two, 2 = four) - up to 4 for columns, up to 6 for rows, and at most 128 tiles between them. Values above that are clamped rather than passed through: SVT-AV1 rejects such a configuration outright ("MaxTiles is 128 and MaxTileCols is 16") and the encoder can take the process down with it. Every other setting the encoder would refuse - aPresetoutside 0-13, a bitrate outside 1-100000 kbits/sec, aCQPorCRFoutside 1-63, anIntraPeriodLengthbelow -2 - is now left unapplied and reported as a warning instead of being dropped in silence, and so is any setting a different rate-control mode makes irrelevant. The encoder keeps its own working default in each case rather than being handed a value it cannot use.CQPnever took effect either, on any engine: the encoder picks its rate-control mode in the order bitrate, CRF, CQP, and CRF has a non-zero default, so a CQP-only configuration encoded in CRF mode - settingCQPnow disables CRF as it always claimed to. Behavior change: an application that set SVT-AV1 properties through Media Blocks and tuned around them being ignored will now get the encoder it asked for. (#835) -
[Media Blocks SDK .Net] Fixed: the default SVT-AV1 configuration produced a stream with no keyframes after the first.
IntraPeriodLengthdefaulted to-1, which this encoder reads as insert no further intra frames rather than automatic - so a recording was hard to seek, and a client joining an SRT or RIST stream mid-flight never received a keyframe and never rendered. The default is now-2, the encoder's own automatic setting; pass-1explicitly if a single-keyframe stream is what you want. This affected the VideoCaptureCoreX / VideoEditCoreX render path, where the value was applied; Media Blocks left the encoder at its own-2default because it applied nothing at all (#835). -
[Media Blocks SDK .Net] The SVT-AV1 encoder (
SVTAV1EncoderSettings) is now available on macOS and Mac Catalyst. Thesvtav1encelement and its library ship in the additional runtime package -VisioForge.CrossPlatform.Core.macOS.AddsandVisioForge.CrossPlatform.Core.macCatalyst.Adds- the same waygstsvtav1.dllhas always shipped in the Windows.Addspackages. Reference the.Addspackage for your platform beside the core one -VisioForge.CrossPlatform.Core.macOS.Adds2026.8.25 or newer,VisioForge.CrossPlatform.Core.macCatalyst.Adds2026.8.26 or newer; without itAV1EncoderBlock.IsAvailable(new SVTAV1EncoderSettings())returnsfalseand the rav1e encoder (RAV1EEncoderSettings) remains the software AV1 option. On iOS no AV1 encoder is available at all (#835). -
[Core] Fixed: AV1 files did not play on iOS. No AV1 decoder was registered at all, and GStreamer's FFmpeg wrapper deliberately does not provide one, so playback worked only on the chips whose VideoToolbox decodes AV1 (A17 Pro and later) and produced nothing anywhere else. The
dav1dsoftware decoder is now registered on iOS, so AV1 plays on every supported device; VideoToolbox is still preferred where the hardware has it. AV1 encoding remains unavailable on iOS - Apple ships no AV1 hardware encoder, and the software AV1 encoders are not part of the iOS redistributable, soSVTAV1EncoderSettingsandRAV1EEncoderSettingsreport unavailable there (#1287). -
[Core] Fixed: several Apple VideoToolbox encoder settings did nothing on iOS.
ForceHWUsagewas ignored,PreserveAlphawas not offered at all,AppleMediaHEVCProfile.Main10warned that it could not negotiate, andRateControl/DataRateLimitBitrate/DataRateLimitDurationwere dropped with a warning - all because the SDK still assumed the iOS runtime was the old GStreamer 1.24.9 build. iOS has shipped 1.28.6 for some time, so the HEVC alpha encoder (vtenc_h265a), 10-bit HEVC and the CBR/capped-ABR rate control now work there exactly as they do on macOS and Mac Catalyst.AppleMediaH264EncoderSettings.ForceHWUsage,AppleMediaHEVCEncoderSettings.ForceHWUsageandAppleMediaHEVCEncoderSettings.PreserveAlphaare now present in the iOS build;ForceHWUsagehas no effect there, because every VideoToolbox encoder on iOS is hardware and GStreamer registers no separate hardware-only element (#1287). -
[Core] Fixed: VP8 and VP9 were unavailable in the iOS Simulator. The
vpxplugin was registered only on a physical device, although the simulator framework contains it (#1287). -
[Core] Fixed: on Mac Catalyst no GStreamer log message ever reached the SDK. Every GStreamer debug line was routed to a static shim meant for iOS devices instead of to the SDK's own handler, so nothing appeared in the log context or in
Trace, and the DeckLink "Signal lost" notification - which is raised from that handler - never fired on this platform.Gst.GstDebug.RemoveLogFunctionalso always reported that it had removed nothing, so a host's own log handler installed throughGst.GstDebug.AddLogFunctioncould not be taken down again. Mac Catalyst now behaves exactly as macOS does: log messages are delivered to managed handlers and removing a handler works. Real iOS is unchanged (#1259). -
[Media Blocks SDK .Net] Fixed: an RTSP RAW or NDI source restored from a pipeline document validated clean, built clean and then refused to start.
StartAsyncreturnedfalsewith "Media info is not available" or "Unable to get NDISource info.", because a document carries a source's endpoint but never its media information, and those two sources pick their elements from it - the depayloader and parser for RTSP RAW, the converters for NDI on desktop.MediaBlocksPipeline.StartAsyncnow probes such a source once, before it builds the graph, so a restored pipeline starts the way a hand-built one does - as does one whose settings you construct with the public constructor and configure by hand.VideoCaptureCoreXandMediaPlayerCoreXbuild their graph through the synchronousStart, so an NDI or RTSP RAW source there still needsNDISourceSettings.CreateAsync/RTSPRAWSourceSettings.CreateAsync, as before. The endpoint has to be reachable at that moment, and a source that cannot be read is reported by name. The synchronousStarthas nowhere to await a probe and is unchanged - useRTSPRAWSourceSettings.CreateAsync/NDISourceSettings.CreateAsyncthere.NDISourceSettingsgains aReadInfoAsyncmethod for probing an existing instance. Behavior change:MediaBlocksPipeline.Connectnow returnsfalsewhen a block it would have to add is refused - it reported success and left the block out of the pipeline before, so the graph was built without it and nothing said so. That happens when the pipeline is not stopped: useAddBlockLive/ConnectLiveto change a running graph (#1229).
2026.8.29¶
-
[Core] Fixed: Mac Catalyst reported one placeholder audio device and never asked for camera or microphone permission.
AudioSources/AudioSourcesAsyncandAudioOutputs/AudioOutputsAsyncanswered every Catalyst caller with a single "Default" entry carrying no CoreAudio identity, the audio device monitors refused to start (soOnDeviceEnumerationCompletednever fired for them), and the permission request was skipped outright. All three are lifted: Catalyst now enumerates the real CoreAudio inputs and outputs, its audio monitors run, and camera and microphone access is requested the same way as on macOS. The behaviour was introduced against a deadlock that turned out to belong to a test host launched as a bare executable rather than to Mac Catalyst itself. Action required for Mac Catalyst apps: the bundle'sInfo.plistmust now declareNSCameraUsageDescriptionandNSMicrophoneUsageDescription- the system terminates a process that requests access without them, rather than denying it - and preferAudioSourcesAsync/AudioOutputsAsyncover the synchronous overloads there, since starting the CoreAudio device provider waits behind the permission prompt (#1242). -
[Media Blocks SDK .Net] Fixed: a pipeline that was stopped and disposed still held every block it contained, so memory grew with each pipeline an application built. Each block's input and output pads carry an end-of-stream probe whose callback is pinned for the life of the underlying GStreamer pad, and nothing released it - the pad, the block, its settings and its encoder or renderer element all stayed alive for the rest of the process. Disposing a pipeline now releases the pads of every block it owns, and a block disposed on its own releases its own; restarting a stopped pipeline is unaffected (#827).
-
[Core] New:
Gst.Contextis now part of the SDK, andElement.GetContexts()hands back real contexts instead of unusable list wrappers. The generated type had been left out of the build and, as generated, was unusable - a structure with no fields at all, so every one of its members was commented out because it would have handed GStreamer a one-byte buffer where a context pointer belongs. It now carries the native context handle and its members work: constructing a context from its type, reading the context type, the payload structure (read-only and writable) and the persistent and writable flags, testing the type, taking a writable copy withMakeWritable(), andRef/Unref.Gst.Element.SetContextis new, and theGst.Element.Contextsproperty is replaced by aGst.Element.GetContexts()method returningGst.Context[]- a breaking change against the previous release, where it wasGLib.List[]. It is a method because every call takes a reference on every context that is yours to give back: call it once into a local, release each context with its ownUnref(), and do not touch the array afterwards. That replaces the previously documented release step,Gst.Global.ContextReplace(ref handle). A struct has no finalizer, so release a long-lived context once, on the owning instance, sinceContextcopies share the handle; after that release, and on the empty valueGst.Context.Zero, its members throwObjectDisposedExceptionandInvalidOperationExceptionrather than handingNULLto GStreamer, andIsEmptyis the empty-state discriminator. In the same spirit, three calls that GStreamer would have answered with a log line and a plausible-looking result now say what is wrong:WritableStructure()throwsInvalidOperationExceptionon a context something else already holds a reference to (only an unshared context is writable, so write before setting it on an element, not after),Element.SetContextthrowsArgumentExceptionon an empty or released context instead of silently doing nothing, and a null context type is refused rather than turned into an empty context or a false type match. The struct also carries an internal released flag next to the handle, so passGst.Contextvalues to native code by theirhandlefield, not by marshaling the struct itself.Gst.Uri.Zeroand the newGst.Context.Zeroarestatic readonlyrather than plain static fields: now that both structs carry a handle, assigning to the shared empty value would have poisoned it process-wide, so code that wrote toGst.Uri.Zerono longer compiles.Gst.TocandGst.TocEntryhad the same field-less defect and are covered by their own entry below (#1257). -
[Core] New:
Gst.TocandGst.TocEntryare now part of the SDK, so chapters can be read from a file and written into one. Both generated types had been left out of the build and, as generated, were unusable - structures with no fields at all, so every member handed GStreamer a one-byte buffer where a table-of-contents pointer belongs. They now carry the native handle and their members work: building a table of contents and nesting entries under it, reading and writing entry tags (the chapter title lives there), start/stop times and loops, finding an entry by UID at any depth, andRef/Unref/Copy.Toc.GetEntries()andTocEntry.GetSubEntries()returnGst.TocEntry[]and replace theToc.Entries/TocEntry.SubEntriesproperties, which handed back raw handles. Everything a table of contents is actually reached through came back with them:Message.ParseToc/Message.NewToc,Event.ParseToc/Event.NewToc,DiscovererInfo.Toc,DiscovererStreamInfo.Toc, andTocSetterAdapter.GetToc()/SetToc()- so a TOC can be pulled off the pipeline bus or the discoverer and set on a muxer such asmatroskamux- chapters written into a Matroska file this way read back out of it with their titles and start/stop times, nested under the edition Matroska wraps them in. The table of contents on aGst.ITocSetteris aGetToc()/SetToc()pair rather than aTocproperty, because the two halves have opposite ownership: reading takes a reference that is yours to release, writing leaves the reference with you.Toc.AppendEntryandTocEntry.AppendSubEntrytake their argument byref: the call takes the entry's reference over, and passing by reference is what lets the binding mark the caller's value released so a laterUnref()cannot corrupt GStreamer's reference count. Values that come from a getter GStreamer does not transfer - the entries of a TOC, an entry's parent or sub-entries, a discoverer's TOC - are borrowed: they are readable and editable but refuseUnref(), andIsBorrowedreports which is which; takeRef()orCopy()to keep one past its owner. Calls GStreamer would have answered with a log line and a plausible-looking result now say what is wrong: writing tags to or appending an entry to something else already holds a reference to, appending an entry that already belongs to a table of contents, parsing a TOC out of a message or event that is not a TOC one, and null or out-of-range arguments are all refused with an exception. A struct has no finalizer, so release a long-lived value once, on the owning instance; after that release, and on the empty valuesGst.Toc.Zero/Gst.TocEntry.Zero, members throw rather than handingNULLto GStreamer, andIsEmptyis the empty-state discriminator - it is also how a missedFindEntryand a top-level entry's absent parent report themselves. As withGst.Context, pass these values to native code by theirhandlefield, not by marshaling the struct itself (#1257). -
[Core] Fixed:
GES.Global.ListAssets()could hand out freed assets and leaked a native list on every call. GES lends out the assets its cache owns and asks the caller to free only the list holding them, but the binding did the opposite - it kept the list and released every asset, spending the reference the cache still relies on. An asset could then be finalized while still registered, so a later request for the same asset returned freed memory. The assets are now left alone and the list is released (#1231). -
[Core] Fixed: overriding a gio or GES virtual method that returns a list could corrupt memory or crash.
FileEnumerator.OnNextFilesFinish, the fourResolverlookups, the threeVolumeMonitorcollections,GES.Container.OnUngroupand the GES track-element creation callback each built two native lists over the same result and released neither, referencing every element twice and then walking the already-freed list from the finalizer, which crashes the process. Every callback that returns a list now hands the caller exactly one, with the ownership its documented transfer mode calls for, and gives up its own claim on it - so a list an override built and still holds is no longer freed twice (Resolver.OnLookupRecords,OnLookupRecordsFinish,TlsDatabase.OnLookupCertificatesIssuedBy,OnLookupCertificatesIssuedByFinish).Resolver.OnLookupServiceandOnLookupServiceFinishadditionally threw on every call and could not be overridden at all; they now work (#1248, #1247). -
[Media Blocks SDK .Net] Windows: the bundled GStreamer runtime moves from 1.28.2 to 1.28.6, on x64, x86 and ARM64. 1.28.3 through 1.28.6 are bug-fix and security-fix releases - nvcodec, RTP/RTCP,
h264parse/h265parseduration handling, a compositor regression and HLS live seekable ranges among them - and Windows now matches the runtime macOS, Mac Catalyst and iOS already ship. The WASAPI capture buffer size restored in 2026.8.1 is unaffected: the patchedwasapi2src/wasapi2sinkwere rebuilt against 1.28.6 and re-measured, since the upstream defect is still present in this release. New elements, on x64 and x86:objectdetectionoverlayandsegmentationoverlayfor drawing detection and segmentation results,onvifmeta2relationmeta/relationmeta2onvifmetafor moving analytics metadata to and from ONVIF,burn-yoloxinferencefor YOLOX inference,demucsfor audio source separation,msesrc, the curl sinks and source (curlhttpsink,curlfilesink,curlftpsink,curlsmtpsink,curlhttpsrc), andoriginalbuffersave/originalbufferrestore.rsvgdecandrsvgoverlayreach x86, which did not have them; x64 already did. ARM64 gains no elements in this release and losesdvdreadsrcandrsndvdbin- upstream no longer builds the DVD plugins for that architecture. No bundled library changes file name on x64 or x86, so an incremental rebuild needs nothing special there. -
[Media Blocks SDK .Net] Windows ARM64:
VisioForge.CrossPlatform.Core.Windows.Adds.arm64is an add-on package now, not a second copy of the runtime. It used to mirror the whole GStreamer install, so installing it next toVisioForge.CrossPlatform.Core.Windows.arm64downloaded 55 MB twice and wrote every file into the output folder twice, with no way to tell which copy won. It now carries only the additional plugins and their private dependencies, exactly as the x64 and x86 Adds packages do, and declares a dependency on the ARM64 Core package - referencing the Adds package alone is enough, NuGet brings the Core package with it. Nothing is lost: the two packages together still ship every element ARM64 had before.rsvgdecandrsvgoverlayalso move from the x86 Adds package into the x86 Core package, so the SVG elements come from the same package on all three architectures (#1261). -
[Media Blocks SDK .Net] Windows ARM64: three x64 DLLs that could never load are no longer shipped in the ARM64 runtime.
libgcc_s_seh-1.dll,libstdc++-6.dllandlibwinpthread-1.dllcame straight from the upstream ARM64 GStreamer installer, which ships the x64 MinGW runtime under its ARM64 tree; nothing in the ARM64 packages referenced them. Removing them makes the package about 8 MB smaller to download (27 MB on disk) with no element lost (#1261). -
[Media Blocks SDK .Net] Windows x64 and x86: the unused MinGW C++ runtime is no longer shipped. The GStreamer build drops
libstdc++-6.dlland friends into an otherwise MSVC runtime, and on x64 nothing referenced any of them -libgcc_s_seh-1.dll,libstdc++-6.dllandlibwinpthread-1.dllare all gone, about 8 MB less to download (27.9 MB on disk). On x86 onlylibstdc++-6.dllgoes, about 7.5 MB less (23.9 MB on disk): the rest of that runtime is really used there, by the mp3 decoder. Every plugin still loads on both architectures - verified withgst-inspect-1.0against the package files alone, 192 plugins and none blacklisted (#1277). -
[Core] Fixed:
GLib.ListandGLib.SListleaked the string copies they allocate. Building a list from managed strings withelementsOwned: falseduplicated every string into glib memory and freed nothing on dispose, leaking each copy for the life of the process. The wrapper now releases the storage it allocated itself onDispose()/Empty(), while elements a native list lent it stay untouched - a list mixing borrowed and managed elements frees exactly what it allocated. A borrowed wrapper that released element storage refuses further use: reads and appends throwObjectDisposedExceptioninstead of touching freed memory, while an owned list survivesEmpty()as an empty list whose later string appends are released on the nextEmpty().Clone()of a string list frees its copies on the clone instead of the source (#1232). -
[Core] Fixed: six more list-returning GStreamer properties handed back unreadable elements and leaked.
VideoDecoder.Frames,VideoEncoder.Frames,Toc.Entries,TocEntry.SubEntries,Adapter.GetListandAdapter.TakeListall typed their elements as the list container itself, so every element was a wrapper over a pointer that is not a list node and read as garbage. Where GStreamer transfers ownership of the elements, disposing that array also released each of them as if it were a GObject - which GStreamer silently ignores, leaking a reference per element on every call. Each property now returns its real element type with the ownership GStreamer documents:Gst.Buffer[]for the twoAdaptermethods, which release themselves, and raw handles forVideoDecoder.Frames/VideoEncoder.Frames, whose element type cannot carry a native pointer. Note where GStreamer transfers ownership, the reference is now yours to release: each handle from those two with the newGst.Video.VideoCodecFrame.Unref(IntPtr). The two table-of-contents properties are covered by theGst.Tocentry above. The oldGLib.List[]signatures are removed. The element contexts carried the same defect and are covered by theGst.Element.GetContexts()entry above (#1240). -
[Core] Fixed: native text in GStreamer binding structures was decoded with the system ANSI codepage instead of UTF-8. Names, descriptions, hosts, credentials and addresses read through
ElementFactory.StaticPadTemplates,Gst.Video.VideoFormatInfo,Gst.Audio.AudioFormatInfo,Gst.FormatDefinition,Gst.PluginDesc,Gst.Rtp.RTPPayloadInfo, the RTSP (RTSPUrl,RTSPTransport,RTSPAuthParam,RTSPAuthCredential,RTSPAddress), SDP, WebRTC, gio and Pango structures all came back as mojibake on any Windows codepage that is not UTF-8. They now decode as UTF-8.ElementFactory.StaticPadTemplatesadditionally leaked a string copy on every access to a template'sGet()orCapsand handed GStreamer a re-encoded copy of its own text in place of the original; that leak is gone. Two consequences there, both breaking:Gst.StaticPadTemplate.NameTemplateandGst.StaticCaps.Stringare now read-only properties rather than settable fields (they carry the native pointer, and code that assigned one, took it byref/out, or reflected over it as a field will not compile), and comparing twoStaticPadTemplateorStaticCapsvalues now compares the native text identity rather than the decoded characters (#1240).
2026.8.28¶
-
[Core] Fixed: GStreamer wrapper members silently did nothing after
Dispose(). Calling any member of a disposedGst.Caps,Buffer,BufferList,TagList,Structure,Message,Event,Query,Sample,Memory,MiniObject,DateTime,Iterator,PromiseorDebugMessagehanded a NULL handle to GStreamer, which logged a silent critical and carried on — or returned a quiet default that looked like real data; the struct-field accessors (Buffer.Pts,Caps/Structurefield reads) read through a NULL pointer outright. Those members now throwObjectDisposedExceptionnaming the type, so the misuse surfaces at the call site.Dispose()stays idempotent, andHandle,Owned,EqualsandGetHashCodekeep working on a disposed wrapper, so release-once code and comparisons are unaffected. Also fixed here, the same defect in three places:new Gst.Sample(buffer, caps, segment, null),Message.AddRedirectEntry(location)— which threw on every call — andBuffer.ReplaceMemory/ReplaceAllMemory/ReplaceMemoryRangewith a null memory (the way to drop memory blocks without inserting a replacement) all threwNullReferenceException, because the optional argument was dereferenced before its own null check (#1241). -
[Core] Fixed:
Gst.GstDebug.GetAllCategories()returned unusable data. Its elements were typed asGLib.SListwhile GStreamer actually hands back debug categories, so reading an element produced garbage values or a crash, and a category's name and description were unreachable. The method now returnsGst.DebugCategory[]- a value-copy struct exposing the category name, description, color and current threshold, decoded as UTF-8. Two members that silently did nothing now throwNotSupportedExceptionand are marked[Obsolete]:DebugCategory.Free()(deprecated upstream no-op) andDebugCategory.ResetThreshold()(wrote into a temporary copy, never into the live category).DebugCategoryequality now compares the category's native identity plus the copy's threshold and color, instead of comparing decoded strings. The oldGLib.SList[]signature is removed (#1233). -
[Core] Fixed: starting or stopping audio on iOS could hang the app. The bundled iOS GStreamer held the audio ring-buffer lock across the CoreAudio start/stop calls that wait for the render callback to finish; the render callback takes the same lock. The start path was already fixed upstream for iOS 17+, and the same fix now covers the stop path and the pre-1.28 render-callback teardown (#1131).
- [Core] The iOS bundled GStreamer runtime moved from 1.24.9 to 1.28.6, matching macOS and macCatalyst. Brings the 1.26/1.28 plugin set to iOS (the reworked direct-rendering decode path,
io_proc_droppingaudio teardown, the VideoToolbox rate-control properties and the alpha encoder variant) and ends the divergence where iOS alone shipped a runtime without the deadlock fixes above. The Metal compositor plugin (vfmetalcompositor) is now part of the iOS framework. The official 1.28.6 iOS package no longer carriesfrei0r, and it replacesy4mdec/y4mencwith the singley4mplugin. - [Media Blocks SDK .Net] Fixed: stopping a capture session after a source error could crash the process. A microphone or other live source that failed during the session no longer access-violates on
StopAsync; a recording that was still producing video is still finalized (#825). - [Media Player SDK .Net] Fixed: switching audio on a multi-track file jumped the picture back to the first video track, and switching video silenced the playing audio.
Audio_Stream_Select/Video_Stream_SelectonMediaPlayerCoreXandSimplePlayerCoreXnow keep the streams they are not switching.SimplePlayerCoreX.Audio_Streams_Currentreports the active audio index instead of a hardcoded1(#1216). - [Core]
Gst.Urimembers now throw on a released or empty instance instead of failing silently. Reading a property, converting to a string or mutating aGst.Uriafter itsUnref()— or on the empty valueGst.Uri.Zero— used to handNULLto GStreamer, which logged a silent critical or quietly returned an empty result indistinguishable from a real one. These members now throwObjectDisposedExceptionafter release andInvalidOperationExceptionon the empty handle; managed comparison (Equals/GetHashCode), a repeatedUnref()andToString()on the empty value (it renders as an empty string) keep working. The newIsEmptyproperty is the parse-failure discriminator. Struct copies taken before the release still share the handle and stay unreusable after it — release once, on the owning instance. The struct also carries an internal released flag next to the handle, so passGst.Urivalues by theirhandlefield to native code, not by marshaling the struct itself (16 bytes on 64-bit) (#1236). - [Core] New:
Gst.Uriis now part of the SDK. The generated type had been left out of the build and, as generated, was unusable. It now carries the native URI handle and its members work: constructing from parts or parsing a string, reading scheme, host, path, fragment, the query table and the query keys, joining a reference against a base. The handles the constructors return own a reference and a struct has no finalizer, so release a long-lived one with itsUnref()method - once, on the owning instance, sinceUricopies share the handle. Also,GLib.PtrArray.Clone()on an elements-owned array whose element type is not a GObject now throwsArgumentExceptioninstead of silently sharing element storage that dies with the source (#1205). - [Core] Fixed:
GES.TrackElement.AllControlBindingsreturned garbage on every read. GStreamer hands back a hash table there, not a list, and the binding read the hash table's memory as a list. The property now returns the control-binding property names throughg_hash_table_get_keysand frees the temporary list it builds; the list marshaller refuses any non-list native return with a clear exception, and aNULLreturn still reads as an empty array (#1205). - [Core] Fixed:
Gst.GstDebug.GetAllCategories()leaked the native category list on every call. GStreamer hands back a copy of the process-static debug categories that the caller must free, but theGLib.SListwrapper discarded its ownership flags, so disposing the wrapper freed neither that list nor - on any otherSList-based API - the elements it claimed to own. The flags are now honoured: an owned SList frees its container and takes a reference per GObject element, a borrowed one releases nothing; ownership of element storage it cannot release (boxed handles, raw ints, value-type copies) is refused withArgumentException,Clone()on both list wrappers now owns and frees its copy instead of leaking it and enumerating through a lost element type - and copies the elements themselves, so a clone survives its source's disposal - and every read of a disposed wrapper throwsObjectDisposedExceptioninstead of reading freed memory (#1205).
2026.8.27¶
- [Core] Fixed: device enumeration could hang forever on Mac Catalyst.
AudioOutputsAsync,AudioSourcesAsyncand camera/microphone permission requests relied on CoreAudio/AVFoundation calls that never return in some macabi processes; the permission ask is now bounded — skipped with a warning only where the query is measured to never answer — and audio enumeration falls back to a safe single default device, so Catalyst apps no longer wedge on startup-time enumeration (#1150). - [Core] Fixed: macOS startup logged hundreds of GIO module-load failures and a duplicate OpenSSL TLS backend registration. SSL initialization now loads only the intended GIO TLS module, once, instead of treating every dylib in the app bundle as a GIO module (#1200).
- [Core] Fixed: reading
Video_Streams,Audio_StreamsorSubtitle_Streamswhile a stream switch was in progress could throwInvalidOperationException. The bus thread used to empty and refill those lists in place; a property read that landed in the middle of that update now sees a complete snapshot (#1219). - [Video Edit SDK .Net] Fixed: audio settings changed between two renders on one
VideoEditCoreXwere silently ignored by the second render.Output_AudioChannelsandOutput_AudioSampleRatewritten after a render had finished never reached the rebuilt timeline's audio track, so the next output kept the previous render's channel count and sample rate. The output settings are now applied to the tracks of the pipeline being started (#850). - [Video Edit SDK .Net] Fixed:
Input_AddVideoLayerandInput_AddTestClipthrewNullReferenceExceptionwhen used after a render had finished. Both now rebuild the timeline first, asInput_Clear_Listand the file inputs already did, so a second editing session on one instance works (#850). - [Video Edit SDK .Net] Fixed:
Debug_Modedid not enable the SDK's debug-level diagnostics. The engine configured a debug logger but left its context in non-debug mode, so debug entries were dropped before reaching the log file (#850). - [Video Edit SDK .Net] Fixed: memory grew across renders that use fade transitions. Each
FadeIn/FadeOuton a clip leaked a GStreamer control source per render, so a long editing session or a batch of renders accumulated them (#850). - [Core]
GLib.Listnow refuses to build an element-owning list it cannot honour instead of corrupting reference counts. PassingelementsOwned: truewhile appending wrapped objects used to store their borrowed handles and release them onDispose(), spending references the list never took; it now takes a reference of its own for a GObject element, and throwsArgumentExceptionfor an element it cannot reference at all - anOpaque, an element that does not match the declared element type, or a disposed wrapper (#839). - [Core] Fixed: switching audio or video streams leaked a small amount of native memory on every switch.
Audio_Stream_Select/Video_Stream_SelectonMediaPlayerCoreXandSimplePlayerCoreXbuilt the SELECT_STREAMS stream-id list without ownership flags, so its disposal freed neither the list nodes nor the copied stream-ID strings; the list is now built owned and freed after the event is sent. A stream with no ID is now rejected with a log entry andfalse, whereSimplePlayerCoreXused to throw on a null stream and both engines silently sent an event that changed nothing (#1208). - [Core] Fixed:
Gst.Event.ParseSelectStreamsleaked the returned list. The C builds a fresh list of copied stream IDs and hands the ownership over, but the binding wrapped it without ownership flags, so disposing the wrapper freed neither the list nodes nor the strings (#1208). - [Core] New:
DeviceEnumerator.OnDeviceEnumerationCompletedreports when the first enumeration of a device list has finished, so an application can start a device monitor without waiting for it and show its own "enumerating..." state while the list fills throughOnVideoSourceAdded/OnAudioSourceAdded/OnAudioSinkAdded.DeviceEnumerationCompletedEventArgsnames the list:VideoSources,AudioSourcesorAudioOutputs(#1108). - [Core] Starting a device monitor no longer reads the device list while holding a lock shared by every
DeviceEnumeratorin the process. The monitor now waits for GStreamer to report that its device providers are up - they start on their own thread from GStreamer 1.28 on - and reads the list afterwards, when that read no longer blocks. On macOS the wait covers the camera or microphone permission dialog, so a dialog left on screen no longer holds up unrelated enumerations for as long as it is up (#1108). - [Media Blocks SDK .Net] Fixed: a recording or streaming branch could stop reporting end-of-stream, and a source could hand out a video or audio pad that was already dead. Across the output blocks (MP4, MKV, AVI, WebM, FLV, WMV, MP3, M4A, FLAC, Ogg, YouTube, Facebook Live), the RTMP/RTSP/NDI/UDP sources, the demuxers, the audio and video effects blocks and the overlay managers, a GStreamer pad was released while the block that owned it was still using it. Nothing failed visibly at the time - the next call on that pad simply did nothing - so the symptoms were downstream: end-of-stream never firing, a recording left unfinalized, or a pad handed to an
OnVideoPadAdded/OnAudioPadAddedsubscriber going inert as soon as the handler returned (#850). - [Media Blocks SDK .Net] Fixed:
InterPipeSinkBlock.IsAvailable()andInterPipeSourceBlock.IsAvailable()could report that InterPipe was installed when only the unrelated proxy elements were present. The probes now check the actualinterpipesinkandinterpipesrcelements, so platform and deployment availability is reported accurately (#1193). - [Core] Reading a queue's fill level no longer enumerates the element's whole property list.
QueueBlock.CurrentLevelBuffers,CurrentLevelBytesandCurrentLevelTimeare meant to be polled per frame, and each read used to build a managed descriptor for every property the element declares; a poll of all three now allocates about a fifth of what it did. The same applies to any element property probed throughPipelineHelper.ElementHasProperty, which additionally reportsfalsefor an element that has already been released instead of answering from the base element type. - [Media Blocks SDK .Net] A live pipeline can now be saved as a JSON document.
MediaBlocksPipeline.ToDocument()captures the running graph - blocks, their identities and their connections - andToJson()/SaveJsonAsync(path)write it out; the capture is safe while the pipeline is playing, which makes it the save-during-Run path. A block that does not expose its settings contributes its position but not its configuration, and says so through a diagnostic rather than producing a document that would rebuild it on defaults - checkMediaBlocksPipelineSnapshotResult.Completebefore treating a capture as a faithful copy. - [Media Blocks SDK .Net] A relative file path named by a
*Locationsetting now resolves against the document base directory, which is what the HLS sink calls its segments, its playlist and its init segment. - [Core] Fixed: reading or animating a video mixer input that has no sink pad crashed instead of reporting no such input. A stream added to the mixer settings after the block was built never gets a pad of its own, and reading it back or starting a fade or move on it walked off the end of the pad list. Such a call now returns
null/ does nothing and reports it through the log, onVideoMixerBlockandGLVideoMixerBlockon every platform and on the D3D11 compositor on Windows; the Metal compositor on macOS and iOS already behaved this way and now logs it too. A fade or move whose input pad is released while it is running also stops cleanly instead of leaving the input part-way through the animation (#1191). - [Core] Fixed: constructing a
GLib.PtrArraythrewEntryPointNotFoundExceptionon Windows. The type declared itsg_ptr_array_*entry points against libgobject and itsg_object_unrefagainst libglib - exactly backwards - so the first call into the type failed on Windows, while Linux and macOS resolved the symbols through library dependencies by accident. Each import now names the library that actually owns its symbol (#1207). - [Core] Fixed: cloning a
GLib.PtrArraycrashed the process, and every clone leaked the native container.Clone()calledg_ptr_array_copythrough a one-argument declaration, while the native function takes three (array, copy function, user data) - the missing arguments arrived as garbage and were called as a function pointer. It now declares the real signature and passes NULL for a shallow copy, as the C API allows, the clone owns its copied container soDispose()actually frees it, and cloning a disposed array throwsObjectDisposedExceptioninstead of crashing later (#1207). - [Media Blocks SDK .Net] New:
VideoMixerBlock.RemoveInputPadLiveremoves an input that was added withAddInputPadLiveand hands the mixer's input back to it. A live-added input used to occupy a mixer input permanently - the only way to reclaim it was to tear the pipeline down. Removal is safe against a running graph: the input is stopped and unlinked first, then the mixer reclaims its pad. Only live-added inputs can be removed; the inputs configured at build stay index-aligned with the mixer's stream settings. Also fixed: the tee helper and the muxer sinks'ConnectVideo(MP4, MKV, AVI, MOV, WebM, OGG, FLV, MPEG-TS) kept a requested pad when a connection failed instead of handing it back (#1210). - [Media Blocks SDK .Net] Fixed: the video and audio effect blocks could not be restored from a pipeline JSON document.
VideoBalance,VideoResize,VideoCrop,VideoBox, the OpenGL effects, the audio effects and thirty-odd of their siblings all failed with "no construction path", because their settings class is named after the effect -ResizeVideoEffect,CropVideoEffect- rather than ending inSettings. The block catalog now also reads a block's ownSettingsproperty. Across its 387 blocks, and counting the correction below, the number a document can restore went from 314 to 329 and the number a caller holding only a descriptor can create from 216 to 288 -TextOverlay,ImageOverlay,VideoMixer,HLSSinkand the OpenCV filters among them. - [Media Blocks SDK .Net] Fixed: a crop or a video box restored from a document came back cropping nothing.
CropVideoEffectandBoxVideoEffectkept their four edges behind a private setter, so the margins were dropped in both directions of the serializer and the stage became a passthrough while reporting success. The edges are now settable. - [Media Blocks SDK .Net] Three blocks that took their whole configuration as a bare value gained a settings class:
FlipRotateSettings,WAVSinkSettingsandBarcodeDetectorSettings. A rotation, a WAV recording destination and a barcode detector mode can now be stored in a pipeline document and edited through the block catalog's property metadata. The existing constructors are unchanged. - [Media Blocks SDK .Net]
ResizeVideoEffect,CropVideoEffect,BoxVideoEffect,GLResizeVideoEffect,ImageOverlaySettingsandTextOverlaySettingsgained a public parameterless constructor, which is what JSON deserialization needs; the crop and the box default to a passthrough and the two resizes to 1920x1080. - [Media Blocks SDK .Net] Fixed: seven network sources could not be restored from a pipeline JSON document.
HTTPMJPEGSource,NDISource,NDISourceX,RTMPSource,RTSPRAWSource,SRTSourceandSRTRAWSourcepassed preflight validation and then failed halfway through materialization, because the only constructor on their settings class was private - an asyncCreateAsyncprobes the endpoint before handing one back. Each of those settings classes now has a public parameterless constructor for the persistence path;CreateAsyncis unchanged and remains the way to probe a reachable endpoint up front. A source built from a document does not contact its endpoint until the pipeline opens it. - [Media Blocks SDK .Net] Fixed: a document naming
SRTSourceorNDISourceXbuilt the wrong block.SRTSourceSettingsis shared by the decoding and the raw SRT source andNDISourceSettingsby the NDI and the Windows-only NDI X source, whileCreateBlock()on each names only one of the pair - so the other came up as its sibling, with different pads, and the document's own connections then failed to resolve. A settings class shared by two blocks now reaches its block through the block's own constructor. - [Media Blocks SDK .Net]
RTSPRAWSourceSettings.Uriand.AudioEnabledare now settable. Both were read-only outsideCreateAsync, so a document's endpoint and audio flag were dropped in both directions of the serializer and the source came up pointing nowhere while reporting success. - [Media Blocks SDK .Net] Fixed: nineteen block types built a different block than the one you asked for.
MediaBlockCatalog.Get(MediaBlockType.MP4Output).CreateBlock()returned anMP4SinkBlock- a bare muxer instead of the whole encode-and-mux stage - and so did a document naming one.PlayBinSourcecame back as aUniversalSourceBlock,SeparateOutputas aBridgeVideoSourceBlock,UniversalSourceMinias aUniversalSourceBlock,SRTSinkas anSRTMPEGTSSinkBlock. The cause: several blocks share one settings class, whoseCreateBlock()names only one of them, and the catalog called it for all of them. A shared settings class now reaches its block through the block's own constructor. - [Media Blocks SDK .Net] A block whose settings alone cannot build it is now refused up front instead of failing halfway through loading a document. Twenty-four block types name a settings class but also require a second one the document cannot carry - the
*Outputblocks want encoder settings,DecklinkVideoAudioSinka second sink settings,SeparateOutputa live pipeline. They reported themselves constructible, passed preflight validation, and then failed during materialization, which discards the whole pipeline over one entry. Preflight now reportsMBS032naming the block, andMediaBlockDescriptor.CanConstructanswers what the loader can actually do. - [Media Blocks SDK .Net] Fixed:
RTSPSource,RTSPRAWSourceandRTMPSourcethrewNullReferenceExceptioninstead of reporting an empty URL. The "URL is empty" check dereferenced the URI it was testing, so a source built without one crashed rather than logging and refusing to build. - [Media Blocks SDK .Net] Fixed:
AudioMixerwas configured through the wrong settings class. The block catalog bound it toAudioMixerSourceSettings, which needs a live pipeline and cannot be created at all, instead ofAudioMixerSettings- so the mixer offered the wrong properties to edit, a pipeline document could not carry its output format, andIgnoreInactivePadswas unreachable from a document. The catalog now prefers a constructor that can actually be called when a block has several. - [Demos] Media Blocks Studio: the Player and picture-in-picture scenarios now carry the effect stages they describe - colour balance, a mirror and an upscale on the player, a crop and a resize on the picture-in-picture camera branch.
2026.8.26¶
- [Demos] Media Blocks Studio: nine bundled scenarios that run offline. The startup screen shows nine curated pipelines - player and live effects, camera capture, screen+camera picture-in-picture, live mixer, transcoding, multi-output streaming, AI vision, audio lab and RTSP - each with a still captured from its own output, an outcome line, media tags and platform/requirement chips. Every scenario is an ordinary JSON document under
Assets/Scenariosthat the app reads at runtime, so the file you open, edit and save is the file the gallery runs. The baseline needs no camera, network or media file: five scenarios generate their own video and audio and three read a bundled clip. "Run Demo" opens the graph and starts it; two scenarios first ask for what the bundle cannot carry - an RTSP endpoint and a path to an ONNX detection model. - [Demos] Fixed: the Media Blocks Studio editor came up empty. Opening a pipeline showed the toolbar over a blank area with no canvas, block catalog, inspector or panels, and the block catalog reported no blocks at all. The application did not include the Dock and Nodify control themes, presented its panels with the wrong data, and never initialized the SDK. Connections between blocks are now drawn as well: a node was previously built with one input and one output regardless of the block, so anything wired to an indexed pad - a mixer input, a source's audio output - was dropped silently.
- [Media Blocks SDK .Net] Fixed: several blocks could not be restored from a pipeline JSON document.
RTSPSource,VideoMixerandTeeentries failed to materialize, andVolumeandEqualizer10could not carry their gain, mute or band values at all, because those settings types had no constructor the persistence layer could call and, for the two audio blocks, no settings type at all.VolumeSettingsandEqualizer10Settingsare new;RTSPSourceSettingsandVideoMixerBaseSettingsgained a public parameterless constructor;TeeBlockgained constructor defaults. Settings whose only constructor takes all-optional parameters -VirtualAudioSourceamong them - are now accepted too. - [Media Blocks SDK .Net] A relative file path in a pipeline document now resolves against the document base directory even when the setting is a URI, which is the shape
UniversalSourceSettingsuses, so a document can reference an asset shipped beside it. - [Media Blocks SDK .Net] Preflight validation now reports an input asset that does not exist - a detection or OCR model path, or a local file URI - as an error instead of letting the pipeline materialize into a stage that silently does nothing. A sink filename is an output and is still not required to exist.
- [Core] Fixed:
ElementX.ReadProperties()returned structure-typed element properties (for examplertspsrcsdes) whose native memory was already freed, so reading such an entry afterwards could crash or return garbage. Boxed values are now kept as a deep copy (#1184). - [Core] Fixed:
ElementX.ReadProperties()aborted with an exception on elements holding properties without a managed representation (for examplegltransformation) instead of skipping them; unreadable properties are now skipped, and calling the method again refreshes existing entries instead of failing (#1184). - [Core] Fixed:
ElementX.ReadProperties()raised a GLib critical for every write-only element property (for exampleplaybinsubtitle-font-desc) by trying to read a value such a property cannot have. Those properties are still listed, with anullvalue, and are no longer read (#1184). - [Demos] Media Blocks Studio: generated Inspector, Help, runtime controls and crash recovery. The editor now generates the Inspector form from each block's descriptor property metadata (typed parsing with min/max clamping; live-safe properties apply to the running pipeline without a rebuild) and a Help card from the block descriptor. The workspace gained Run/Pause/Resume/Stop over
MediaBlocksPipelineMaterializerwith error/stop event logging, position polling, structured diagnostics navigation and a single-slot live video preview. Pipelines autosave to %AppData% on a 10 s debounce with a restore prompt on the next start, and unsaved changes are confirmed before New/Open/close. - [Media Blocks SDK .Net] Local file sources are now JSON-serializable.
UniversalSourceSettingsandDemuxerSourceSettingshad only a private constructor and private setters for their file/URI properties, so a pipeline document carrying a local file could not be loaded or materialized. Both now expose a public constructor and settable URI/Filename/render flags, so file-based pipelines round-trip through the versioned JSON document format. - [Core] Fixed: the LUT (color lookup table) video effect silently did nothing on Intel Macs. The native processor library shipped in the macOS and Mac Catalyst packages was built for Apple Silicon only, so on an x86_64 Mac it could not be loaded at all and every LUT-based effect was a no-op. The library is now a universal x86_64+arm64 binary (#1101).
- [Core] Fixed: calling
VProcessor.UpdateFilterParametersthrewEntryPointNotFoundExceptionon macOS/macCatalyst. The shipped native library predated the managed wrapper and did not export the entry point; it now does (#1157). - [Core] The GStreamer log callback no longer claims ownership of logged objects. The SDK's log handler built a managed wrapper around the subject object of every log line GStreamer emitted, including plugin-internal GObjects the SDK never created; for an object that logs while still floating (any
GstObjectlogging before its owner sinks it) the wrapper adopted the floating reference, so the owner's later unref finalized the object while the binding still held a toggle reference on it — surfacing as[VisioForge-Lifetime] toggle ref outlived its objectand, in Release, as a use-after-free risk whenever debug logging was enabled (#1165). Handlers registered throughGst.LogFunctionnow receive_object = nullunless a managed wrapper for the logged object already exists. - [Core] Fixed: custom GStreamer log handlers could never be detached on desktop platforms.
Gst.GstDebug.RemoveLogFunctioncompared against a freshly built native function pointer instead of the one recorded at registration time and therefore matched nothing; every handler stayed installed for the life of the process. Removal now unregisters by the handle captured when the handler was added — the same scheme already used on Unity. As a consequence, removing without an argument detaches only the handlers this assembly registered rather than every log function in the process, so third-party and default GStreamer logging survives SDK teardown (#1165). - [Core] Fixed: native memory grew steadily while reading GStreamer element properties. Long-running pipelines leaked a small native allocation on every property read:
QueueBlocklevel properties (CurrentLevelBuffers/CurrentLevelBytes/CurrentLevelTime, typically polled per frame), video mixer and compositor input reads, OpenGL shader and 360-view settings updates (a whole structure copy per update, so dragging a slider accumulated allocations for the process lifetime), file sink filename reads, and the volume/mute getters of the system and PulseAudio audio sources and of the audio renderer (#1185). - [Core] Fixed:
InterPipeSinkBlock.GetNumListeners()always returned 0, whatever the number of connected InterPipe sources (#1185). - [Core] Fixed a slow native memory leak in device enumeration: every probed device property leaked one boxed GValue per enumeration pass (#1174).
- [Core] Fixed: one audio device losing a property-probe race (device removed mid-enumeration) aborted the whole output-enumeration pass, hiding every device enumerated after it; the pass now continues, with the failure contained to that single entry.
2026.8.25¶
- [Demos] New: Media Blocks Studio, the cross-platform Avalonia showcase and pipeline editor for Media Blocks SDK. The first stage ships the application shell under
_DEMOS/Media Blocks SDK/Avalonia/Media Blocks Studio(Windowsnet10.0-windows, macOSnet10.0-macos, Linuxnet10.0): a dark broadcast-style startup gallery with New/Open/Recent projects, an IDE-style workspace built on Nodify.Avalonia 2.0.0 (infinite node canvas with pan, zoom, selection and connection dragging) and Dock.Avalonia 12.0.0.2 (catalog on the left, Inspector/Help tabs on the right, Preview/Metrics/Diagnostics/Logs docked at the bottom). The searchable block list reads the SDK's read-only block catalog directly; pipelines are created, edited, validated againstMediaBlocksPipelineValidator, saved to and loaded from the versioned JSON document format with undo/redo. - [Media Blocks SDK .Net] New: document-to-live materialization and preflight validation. A pipeline JSON document can now be turned into a running-ready
MediaBlocksPipeline:MediaBlocksPipelineMaterializer.Materializebuilds every block through the block catalog, binds settings from their JSON payloads (including all-optional-parameter constructors), resolves host resources throughIMediaBlockResourceResolver, restores connections using the documentedinput/output/input:N/output:Npad id convention, and returns a document-block-id to live-block mapping with full diagnostics. Blocks that cannot be created - unknown type, missing factory, unavailable on this platform - stay in the document as placeholders with an error diagnostic; they never discard the rest of the pipeline.MediaBlocksPipelineValidator.Validateperforms the complete preflight check: structure, known blocks, construction paths, availability probes, pad reference shape, resource resolver presence and unsupported feedback cycles; errors block materialization and run, warnings do not. Relative file paths inside settings resolve against the document directory when one is given (baseDirectory). New convenience:MediaBlocksPipeline.LoadJsonAsyncreplaces the contents of a stopped pipeline from JSON in one call. - [Media Blocks SDK .Net] Metal-accelerated video elements are now available on Intel Macs. The
vfmetal*plugin shipped in the macOS and Mac Catalyst runtime packages was built for Apple Silicon only, so on an Intel Mac it could not be loaded at all and every element it provides - the Metal compositor, video sink, filter, converter/scaler, transform, deinterlacer and overlay - was simply absent from the GStreamer registry. It is now a universal x86_64+arm64 binary (#1101). - [Video Capture SDK .Net] Fixed: video frames could silently stop flowing after live video effects were removed or cleared during capture (
Video_Effects_Removeby instance or name, andVideo_Effects_Clear). The pause issued before the filters are unplugged and the resume after are asynchronous GStreamer state changes, but the resume was not waited out - a PAUSED to PLAYING transition that never completes stops frames with no error raised anywhere. Both operations now wait (bounded) for the resume to settle and report throughOnErrorif the pipeline fails to return to the playing state (#1152). Behavior change: removing or clearing effects while capture is paused no longer resumes playback - a deliberate pause is preserved, matching what live effect addition has always done. - [Media Blocks SDK .Net] Fixed: stopping an SRT pipeline could hang
StopAsyncforever on macOS when the peer was unreachable or kept dropping the connection, and a test or app that gave up mid-stream could then die with a SIGSEGV at process exit. The native SRT sink captures the auto-reconnect setting once per write/read call, so turning reconnect off while the streaming thread was already inside its reconnect loop did not end the loop - EOS could never reach the sink and teardown blocked indefinitely. Both SRT sink blocks now receive an early stop signal (RequestStop) that disables auto-reconnect before EOS, and the macOS native package'slibgstsrt.dylibhonors a mid-flight reconnect switch-off instead of reopening forever (#879). - [Media Blocks SDK .Net] Fixed: the raw
MPEGTSSinkBlock→SRTSinkBlockpath published streams that carried bytes but no playable video. The muxer emitted one buffer per 188-byte TS packet and the SRT sink sent each as its own SRT message - seven times the message rate for the same payload, which starved video on the transport. The muxer output is now aligned to 7 TS packets (1316 bytes) per buffer, matching what the combined SRT MPEG-TS sink has always done. The alignment applies to every rawMPEGTSSinkBlockoutput, including default.tsfile recordings; the multiplexed stream itself is unchanged and stays spec-legal (#879). - [Media Blocks SDK .Net] Fixed: MPEG-1 video produced no video output through
UniversalDemuxDecoderBlock(and could not decode throughUniversalSourceBlockV2in the rare no-parser path). The by-name decoder selectors asked for an element gst-libav never registers - it builds decoder names at runtime and explicitly skipsmpeg1video, soavdec_mpeg1videodoes not exist and element creation failed silently, dropping the video stream. MPEG-1 is now handed toavdec_mpeg2video, which decodes both generations. MPEG audio Layer 1 and Layer 2 hit the same defect family:UniversalSourceBlockV2routed them toavdec_mp2andUniversalDecoderBlock's Layer 1/2 ladders listed only names gst-libav does not register (mp1/mp2are in its audio skip list), so that audio silently got no decoder; both now decode throughavdec_mp3, which handles every MPEG audio layer (#1132). - [Media Blocks SDK .Net] Fixed: a live element could be stopped while a buffer was still passing through it, which could freeze the pipeline. Updating
GLShaderBlocksettings on a running pipeline, and removing anAudioMixerBlockinput from one, both blocked the surrounding pads and then took the element to the NULL state - but installing a pad block does not wait for a streaming thread already inside it to leave, and stopping an element under that thread deadlocks against it. Both paths now wait for the element to be out of the data flow first, and report a failure instead of stopping it if that wait does not complete (#1143). Breaking:GLShaderBlock.Update()returnsboolinstead ofvoid, so a caller can see when the new shader did not go live - which is what a paused pipeline gives back, since a sink holding a buffer in preroll keeps a streaming thread inside the chain. Push the settings again after resuming. - [Core] macOS: audio capture/render devices are selected by their stable CoreAudio unique ID, not by the numeric device ID. The numeric AudioDeviceID CoreAudio assigns is reassigned on replug, on other devices being added, and across reboots, so a saved configuration could silently open a different device.
AudioCaptureDeviceInfoandAudioOutputDeviceInfonow publish the provider's stableUniqueID(plusIsDefault), andOSXAudioSourceSettings/OSXAudioSinkSettingsaccept it; the pipeline prefers the unique ID and falls back to the recorded numeric ID for configurations saved before this change. A saved unique ID that no longer exists now fails the pipeline start with a diagnostic instead of opening whatever sits at the old numeric ID (#1106). -
[Core] Fixed: selecting a specific macOS audio input device through
DeviceEnumeratornever worked - the enumeratedAudioCaptureDeviceInfo.DeviceIDwas never populated and stayed 0, so every capture built from a picked device opened the default input instead (#1106). -
[Media Blocks SDK .Net] New: a public block catalog.
MediaBlockCatalogenumerates every built-in Media Block the loaded SDK assemblies carry - over 400 blocks across VisioForge.Core and the AI/OpenGL satellites - with one descriptor per block: stable type, concrete and settings CLR types, human-readable name, visual category, keywords for search, an availability probe (wired to each block's ownIsAvailable()), factory support, and property metadata generated from the settings type (display name, default value, editor kind, enum values). Blocks whose settings are built by factories rather than edited as POCOs - device sources, demuxers created through asyncCreatemethods - are classified as runtime-configured instead of pretending to have an editable surface. New types:MediaBlockCatalog,MediaBlockDescriptor,MediaBlockPropertyDescriptor,MediaBlockAvailabilityResult,IMediaBlockResourceResolver. - [Media Blocks SDK .Net] Settings JSON now survives round trips for media value objects.
VideoFrameRateis persisted as its num/den pair,Sizeas width/height, and colors (SKColor) as RGBA bytes; previously these either could not be deserialized at all or came back zeroed. Read-only computed members of settings objects no longer enter the payload at all - they cannot be read back and silently corrupted document round trips. The DVB source's native tuning handle is excluded from serialization like every other native pointer. - [Media Blocks SDK .Net] MAUI:
VideoViewXgainsSetIPhotographyandSetCamera2Controlson Android, matching the Uno and Avalonia video views. They forward to the native view, so camera photography controls can be configured on the MAUI control itself; outside Android the methods do not exist (#311). - [Media Blocks SDK .Net] Fixed: the built-in RTSP server could fail to start with a Media Foundation H264 or HEVC encoder selected. The pipeline string for the RTSP media factory carried every MF encoder property unconditionally, but GStreamer installs those properties only when the Media Foundation transform advertises them - on a host where the MFT exposes less,
gst_parse_launchrejected the whole string (no property "qp" in element "mfh264enc") and the server never came up. The launch string now carries the element name and bitrate only, and the remaining settings are applied to the real element after the factory builds the pipeline, skipping any property the MFT does not advertise (#858). - [Media Blocks SDK .Net] Breaking: the unused
MPEG2VideoEncoderSettings.Profileproperty and theMPEG2VideoEncoderProfileenum have been removed. The FFmpeg MPEG-2 encoder these settings drive (avenc_mpeg2video) cannot apply an MPEG-2 profile or level at all - gst-libav deliberately skips the codec's profile/level options when exposing element properties and never maps them from caps either - so the property silently did nothing and every stream was written with the libav defaults (Main profile). Verified against GStreamer 1.28.2; a regression test now pins the stream profile the encoder actually produces (#259). -
[Media Blocks SDK .Net] Breaking: four more dead
MPEG2VideoEncoderSettingsproperties removed -ForceDuplicatedMatrix,IntraQuantBias,InterQuantBiasandMPEGQuant. None of them exists as a property onavenc_mpeg2video, so every pipeline logged a GLib critical per property and silently ignored the value; no caller could have observed any effect. Also fixedFrameSkipComparebeing rejected at runtime with a type-mismatch critical - the value is boxed as an integer now, like every other enum setting on this encoder. -
[Core] Mac Catalyst builds no longer silently lose macOS behaviour behind
#if !__IOS__guards. The__IOS__define is set fornet10.0-maccatalysttoo, so code guarded only against iOS was compiled out of every Catalyst build with no warning: the video overlay sink never hadforce-aspect-ratioset, opening or playing media could switch audio off while additional audio streams or audio processing blocks were queued, afile://URI passed toAudio_AdditionalStreams_AddAsyncfailed where a plain path worked, and the Video FingerPrinting log context stayed unwired so its diagnostics fell back to raw trace output instead of the SDK logger. All twenty-two affected sites now use the guard shape the rest of the SDK already used, which lets Mac Catalyst through wherever macOS is let through (#1141). - [Core] Blu-ray and DVB source types are declared on Mac Catalyst, matching the macOS API surface. Blu-ray playback needs only playbin, tsdemux and h264parse, all of which ship in the macCatalyst GStreamer runtime, so
BluRaySourceSettingsandBluRaySourceBlockwork there exactly as they do on macOS.dvbsrcships in neither Apple desktop runtime, so the DVB types now exist for API parity alone and their availability check reports false at runtime - the same answer macOS gives (#1141). - [Core]
Pango.CoreTextFontis now declared on Mac Catalyst, matching the macOS API surface. The file was hidden behind a bare#if !__IOS__, which compiles out of Catalyst as well because__IOS__is defined for it too (#1142); its DllImport now names the library that actually exports the symbol on the Apple builds (libpangocairo, notlibpango). - [Media Blocks SDK .Net] The unused public type
RemoveSilenceSettingshas been removed. No API in the SDK ever accepted it, so code holding an instance could not pass it anywhere; silence removal is configured throughRemoveSilenceAudioEffect(forAudioEffectsBlock/MediaPlayerCoreX) or directly onRemoveSilenceBlock, which expose the sameThresholdandSquashproperties (#1117). - [Media Blocks SDK .Net] New: versioned JSON persistence for pipelines and blocks. A pipeline can now be saved to and restored from a human-readable
.jsondocument that carries the pipeline settings, every block with its settings, the connections between blocks, and an optional opaque editor section. The integerMediaBlockTypevalue is the authoritative discriminator, so a document restores to exactly the blocks it was written with; unknown properties, unknown sections and blocks this SDK does not know about are preserved without loss, so newer files still load on older SDKs. New public API:MediaBlocksPipelineDocument,MediaBlockDocument,MediaBlocksPipelineJsonSerializer,MediaBlockJsonSerializer,MediaBlocksDiagnostic, and a schema-migration registry (IMediaBlocksPipelineDocumentMigration) for future format versions. Materializing a document into a live pipeline arrives in the next stage. - [Media Blocks SDK .Net] Every
MediaBlockTypemember now carries an explicit integer value, identical on every platform and build flavor. The values were previously implicit except for a few anchors, which made them differ between Windows and non-Windows builds around the platform-gated members - any integer-serialized block type crossing a flavor boundary was ambiguous. The numbering follows the existing Windows order, so existing explicit pins (251, 277, 400+) are unchanged. Two members that silently carried duplicate numbers move to fresh unique ones:UDPRAWMPEGTSSourcefrom 400 (collided withONNXInference) to 443, andWebView2Sourcefrom 401 on Windows (collided withYOLOObjectDetector) to 444 - the old numbers were ambiguous by construction, so no working code can have relied on them. - [Media Blocks SDK .Net] Blocks that shared a
MediaBlockTypevalue now have their own:UniversalAutoDemux,UniversalSourceMini,FallbackSwitchSource,ImageOverlayCairo,FrameDoubler,CustomColorspaceX,SqueezebackBlockV2,PreEventSeparateOutput,TextOverlaySource,ImageVideoSourceCairo,UniversalTransform,UniversalDecoder,UniversalDemuxDecoder,AppBridgeAudioSink/Source/VideoSink/VideoSource,StreamSourceWithDecoderandLiveSourceSwitchDynamic(424-442). The primary class of each pair keeps the historical value; the variants listed here are new members appended at the end, so nothing is renumbered. Affected classes:UniversalAutoDemuxerBlock,UniversalSourceBlockMini,FallbackSwitchSourceBlock,ImageOverlayCairoBlock,FrameDoublerBlock,CustomColorspaceXBlock,SqueezebackBlockV2,PreEventSeparateOutputBlock,TextOverlaySourceBlock,ImageVideoSourceCairoBlock, theAppBridge*Blockquartet,StreamSourceBlockWithDecoder,LiveSourceSwitchBlockDynamic, andIOSVideoSourceBlock, which now correctly reports the existingIOSVideoSourceinstead ofSystemVideoSource. Code that switched on these types may need the new members added to its cases. - [Media Blocks SDK .Net] Breaking: the unfinished YAML persistence API is removed.
YAMLBlock, the commented-outYAMLConfig,IMediaBlock.ToYAMLBlock()andMediaBlock.ToYAMLBlock()are gone; none of them ever produced output (ToYAMLBlockthrewNotImplementedException). JSON is the only supported Media Blocks persistence format. - [Media Blocks SDK .Net] macOS and Mac Catalyst: the Metal video renderer no longer hangs a process that has no window, and the Metal elements are no longer picked automatically. Two defects in the bundled
vfmetalplugin, both of which a customer could reach without ever naming a Metal element.vfmetalvideosinkcreated its own window through a blocking call onto the main thread; in a process whose main thread is not running a Cocoa event loop - a console tool, a service, a test host - that call never returned and the pipeline sat in preroll forever, with nothing on the bus to say why. Worse, the same call could deadlock an ordinary windowed application: an app that starts a pipeline and then waits for it on its UI thread was blocking the very thread the sink needed. The sink no longer waits at all - it asks for the window and drops frames until it appears, which lets the pipeline preroll and frees the UI thread to create it. The first frame is kept rather than discarded, so a pipeline that is only paused - a preview, a scrub, a thumbnail - still shows its picture the moment the window appears. If fifteen seconds pass with no window the pipeline reports an error saying whether a window handle was missing or simply never acted on, and a pipeline that finishes without ever displaying anything says so on the bus when it stops.vfmetalcompositorandvfmetalvideosinkalso registered at ranks high enough to be auto-selected, so the Metal compositor silently became the mixer inside everyVideoEditCoreXtimeline and the Metal sink was whatautovideosinkchose; both now register at rank none, like the other five Metal elements, and are used only when you ask for them by name. Separately,MetalVideoCompositorBlockfailed negotiation whenever anything downstream asked for an output size other than the size of its inputs; it now accepts the requested size and composes onto a canvas of that size, as the software compositor does - each input still sits where its pad properties put it rather than being stretched to fill. The plugin is also rebuilt against the 1.28.6 runtime the rest of the package ships (#878). - [Media Blocks SDK .Net] macOS: three further fixes in the Metal video renderer, found while fixing the above. Resizing the video window could briefly show the picture offset or stretched: the frame's position was computed against the new window size while the picture itself was still being drawn at the old one. A second defect could crash the process during teardown - the thread delivering frames read the render view at the moment the window was being closed, and could be left holding memory that had just been released. And
IVideoView-style re-parenting now works: handing the renderer a second, different window used to be ignored silently, so it kept drawing into the first one; it now detaches and attaches to the new one (#878). - [Media Blocks SDK .Net] GStreamer pipelines and reported codecs are built identically on every system locale. Six places wrote or compared locale-sensitive text where GStreamer only ever accepts invariant text. The Apple H.264 encoder writes its
qualityparameter into the pipeline string - fractional 0.5 by default, so with no property ever set - and on every comma-decimal locale (German, Russian, French and most of continental Europe) it producedquality=0,5, which the parser rejects: an RTSP server built on those settings handed every connecting client an error instead of a stream. The MP3 encoder had the same defect in its VBR quality parameter, reachable by selecting the Quality rate control with a fractional quality such as 2.5; the NVIDIA H.264 and HEVC encoders in theirconst-qualityparameter, reachable with any fractional quality value; and the VP8/VP9 encoders in their three buffer-size parameters - the element takes whole milliseconds there, so on those locales the comma form broke every duration, and a sub-millisecond duration is now truncated to the whole millisecond instead of being written as an unparsable fraction. And under the Turkish and Azerbaijani casing rules a codec name reported by stream discovery came back asVİDEO/H264instead ofH264- silently, with no error anywhere. gst-launch strings and codec identifiers are invariant by construction and are now written as such, on every platform (#1133). - [Media Blocks SDK .Net] macOS and Mac Catalyst: a new AAC encoder,
AppleAACEncoderSettings, backed by the AudioToolbox encoder built into the operating system. It is the same encoder the rest of macOS produces AAC with, it handles up to 8 channels where the existing AAC backends stop at six, and it offers four rate control modes including true VBR - setRateControltoVariableand drive the rate withVBRQualityinstead ofBitrate, which the two variable modes ignore. It appears in every output'sGetAudioEncoders()list as "Apple AAC". It is not the default, and that was a measurement rather than a preference: against a lossless source on Apple Silicon the two encoders trade places with the bitrate - behindavenc_aacat 96 kbps, level at 128 kbps, ahead at 192 kbps - while their CPU cost is indistinguishable, since AAC encoding runs well over a hundred times faster than realtime either way.AVENCAACEncoderSettingstherefore stays the default and nothing changes unless you select the new one. Not available on iOS: the GStreamer runtime shipped for iOS does not carry the element yet, so checkAppleAACEncoderSettings.IsAvailable()rather than the platform (#1110). - [Media Blocks SDK .Net] DV and DVCPRO files no longer fail to open at random with "Cannot access memory for read and write operation". Roughly one attempt in twenty - measured 1 in 30 on macOS - the file never reached PLAYING and the pipeline reported that error from
avdec_dvvideo. The libav decoder in GStreamer 1.28 can decode straight into the video renderer's own buffer pool, but it describes the frame with its own, more strongly aligned layout - for 720x480 DV that puts the second colour plane 768 bytes past what the renderer allocated - and reading the frame back then fails. This is not macOS-specific and the change is not platform-gated: the defect is in the runtime both platforms now ship (1.28.6 on macOS, 1.28.2 on Windows); macOS is simply where it was measured. The libav video decoders that take that path now decode into their own memory and copy the finished frame out. That is every libav decoder except H.264, H.265 and H.266, so expect one extra frame copy per frame wherever anavdec_decoder handles DV, DVCPRO, MPEG-1/2, MPEG-4, DivX/Xvid, WMV, MS-MPEG4 or ProRes - formats that are software-decoded anyway. Hardware decoders and every non-libav element are unchanged. The fix reaches both the blocks that pick a decoder by name -UniversalSourceBlockV2,UniversalDecoderBlock,UniversalDemuxDecoderBlock- and the decodersdecodebin,uridecodebin,playbinand GES build for themselves insideMediaBlocksPipeline,VideoEditCoreXandSimplePlayerCoreX. A pipeline you assemble yourself out of raw GStreamer elements is not covered, and neither is the internal media-info discovery graph, which cannot hit this (#1121). - [Media Blocks SDK .Net] New:
AppleMediaHEVCEncoderSettings- HEVC encoding through Apple VideoToolbox, including 10-bit and an alpha channel. There was no VideoToolbox HEVC encoder in the SDK at all, so on a MacHEVCEncoderBlock.GetDefaultSettings()found no hardware encoder and HEVC output was unavailable. It now returns this one.Profileselects Main or Main 10 (10-bit), andPreserveAlphaswitches to the alpha-capable encoder; both need the GStreamer 1.28.6 runtime, which ships in the macOS and Mac Catalyst packages - the iOS package still bundles 1.24.9, where neither is available. - [Media Blocks SDK .Net] New: constant-bitrate rate control on the VideoToolbox encoders.
AppleMediaH264EncoderSettingsandAppleMediaHEVCEncoderSettingsgainRateControl(ABR, the default, orCBR) plusDataRateLimitBitrate/DataRateLimitDuration, a bitrate ceiling averaged over a sliding window - what a fixed-bandwidth endpoint needs on top of a target bitrate. The two are alternatives, not complements: withCBRselected VideoToolbox ignores the data rate limits outright, because constant bitrate is already a ceiling; the limits apply inABRmode. Two caveats worth planning around: truly constant bitrate requires macOS 13+ or iOS 16+ on Apple Silicon - elsewhere VideoToolbox emulates it through limits of its own and says so in its log, and the output is near-constant rather than constant; and on iOS the properties do not exist in the bundled runtime at all, so the setting is discarded with a warning (#1109). - [Media Blocks SDK .Net] macOS and Mac Catalyst: the bundled GStreamer runtime moves from 1.24.12 to 1.28.6, and the audio output no longer hangs on shutdown. Stopping a pipeline whose audio went to the system output could wedge the process: pausing tore the CoreAudio render callback down from inside the audio device's own IO thread, and that inverted two locks against each other. Measured on this machine before the upgrade, one run in five of the audio processing suite hung and had to be killed after 15 minutes; after it, none. Three things come with the new runtime that are worth knowing about. VideoToolbox gains hardware decoding of VP9 and AV1 and 10-bit HEVC encoding, and the H.264/HEVC encoders gain real rate control (constant-bitrate, and a hard data-rate cap) - availability depends on the Mac, so ask the SDK rather than assuming. Vulkan-based elements work on Apple Silicon for the first time: the library we shipped was built for Intel only, so on an M-series Mac none of them loaded at all. And the iSAC speech codec is gone - GStreamer dropped it upstream, and there is no replacement in the runtime; pipelines that asked for it by name will report a missing element. Everything else the SDK creates was checked element by element against the old runtime and is unchanged. Delete
binandobjonce after taking this update. Several bundled libraries change file name in this release - OpenSSL, libsoup and the FFmpeg libraries all move to a new major version - and an incremental rebuild leaves the previous ones in the output directory beside the new ones. - [Media Blocks SDK .Net] [Video Edit SDK .Net] DV output now pins the video format to PAL SD (720x576, 25 fps) instead of failing negotiation on any non-SD source. The DV encoding profile carried no restriction caps, so the encoder was handed the source's native resolution and framerate and negotiation failed. Note that DV encoding is currently blocked by an upstream gst-libav defect (#1126); this fix makes the profile correct for when it is unblocked.
- [Media Blocks SDK .Net] macOS and Mac Catalyst: the bundled CoreAudio plugin carries one fix on top of upstream 1.28.6. Stopping a CoreAudio device holds a lock that the device's own audio callback needs, and the thread doing the stopping sits inside CoreAudio holding it for milliseconds - measured on an Apple Silicon Mac at a median of 1.6 ms and as long as 240 ms. Upstream removed that inversion where the device is started and never where it is stopped. In practice 1.28.6 is very hard to hang this way, because the callback now stands down before it touches that lock whenever the pipeline is paused first - which every shutdown does; the case it leaves open is an audio capture source renegotiating its format, which stops the device with no pause in front of it. The bundled
libgstosxaudio.dylibis therefore built from upstream 1.28.6 sources with the stop side removed too. Everything else in the runtime is unchanged upstream bytes. - [Media Blocks SDK .Net] macOS and Mac Catalyst: barcode detection through
BarcodeDetectorBlock(the GStreamerzbarelement) no longer crashes the whole process on the first frame. The bundledlibzbarwas built by a compiler that exploits undefined behaviour in zbar's backward image scan: the scan's row-step arithmetic wraps to an invalid pointer value, and the compiled code materializes that wrapped pointer literally instead of decrementing the pointer, so scanning any image wider than two pixels dereferences address 0xffffffffffffffff and dies with SIGSEGV - deterministically, in every host process, on both Apple Silicon and Intel. The two instructions are corrected in place; QR detection verified working after the fix (#1168). - [Media Blocks SDK .Net] A branch of a running pipeline could stop delivering data for good after a dynamic add or remove. Blocking a pad that was already blocked installed a second block the SDK had no handle on - it remembered only the first - so unblocking the pad left the second one in place for the life of the process, and the branch went silent or froze with nothing in the log. Reachable wherever two block scopes could overlap on one pad: the live audio and video mixers,
LiveVideoCompositorV2, and element removal or replacement in a running pipeline. The same bookkeeping was a shared static table with no locking, and it never released the pads of removed inputs - one pad object pinned in memory per removed mixer or compositor input, permanently. It is gone: each block now carries its own handle.MediaBlockPad.BlockPadLive()changes with it in two visible ways: blocking an already-blocked pad is now a no-op that reports success rather than a second block nobody can lift, and a block that could not be installed reportsfalseinstead of reporting success (#1115). - [Media Blocks SDK .Net] Updating an OpenGL shader's settings on a running pipeline no longer leaves the block half-connected.
GLShaderBlock.Update()swaps theglshaderelement for a freshly configured one, and the block kept holding the pads of the element that was removed - every later connection, pad block or end-of-stream notification through that block then went to an element nothing feeds. The block now re-reads both pads after the swap. The element replacement underneath it was also reporting success over a pipeline it had cut in half: a replacement element that has only one of the two pads the position needs threw or silently linked against nothing, and a link the SDK could not make was logged and then reported as a completed replacement. Both are refused now, with the old element left running (#1136). - [Core] Media analysis no longer fails on a rotated video when the system locale writes its negative sign with a non-ASCII character. ffprobe reports a portrait phone recording as
rotate=-90, and the rotation was read through the machine's current locale. On the 57 cultures whose negative sign is not a plain hyphen - every Arabic locale, which prefixes it with U+061C, and the Persian ones, which use U+200E U+2212 - that parse threw and the file could not be analysed at all. ffprobe output is invariant by construction and is now parsed as such, along with the container bitrate and every duration (#1104). - [Core] ONVIF: authenticated requests carry a valid timestamp on any system locale. The
Createdvalue of the WS-Security UsernameToken was rendered through the machine's calendar, so a Thai machine sent the year 2569, a Persian one 1405 and a Saudi one 1447 and the camera rejected the request. In the legacy ONVIF client the same string is also what the password digest is computed over, so both were wrong.xs:durationvalues had the matching defect in both directions: written with a comma on any comma-decimal locale, and read back either failing outright (Russian, French) or silently taken as five seconds instead of half a second (German) (#1104). - [Core] ONVIF: a device's log timestamps are read in the right era. The log reader picked out date fields using the machine's locale, so under the Umm al-Qura calendar (
ar-SA) a plain ISO timestamp was not recognised at all, and under the Persian and Thai Buddhist calendars it was read into the wrong era - 2026-05-12 became 2647 or 1483. The invariant form is now tried first, with the machine's locale kept only as a fallback for a device that formats its log the same way (#1104).
2026.8.24¶
- [Core] macOS: enumerating video sources no longer logs a warning for capture devices that are not AVFoundation cameras.
VideoCaptureDeviceInforead the AVFoundation-onlydevice-indexproperty from every device it was given, and any other device class - a Decklink card, an ATEM surfaced through the Decklink provider - has no such property, so building its entry failed part-way and logged a warning. The property is now read only for AVFoundation devices (#1091). - [Core] Breaking:
Gst.Rtsp.RTSPConnection.Receive,ReceiveUsec,ConnectWithResponseandConnectWithResponseUsectake their message byref, and now actually hand it back. All four marshalled the message into a temporary block, let GStreamer write the parsed message into that block, and then threw the block away - so every successful receive returnedOkwith the caller's message unchanged - a fresh one stillRTSPMsgType.Invalid, carrying no headers and no body, and everything C had allocated into it leaked. Worse on the failure path: GStreamer releases the message's contents before returning an error, so the caller was left holding freed pointers and a laterUnset()released them a second time. The message is read back on every path now, so a read that reached the socket and then failed leaves it empty rather than dangling. A call rejected by GStreamer's own argument checks - a closed connection, which answersEinval- still returns the message untouched and owned by the caller (#1096). - [Media Blocks SDK .Net] Stopping or disposing a pipeline no longer waits without a time limit for it to reach the NULL state. A pipeline that reported the change as asynchronous and then never completed it left
StopAsync()andDispose()blocked for good. The wait is bounded now, matching the rest of the stop path: it logs a warning and the teardown carries on (#849). - [Media Blocks SDK .Net]
AudioMixerBlock.CreateNewInputLive()returnsnullwhen the input could not be added, instead of a pad that was never wired to anything. Check the result before linking: the previous pad produced a GLib critical out ofgst_pad_linkand a link result that looked like an ordinary refusal. - [Media Blocks SDK .Net]
RemoveSilenceBlockand theRemoveSilenceaudio effect now actually remove silence. The underlying element'sremoveproperty defaults to off and was never set, so the filter detected silence and then passed every buffer through unchanged - the block was a no-op whatever it was configured with. It is enabled now. Check yourThresholdbefore upgrading: it is a linear amplitude, and the documentation used to have its direction backwards - it claimed 1.0 meant "no silence detection", where 1.0 is in fact full scale and classifies every sample as silence. That was harmless while nothing was ever dropped; now a threshold near 1.0 removes the whole stream. Two defaults move with it, both onto the element's own:Thresholdfrom 0.05 (-26 dB, which would have cut ordinary quiet speech) to 0.001 (-60 dB), andSquashfromtruetofalse. Neither default breaks existing code - nothing was ever dropped, so neither had any effect to change; they are what the block does now that it works. One thing does:Thresholdis validated against its documented 0.0-1.0 range now, the way the compressor's already was, so a value outside it throwsArgumentOutOfRangeExceptionwhere it used to be accepted and ignored. With the block actually removing audio, an out-of-range threshold empties the track instead.Squash = truepulls every buffer after a removed passage back by its duration, so the audio track ends up shorter than the video of the same recording - set it yourself when you want the gapless, shortened output and nothing has to stay in sync with it. TheSquashdocumentation was describing the missingremoveproperty rather than whatSquashdoes: silence is always dropped, andSquashdecides whether the surviving buffers are pulled back to close the gap or keep their original timestamps (the default). - [Media Blocks SDK .Net]
RemoveSilenceBlock.ThresholdandRemoveSilenceAudioEffect.Thresholdnow reach the silence detector. The linear value was passed straight to an element property that is measured in decibels, and the conversion GLib applied silently turned the default 0.05 into 0 dB - full scale, where practically every sample counts as silence. The linear value is converted properly now; the public API is unchanged. - [Core]
Gst.Sdp.SDPMessage's property setters now actually set what they say. All seven wrote directly into the native struct at a computed field offset instead of calling GStreamer's own setter. ForVersion,SessionName,InformationandUrithat stored a fresh copy over the old string without releasing it, leaking on every assignment. ForOrigin,ConnectionandKeyit was worse: those fields are C structs embedded by value -GstSDPOriginis six strings in a row - and the setter wrote a pointer to a temporary block into the first eight bytes of one, somsg.Origin = o;corrupted the username field, left the other five untouched, and leaked the block, whilemsg.Connection = c;never wroteTtlorAddrNumberat all. All seven now go throughgst_sdp_message_set_*, which replaces every field properly (#1086). - [Core] Breaking: several
Gst.Sdpmembers change shape, and the GStreamer binding'sFree(),Unset()andClear()methods no longer corrupt the heap.SDPMedia.Media/Proto/Information/KeyandSDPTime.Start/Stopbecome read-only properties;SDPMessage.AddMedia,InsertTimeandReplaceTimetake their value byrefbecause C moves it into the message and the caller must not release it again; and the setters onSDPMedia.Fmts/Connections/Bandwidths/AttributesandSDPTime.Repeatare removed - they stored a plain pointer array in a field C keeps aGArray*in, so any call to one guaranteed a crash on the next release (useAddFormat,AddConnection,AddBandwidth,AddAttributeandSDPTime.Set). Those methods marshalled a copy of the value into a temporary native block and released that, which went wrong three ways at once: the marshaller allocates everystringfield withCoTaskMemAllocand C frees it withg_free, the block itself was allocated withAllocHGlobaland freed withg_free, and the wrapper then freed the same pointer a second time - soGst.Rtsp.RTSPTransport.Free(),Gst.Rtsp.RTSPRange.Free(),Gst.Rtsp.Global.RtspRangeFree(),Gst.Sdp.SDPMedia.Free()/Uninit()and theGst.Sdp.SDPAttribute/SDPBandwidth/SDPConnection/SDPTime/SDPZoneClear()methods aborted the process instead of releasing anything. Values whose fields the binding copies -RTSPTransport,RTSPTimeRange,SDPAttribute,SDPBandwidth,SDPConnection,SDPZone- own no native memory at all, their factory already released it, so releasing one now clears the value and makes no native call.SDPMediaandSDPTimeare the exceptions: they wrap live native memory, so their string fields become raw pointers behind read-only properties (SDPMedia.Media/Proto/Information/Key,SDPTime.Start/Stop), which is what makesSetMedia,SetProto,SetInformation,SetKey,SDPTime.Set,Uninit(),Free()andSDPTime.Clear()work; write through those methods rather than the properties, and only on a value you own - on one borrowed fromSDPMessage.GetMediathe setter frees a string the message still points at. One thing to know about that: those properties now read native memory on every access, so a value obtained fromSDPMessage.GetMedia/GetTimemust not be read after the message is disposed - copy what you need out while it is alive.EqualsandGetHashCodeon those two structs consequently compare by pointer rather than by string content, the way they already did for the array fields - two medias with the same text are no longer equal, and a value's hash changes after aSetMedia. And the release methods on those two now really do release: callFree()/Uninit()/Clear()only on a value you created (New,Init,Copy,SetMediaFromCaps,SDPTime.Set), never on one borrowed fromSDPMessage.GetMedia/GetTime- that one is a window onto memory the message owns, and releasing it leaves the message dangling until its own teardown trips over it. A borrowed value is also only valid until the message is next modified:RemoveMedia,ReplaceTimeand their siblings release the element they drop, so read what you need out of aGetMedia/GetTimeresult before changing the message, not after. The same allocator mismatch is gone from theInsert/Replaceoverloads that take anSDPAttribute,SDPBandwidth,SDPConnectionorSDPZone: C copies the struct into the message or media by shallowmemcpyand frees its strings withg_free, and the binding was handing it CLR-allocated ones - no signature changed, the strings are now GLib-allocated at the boundary.SDPMessage.AddMediatakesrefbecause C moves the media into the message and empties the source. The matching leaks are gone with them:Gst.Rtsp.Global.RtspMessageNew/NewData/NewRequest/NewResponseleaked an 88-byte message plus its header array on every call, andSDPMedia.New/Init/Copy/SetMediaFromCapsleaked a media plus four arrays, because the only documented release path was one of the broken methods (#1086). - [Core] Breaking:
Gst.Sdp.SDPMedia.Fmts,Connections,Bandwidths,AttributesandGst.Sdp.SDPTime.Repeatreturn typed arrays and finally read what they describe. All five threwArgumentExceptionon any value that held something: they walked their field as a NULL-terminated array of pointers, and the helper doing the walking calledMarshal.PtrToStructurein a form that refuses a value type - which is the only reason it did not hang instead, because its loop compared the walking address against zero while incrementing that same address and so had no exit at all. In C these fields areGArray *, not pointer arrays, so repairing the walk would still have taken the array's length field for an element pointer.FmtsandRepeatarestring[]now,ConnectionsisSDPConnection[],BandwidthsisSDPBandwidth[]andAttributesisSDPAttribute[], read through GStreamer's own indexed accessors - all butRepeat, for which C exports none, so that one reads the array directly; they wereIntPtr[]. Reading one on an empty or already-released value returns an empty array rather than crashing. UnlikeMedia,Proto,Information,Key,StartandStop, which read native memory on every access, the values these five hand back are copies taken at read time and stay valid after the media or time is released (#1087). - [Media Blocks SDK .Net] One stalled pipeline no longer freezes bus message delivery for every other pipeline in the process. Latency recalculation ran directly on the GLib main loop, which is shared process-wide and dispatches one source at a time. A pipeline whose latency query could not complete - a stalled mixer, a wedged source - therefore held that loop and stopped the EOS, error and state-change messages of all other pipelines, including the ones their
StopAsync/Disposewere waiting on, so unrelated pipelines appeared to hang (#1065). The recalculation now runs off the bus loop, with bursts of latency notifications coalesced so a graph is never recalculated twice at once. - [Core] Breaking:
Gst.Object.ReplaceandGst.Rtsp.Global.RtspAuthCredentialsFreechange signature, and the GStreamer binding'sT **out-parameters now return real data instead of uninitialised heap. Eighteen P/Invoke declarations passed a C out-parameter by value, so native wrote its eight-byte pointer into the front of a caller-allocated struct-sized block and everything past that was read back as garbage -Gst.Rtsp.RTSPUrl.Parsereturned a url whose host, path and credentials were undefined,Gst.Rtsp.RTSPRange.Parsereturned a range whose unit was a random integer, and the same held forRTSPTransport.New,SDPMedia.New/Copy, theRTSPMessageconstructors andRTSPAddressPool.ReserveAddress.Gst.Object.Replace(oldobj, newobj)was worse: it handed native the object pointer where C wants the address of a variable, so every call unreffed the object's class pointer and overwrote it - it becomesReplace(ref Gst.Object oldobj, Gst.Object newobj), and the parameterless overload becomesReplace(ref Gst.Object oldobj).RtspAuthCredentialsFreenow takes the credential array pointer (IntPtr) rather than a singleRTSPAuthCredential, which native was reading as a pointer and freeing. Two more of the same family are fixed with it:Gst.Sdp.SDPMessage.Initbecomes an instance method (msg.Init()) andGst.Sdp.Global.SdpMessageInitnow takes the message, because C'sgst_sdp_message_initre-initialises a message you already own - declared as an out-parameter it wrote a whole SDP message through an eight-byte stack slot and aborted the process inside malloc; andWebRTCICE.OnGetLocalCandidates/OnGetRemoteCandidatesnow returnWebRTCICECandidateStats[], since C returns a NULL-terminated array of pointers that was being read as a single struct.Gst.Video.VideoInfo.InitandGst.Audio.AudioInfo.Initbecome instance methods for the same reason - C'sgst_video_info_init/gst_audio_info_initinitialise an info you already own, and as out-parameters they wrote a whole GstVideoInfo over the caller's stack frame and returned null every time; usenew VideoInfo()/new AudioInfo()to get one, thenInit()to reset it.Gst.Rtsp.Global.RtspTransportInit,RTSPTransport.Init,Gst.Sdp.Global.SdpMediaInitandSDPMedia.Initno longer hand those C functions an uninitialised heap block, which they began by callingg_freeon. TheGst.Rtsp.RTSPMessagestruct also gains thetype_dataunion it was missing, so its layout matches the native one (#1062). - [Core] macOS: video capture no longer opens a different camera than the one selected. The device index passed to
avfvideosrcwas recorded once at enumeration time, but macOS may reorder cameras between enumeration and pipeline start (USB re-enumeration), so after such a reorder every new capture opened whatever device had taken the selected camera's position - typically failing with "Internal data stream error" or capturing from the wrong webcam. The position is now resolved from AVFoundation's live device list by stable unique ID right before each start; the enumerated index remains as a fallback. If the selected camera is no longer connected, capture now fails with an explicit error instead of silently opening a different camera.VideoCaptureDeviceInfogainsAvfUniqueIDon macOS (#843). - [Core] iOS: the selected camera is now opened by its AVFoundation unique ID rather than by its localized name. Video capture looked the camera up by display name across every AVFoundation device, microphones included, so a name that was not unique - or that changed with the device language - could open a different camera or none at all. The unique ID recorded at enumeration is now authoritative: a camera that no longer resolves by it fails outright rather than falling back to a name match that could open a different camera. The name search remains only for a settings object built by hand, which carries no unique ID at all. A camera that cannot be found now fails with an error naming both the device and its unique ID (#1089).
- [Core] Video capture blocks no longer throw
NullReferenceExceptionwhen no camera was found.CreateWithDefaultDeviceAsync()returns a block with no settings when device enumeration comes back empty - camera permission denied, a simulator, a machine with no webcam - and only the Android path checked for it. Every other platform dereferenced the missing settings and threw out of the publicBuild(); bothSystemVideoSourceBlockandIOSVideoSourceBlocknow returnfalseand log what is missing. The same applies to settings that exist but name no device, and on iOS to settings with no video format. - [Core] SDK log events now carry the exception object, not just its text. Every logging call that takes an exception passed it to Serilog as a message-template value rather than as the exception, and a template with no placeholders discards it - so a sink whose output template renders
{Exception}printed nothing there, and exception types and stack traces never reached the log at all. They are attached properly now, across the whole SDK. - [Core]
KLVDecoderandKLVRemuxare nowstaticclasses. Both only ever exposed static members, so documented usage (KLVDecoder.DecodeFromFile(...)) is unaffected; code that instantiated them withnewwill no longer compile. - [Core]
VideoFrameRategained the<=and>=operators, completing the comparison set alongside the existing==,!=,<and>. They use the same 0.0001 tolerance as==.
2026.8.23¶
-
[Core] WPF skin controls are now available on every Windows target framework.
VisioForge.Corepreviously compiled the WPF skins (SkinPlaylist,SkinCaptureControls,SkinPlayerControls, …) only fornet*-windows10.0and .NET Framework targets, so projects targeting a plain-windowsTFM such asnet10.0-windows— including the Skinned Player and Skinned Capture demos under the nano build flavour — failed with "The tag 'SkinPlaylist' does not exist in XML namespace" (#859). Note thatSkiaSharp.Views.WPFships no asset for plain-windowstargets, so restore falls back to its .NET Framework asset (NU1701); the controls compile and work. -
[Media Blocks SDK .Net] Fixed a process crash when a subtitle auto-hide timer fired after the overlay block had been torn down.
OverlayManagerBlock.Video_Overlay_Updatedereferenced its internal element without a null check on the re-add path, so a late subtitle hide tick raised an unhandledNullReferenceExceptionon a timer thread and aborted the whole process (#823). - [Media Blocks SDK .Net] Media Foundation H.264/HEVC encoders no longer log a GLib critical and silently drop the reference-frames setting on every run where it is left at the default. The default of 0 ("encoder default") lies below the encoder element's own property range, which starts at 1; the value is now skipped instead of being written out of range (#857).
2026.8.22¶
- [Core] Breaking:
new Gst.Buffer(size),new Gst.BufferX(size)andnew Gst.BufferList(size)are replaced byGst.Buffer.NewAllocate(size),Gst.BufferX.NewAllocate(size)andGst.BufferList.NewSized(size). The size constructor sat one implicit conversion away from the pointer constructorBuffer(IntPtr), and since .NET 7 anintliteral converts implicitly to a native integer - sonew Gst.Buffer(1024)silently bound to the pointer overload and produced a buffer wrapper over address 1024. Nothing failed at the call site; it crashed later inside GStreamer with no hint of where it came from. The allocating form is now a named factory that cannot be confused with wrapping a pointer, and both old spellings fail to compile with a message naming the replacement. Wrapping an existing native pointer is unchanged. - [Core] Long GStreamer sessions no longer grow their native memory footprint on every negotiation, frame push and dropped frame. The managed wrappers for
GstCaps,GstBuffer,GstEvent,GstMessage,GstMemory,GstSample,GstQueryandGstTagListnever released the native object:Dispose()andusingon them did nothing at all, so every capability negotiation, every pad-caps query and every self-allocated buffer that was created and released left its native allocation behind for the life of the process. The effect grew with running time and with the number of pipelines built and torn down; it was largest on paths that touch caps or buffers per frame - pad probes, overlays, VU metering, and the custom mixer's queue-overflow frame drops. Reference counting is restored, so disposing these objects - or letting the garbage collector do it - now actually frees them. - [Video Edit SDK .Net] Encoder settings on the render/output path are no longer silently lost on hosts where the encoder element exposes fewer properties. Video Edit renders configured the encoder through the GStreamer
encodebinprofile, which writes every property with an uncheckedg_object_set: a property the concrete element class does not expose - Media Foundation encoder classes are generated per device, so their property set differs from machine to machine - raised a GLib critical and was dropped without any error. The profile now pins only the encoder factory; the settings are applied to the encoder element after encodebin creates it, with each property probed first and a warning logged when one is not available. - [Media Blocks SDK .Net]
SimpleVideoMarkDetectBlock.VideoMarkDetectednow actually fires. The block installed its bus handler withBus.AddWatch, but a GStreamer bus supports a single watch and the pipeline already owns it, so the install silently failed and watermark detection never reported anything; the handler is now delivered through the pipeline's own bus signal dispatch. Two defects found behind the same dead event are fixed with it: the detection pattern was read from a message field that does not exist (the element posts it asdata), and the handler could be handed an already-released message by the pipeline's own bus handler running before it. - [Core] Disposing
DeviceEnumeratorwhile another thread was starting device monitoring or enumerating NDI/Decklink devices no longer risks disposing the same GStreamer device monitor twice - which surfaced as GLib object-lifetime criticals in the log, or as a device monitor left running after dispose. Monitor teardown now serializes with monitor creation through one lock (so device-monitor work is queued across enumerator instances), and concurrentDispose()calls are safe. NDI enumeration still never blocks other instances: its potentially slow mDNS discovery runs outside the shared lock on an exclusively claimed monitor. - [Core] Disposing any
DeviceEnumeratorinstance no longer breaks NDI device-provider toggling for every other enumerator in the process. Dispose released the shared registry-feature wrapper all instances use to load/unload the NDI provider, so after one enumerator was disposed its siblings passed a dead pointer into the GStreamer registry on every later enumeration (gst_registry_remove_feature: assertion 'GST_IS_PLUGIN_FEATURE' failedin the log). The reference is now dropped instead of disposed. - [Core] Dropping an engine object without disposing it no longer risks killing GStreamer for the rest of the process.
VideoCaptureCoreX,MediaPlayerCoreX,SimplePlayerCoreX,MediaBlocksPipeline, the Live Video Compositor and its outputs, the overlay managers and several other classes ran their full GStreamer teardown from the garbage collector's finalizer thread when an instance was never disposed - which could take the process-global GStreamer registry with it, so every pipeline created afterwards failed to build with nothing in the log connecting the failure to the object collected minutes earlier. Finalizers now leave the native objects to the binding's deferred release path;Disposeremains the way to stop pipelines deterministically. One trade to know about: a recording whose engine was never disposed ends without a muxer trailer and stays unplayable - dispose explicitly to finalize files. - [Core] An undisposed GigE (Aravis) camera now releases its stream and camera handles at collection instead of taking locks, tearing down timers and raising events from the finalizer thread. Stopping acquisition still requires an explicit
Disconnect(). - [Media Player SDK .Net] A faulted dispose of
MediaPlayerCoreXno longer leaves the player permanently half-torn-down with no way to finish it. If stopping or closing the pipeline threw duringDispose/DisposeAsync, the player marked itself as disposed while the GStreamer pipeline had never reached NULL and internal resources were never released - and every later dispose call only re-observed the stored failure instead of retrying. A faulted teardown now leaves the player usable, flushes and re-arms the debug log for the next attempt, and a subsequentDispose()orDisposeAsync()completes the teardown. - [Video Capture SDK .Net] DirectShow Picture-in-Picture recording no longer fails with "Unable to set PIP layer settings" in Horizontal and Vertical layouts, and
PIP_CustomOutputSize_Setnow produces output of exactly the requested size. The struct passed by value to the video mixer filter declared its frame-duration field as 32-bit while the native filter reads it as 64-bit, so every output-settings call was rejected and the mixer silently kept its previous canvas: in Horizontal/Vertical layouts the later layer-position calls then failed with an error at start, and with a custom output size smaller than the main video the recording came out at the wrong size. Output size is now applied before layer positions, the main video fills a custom canvas, and a failed PiP configuration call logs the failing parameters with the native result code.
2026.8.21¶
- [Demos] The Avalonia demos and the console RTSP servers build again on macOS regardless of which macOS workload patch is installed. They pinned
net10.0-macos26.2, a target platform version that only machines whose workload manifests declare 26.2 accept - everywhere else the build failed before compilation withNETSDK1140: 26.2 is not a valid TargetPlatformVersion for macOS. The demos now usenet10.0-macoswith no version suffix, like the rest of the sample tree, so the platform version follows whatever the machine has installed. - [Demos] The remaining Media Blocks console demos and the Blazor RTSP servers build again on Apple-silicon Macs. An unconditional
PlatformTarget x64conflicted with theosx-arm64runtime identifier inferred fornet10.0-macos(NETSDK1032) in VideoResizer, FrameRateAdjuster, RTSPViewCV and both Blazor RTSP servers; the pin is now Windows-only. The ones used as.appbundles on macOS also lacked a bundle identifier and now declare one. - [Demos] The Live Subtitles console sample no longer declares a macOS target. Whisper.net requires static whisper.cpp archives on Apple platforms and
Whisper.net.Runtimeships none for macOS, so the sample's speech-to-text pipeline could not link there; it stays available on Windows and Linux. - [Media Blocks SDK .Net] Stopping a pipeline with
ObjectAnalyticsBlockno longer logs analytics or overlay errors and no longer loses the frame that was in flight. Teardown freed the block's renderer, tracker, zones and lines while the streaming thread could still be using them, so a frame arriving during the stop was dropped with a loggedObjectDisposedExceptionor null-reference message; teardown now waits for the frame in flight before freeing anything. - [Media Blocks SDK .Net]
FallbackSwitchenabled on source settings passed directly to a source block is no longer silently ignored.RTSPSourceSettings.FallbackSwitch(and the same property on the SRT, NDI, RTMP and HTTP source settings) is applied byVideoCaptureCoreXand by an explicitFallbackSwitchSourceBlock; a bareRTSPSourceBlock,SRTSourceBlock,SRTRAWSourceBlock,NDISourceBlock(or the Windows-onlyNDISourceXBlock),RTMPSourceBlockorHTTPSourceBlockdoes not use it, and enabling it there now logs a warning at build time explaining how to get automatic failover instead of proceeding without any message. - [Core]
MediaInfoReaderXno longer spins up a full-throughput decoder just to read file metadata. The discovery pipeline let GStreamer auto-plugdav1ddecwith its defaults - threading and frame delay sized to the CPU core count - so reading the metadata of one 8K AV1 file pre-allocated a reference-frame pool costing ~700 MB of working set on a 14-core machine and growing with every core. Discovery now pins that decoder to low-latency single-thread mode before it starts, bounding the same read by the stream's reference structure instead of the machine's core count (~310 MB for 8K AV1 on any machine). - [Core] The built-in HLS/DASH HTTP server on macOS and Linux no longer dies if a player connects while it is starting.
- [Core] The built-in HLS/DASH HTTP server on macOS and Linux now accepts IPv6 clients, including
http://localhost/when that name resolves to::1. - [Media Blocks SDK .Net] Adding an audio or video effect to a running pipeline no longer leaves it paused. Under concurrent effect changes, the pipeline could still be resuming when the add returned, leaving later effect operations or stopping playback waiting indefinitely.
- [Media Blocks SDK .Net] A video or audio effect added while the pipeline has just left Playing now reaches the running graph. A pause that landed during the add used to leave a video filter in NULL, and to skip the audio filter until the next build.
- [Media Blocks SDK .Net] A pipeline that was preloaded and then resumed no longer flickers back to paused, and no longer seeks
StartPosition, after playback was already started. Resume (or the nextStartAsync) had already publishedPlay, but a late confirmation of the preload's pause could overwrite it and re-seek.MediaPlayerCoreX.State, which reports the pipeline's state, is covered by the same fix. - [Media Blocks SDK .Net] A live-added proxy, buffer or subtitle bridge source now brings its whole graph up with the pipeline. Those three sources published no core wrapper, so a live add synced only the one GStreamer element the block exposed and left the rest of the bridge in NULL.
- [Media Blocks SDK .Net]
MediaBlocksPipeline.SyncBlockStateLiveno longer throws on a block that was never built, and no longer races the block's own teardown. Calling it out of order - beforeAddBlockLivebuilt the block, or after it had been cleaned up - raised aNullReferenceExceptionout of the SDK instead of returningfalsewith a logged reason like every other refusal in that method. It also read the block's element and then synchronised it after releasing the lock that guarded it, so a teardown landing in that window left the live add reported as "failed to set block to Playing" with the real reason only in a GStreamer log line. The same "has not been built" refusal now also applies toMediaBlockHelper.SetStateandMediaBlockHelper.SendEvent. - [Media Blocks SDK .Net] RTSP playback no longer fails with "Failed to link RTSP pad: WasLinked" when the source re-announces a pad. On a reconnect, or when an RTSP server re-announces a stream,
UniversalSourceBlockV2could report a pad it had already linked as a link error and end the session - intermittently, since two of rtspsrc's streaming threads can pass the "is this pad linked" checks together. A duplicate announcement is now recognised from the link result itself - a second attempt reportsWasLinked, which is logged at debug level instead of failing the session - and the handler's check-and-link section is serialised. - [Core] A handler connected with
Connect(...)or with+=on a generated GStreamer event no longer keeps that object alive for the life of the process. EveryConnect(...)on an element - the mechanism behind source, demuxer and decoder auto-plugging - and every+=on a generated event was recorded in a process-wide table that only an explicit unsubscribe ever cleared, and the entry held the element, the handler, and everything the handler had captured. An application that builds and tears down sources or decoders in a loop, a playlist or a transcode over a directory, grew without bound with nothing disposable to blame. A connection is now owned by the object it was made on and is released with it. Two defects of the same family go with it: a handler silently stopped being delivered once its wrapper had been disposed, and the callback's handle was released while an emission could still be inside it - a rare crash on a streaming thread when a recording was stopped on a file split.
2026.8.20¶
- [Video Capture SDK .Net]
VideoCaptureCoreX.WaitForStartAsyncno longer waits forever, and no longer returns before the capture starts. It polled forPLAYINGand nothing else, so a source that never gets there - an RTSP or HTTP address that black-holes, a capture device with no signal, a Decklink with no input - parked a thread on aTaskthat never completed, and an asynchronous failure (which takes the pipeline back toREADYwithout tearing it down) did the same. The wait now ends when the start settles somewhere it will not leave, and has a 30-second deadline; the newWaitForStartAsync(TimeSpan timeout, CancellationToken cancellationToken = default)overload chooses that deadline, cancels the wait, and returns whetherPLAYINGwas actually reached. The documented fire-and-forget pairing_ = StartAsync(); await WaitForStartAsync();also no longer completes instantly against a capture whose pipeline does not exist yet. -
[X-engines] A second
Start()landing while the first is still building is now rejected instead of building over it.VideoCaptureCoreX.Start()andMediaBlocksPipeline.Start()had the guard only on their async twins, so a concurrent call cleared the first start's state and re-entered the build over the pipeline that call was still assembling. Relatedly, a start that fails now finishes its own rollback before it releases the start, so processing blocks registered by another thread are no longer disposed under it, and a throw out of a restart's teardown no longer leaves the instance permanently unable to start. -
[Media Blocks SDK .Net] A
ChromaKeyBlockadded to a running pipeline now brings its whole graph up with the pipeline, not just the compositor. The block builds six elements, and a live add synchronised the state of only one of them, so the other five - the background scaler and capsfilter, the alpha key, and both converters - stayed in whatever state they had been created in. They now live in one bin, which is the one thing the pipeline brings up. - [Media Blocks SDK .Net] A start the pipeline refuses is now reported as stopped instead of as playing. When an element refused the transition to playing - a capture device that cannot be opened, a renderer that cannot create its window -
Start()returnedfalsebut leftStatereportingPlay, and left every element that had already opened a device, handle or socket holding it. The pipeline is now torn down and reportsState = Free, so a retry rebuilds it. WithPauseOnStopenabled that retry previously returnedtruewithout rebuilding anything, on a graph that never started. A start that never started no longer raisesOnStopwhen it is stopped afterwards.MediaPlayerCoreX.State, which reports the pipeline's state, is covered by the same fix, andVideoCaptureCoreX.Startnow returns as soon as the pipeline fails instead of going on to start the auto-start outputs against it. - [Media Blocks SDK .Net] A preload that fails while prerolling is now reported.
StartAsync(onlyPreload: true)andStart(onlyPreload: true)returnedtruewhenever the source failed asynchronously - a camera already in use, an unplayable file, a stream that never connects - and left the pipeline holding whatever its elements had opened, with nothing telling the caller. Only a transition the pipeline refused outright was reported. Both now returnfalseand tear the partial graph down;Pause()on a running pipeline reports the same failure the same way. - [Media Blocks SDK .Net] The processing block passed to an
LVCVideoInputconstructor is now applied. On LiveVideoCompositor V2, the optionalprocessingBlockargument of bothLVCVideoInputconstructors was stored and never linked into the graph: the input composited unprocessed, with no error and no log line, while the identically shaped argument ofLVCVideoAudioInputworked. It is now an alias forLVCVideoInput.ProcessingVideoBlocks, so the block runs between the source and the mixer as the argument always implied. Code that already usesProcessingVideoBlocksis unaffected. - [Media Blocks SDK .Net] The
channelparameter ofLiveVideoCompositorV2.Video_Effects_*is deprecated. V2 has a single effects block on the composed output, after the mixer, so the index never selected anything -Video_Effects_Clear(channel: 1)cleared the whole composition's effects, where the identically named V1 call validates the index and ignores a channel that does not exist. EveryVideo_Effects_*method now has a channel-free form; the overloads that take achannelstill work, forward to it and warn. To process a single input rather than the composition, add aVideoEffectsBlockto that input'sLVCVideoInput.ProcessingVideoBlocks- those blocks run between the source and the mixer, which is where V1's per-channel effects were. V1 is unchanged. - [Media Blocks SDK .Net] An effect added to a running pipeline while that pipeline is being stopped is no longer left in the graph unreachable.
VideoEffectsBlock.AddOrUpdateAsyncandAudioEffectsBlock.AddOrUpdatesplice the new effect into the live graph, and that work can take seconds - it runs yourOnUpdatehandler twice and pauses the pipeline to relink it. A stop that gave up waiting for it went ahead and released the block anyway, and the insertion then carried on and spliced its element in regardless: the block no longer knew about it, soRemove()reported success without removing anything and the nextBuild()created a second element under the same name, for the rest of the run. Both blocks now stop an insertion the moment a teardown has been through, and leave the element to the pipeline's own disposal - on an ordinary stop that is what releases it. The effect stays registered, so the next build puts it in the graph. - [Media Blocks SDK .Net]
MediaBlocksPipeline.Statenow reportsPauseas soon asStartAsync(onlyPreload: true)/Start(onlyPreload: true)returns, instead of briefly reportingFreewhile the pipeline was already preloading. Inside that window a preloaded pipeline looked stopped to every "is anything running?" check:StopAsyncandStopreturned without tearing it down and without raisingOnStop,Disposeskipped the stop it does first,ClearBlocksdisposed the blocks of a live pipeline instead of refusing, aStartPositionset on the preloaded pipeline was dropped instead of seeked, and starting playback right after a preload could be rejected with "Already starting or start in progress".MediaPlayerCoreX.State, which reports the pipeline's state, is covered by the same fix.
2026.8.19¶
- [Media Blocks SDK .Net]
RTSPSourceSettings.BufferModeandDropOnLatencynow reach the RTSP source. Setting them previously had no effect, so jitter-buffer tuning was silently ignored. The default jitter buffer is 500 ms;LowLatencyModeuses 150 ms, or the explicitLatencyif you set it to 150 ms or less. - [Media Blocks SDK .Net] Changing video mixer settings while the pipeline is being stopped no longer crashes or silently does nothing.
SetSettings,Input_Update,Input_Move,StartFadeIn,StartFadeOut,Input_UpdateChromaKeySettingsandInput_SetChromaKeyEnabledran with nothing serialising them against the block's own teardown, so a call that landed during a stop reached GStreamer through an element the teardown had already released - aNullReferenceException, or a change that was accepted and quietly not applied. Building a mixer while it was being stopped had the same problem and could throw out ofBuild(). AffectsVideoMixerBlock,VideoMixerSourceBlock,GLVideoMixerBlock,D3D11VideoCompositorBlockandMetalVideoCompositorBlock.AddInputPadLiveon a mixer that is not built now returnsnulland logs, instead of throwing. - [Media Blocks SDK .Net] A video mixer fade or move animation no longer outlives the block that started it.
StartFadeIn,StartFadeOutandInput_Moveanimate on a background thread for the duration requested; stopping or disposing the mixer while one was running left that thread writing to a released element, which took the whole application process down with an unhandledNullReferenceException. Teardown now stops the animations and waits for them first. They also no longer keep the process alive after everything else has finished. - [Video Fingerprinting SDK .Net] Disposing a
FrameSourcewhilePlayAsyncwas still starting no longer leaves a playing pipeline behind. The teardown and the start shared no synchronization, so aDispose()- or aStopAsync()- landing mid-start tore down the session the start was still building, and the start went on to leave a fully wired pipeline that nothing owned:OnVideoFramekept firing for the rest of the process. OverlappingPlayAsync/StopAsynccalls, which a UI can produce with two quick clicks, could also tear the same pipeline down twice.FrameSourcenow also implementsIAsyncDisposable;await frameSource.DisposeAsync()is the deterministic teardown, because a synchronousDispose()cannot wait for a start already in flight. - [Media Blocks SDK .Net] Disposing a pipeline that was only preloaded (
StartAsync(onlyPreload: true)) no longer hangs. The teardown skipped the stop for a preloaded pipeline and set its elements to the null state under a live streaming thread, which wedged the disposing thread and the streaming thread against each other indefinitely. - [Media Blocks SDK .Net] Disposing a pipeline while it was reporting a state change no longer hangs. The teardown and the pipeline's own message thread could block on each other for good.
- [Media Blocks SDK .Net]
VP8EncoderSettings.GetCaps()now reportsvideo/x-vp8instead ofvideo/x-vp9. - [Media Blocks SDK .Net] An IPv6 URL such as
udp://[ff05::1]:5004now reaches a UDP source, a universal source and an RTSP server without the brackets, so the element binds and joins multicast instead of failing silently. A Windows link-local zone id (%12) is left intact instead of being decoded as a byte. - [Media Blocks SDK .Net]
LiveSourceSwitchBlock.Switch(i)no longer pairs one source's video with another's audio on a switcher that holds a mix of input types. A video-only input and a video+audio input take their switch pads from two independent counters, so the same index meant a different source in each of the two switches: with a video-only input added first,Switch(1)played the second input's picture with silence, because no input feeds audio pad 1.Switchnow resolves the input at the given index and moves each switch to that input's own pad. An input that carries only one of the two streams leaves the other switch where it was, so switching to a video-only input keeps the audio that was playing. NewCurrentVideoIndex/CurrentAudioIndexproperties report the pads actually selected. Two smaller changes come with it: an index past the last added input is now refused and logged instead of pointing the switch at a reserved pad that carries nothing, andSourceSwitchBlock.Switchreturnsbool-falsewhen the block is not built yet, the index is out of range, the pad at that index was never obtained, or a concurrent stop tore the element down - where it used to returnvoid. Every one of those is logged; a switch that could not be applied no longer passes silently. - [Media Blocks SDK .Net]
LiveSourceSwitchBlockDynamic.Switch(slot)no longer silences the audio when the slot holds a video-only input. Nothing feeds that slot's audio pad, so moving the audio switch there played silence; it now stays where it was, matchingLiveSourceSwitchBlock.Switch. An empty slot is not that case - switching to a slot with no input in it still takes the audio with it, rather than leaving the previous source's sound playing under a black picture; one limit is structural, in that a switcher whoseMaxAudioInputsCountis smaller than itsMaxVideoInputsCounthas no audio pad above the audio limit for the audio to move to. A slot index past the last slot is now refused and logged; on a switcher whose audio switch has more pads than its video one it used to move the audio switch while the video switch declined, so the sound went silent under a picture that kept running. ItsCurrentVideoIndex/CurrentAudioIndexalso start at-1instead of0- they used to report slot 0 before any switch had been applied, which was not true, and they now record only a switch the block actually applied. Code that reads either property before the first switch and indexes its own array with the result has to handle-1. - [Media Blocks SDK .Net] Disposing a
LiveSourceSwitchBlocknow releases its inputs and internal resources. The teardown freed nothing at all, so an application that created and disposed switchers - or added file inputs to one - leaked a whole graph, including a pipeline per input, on every instance. - [Media Blocks SDK .Net] A
LiveSourceSwitchBlockconfigured for one stream only (VideoStreamorAudioStreamturned off) now starts. It threw aNullReferenceExceptionon the firstStartAsync, so the setting could not be used at all.Input_AddAsyncnow also refuses an input for a stream the switch does not carry and returnsfalseinstead of throwing, or - for an audio input on a video-only switch - accepting it and playing nothing. The same applies toLiveSourceSwitchBlockDynamic.Input_AddToSlotAsync, where a video/audio input on a switch without audio is now refused rather than half-connected. - [Media Blocks SDK .Net] Building a
BridgeBufferSourceBlockwhose paired sink was never created, or has already been disposed, no longer throwsArgumentNullException—Build()returnsfalseinstead. - [Media Blocks SDK .Net] Retargeting a UDP sink at runtime no longer sends to a mixed destination.
UDPSinkBlock.SetFilenameOrURLand the UDP MPEG-TS sinks pushed the new host and the new port as two separate steps, so two calls landing at once could leave the sink streaming to one URL's host and the other's port. An IPv6 URL now reaches the sink correctly -udp://[ff05::1]:5004used to arrive with the brackets still on the address, which it cannot resolve, the URL reported back byGetFilenameOrURLcould not be parsed again, and a link-local zone id (udp://[fe80::1%25eth0]:5004) kept its percent escape. This covers the UDP sink; the UDP source, universal source and RTSP server are the matching follow-up. New public overloadUDPSinkSettings.TryParseUrl(string url, out string host, out int port)returns the parsed pair, for callers that must not read it back off shared settings. - [Core] Fixed a memory leak on every GStreamer property or caps field set to a string, or to a caps, structure, buffer or tag reference. The value handed to the element was copied but the caller's copy was never released, so each set leaked the string's allocation - or, for caps and elements, held a reference that kept a live GStreamer object alive for the rest of the process. Worst on properties pushed repeatedly: text and image overlay contents, bridge channel names, device paths, file names and URLs, and every caps renegotiation. Numeric and boolean properties were never affected.
- [Media Blocks SDK .Net] A media block that is garbage-collected without being disposed no longer tears its GStreamer elements down from the finalizer thread. An application that forgot a
Dispose(), or dropped a block after an exception, could see a crash or a stall inside the .NET finalizer during collection; abandoned blocks now leave their elements to the pipeline that owns them. - [Core] The WPF
VideoViewno longer shows a black preview in a remote-desktop session when the D3D11 composable renderer is requested. Such a session composes WPF in software and its Direct3D9 device sits on a different adapter, so the GPU surface can never be presented; the view now detects that and falls back to its software rendering path automatically, logging a warning, instead of displaying nothing. - [Core] Fixed the WPF
VideoViewsilently dropping back to software rendering on the second playback. After aStop()the next start rebuilt the view from the engine's renderer mode alone — and both theD3D11ComposableandDirect2DManagedpaths rewrite that mode toFrameCallback— so GPU-resident composition degraded to a per-frame CPU upload, with no error andGetSurfaceProvider()returningnull. The view now remembers the renderer it was asked for and restores it on the next start; setting a different renderer mode on the engine between two starts still switches away from it, as before. - [Media Blocks SDK .Net] Audio effects added during playback are now inserted at their position in the effect list, so the applied order no longer depends on whether an effect was added before or during playback - and a second effect added straight after the first is no longer silently left out of the pipeline. The block's output also correctly follows the last effect after live additions and removals; removing the last effect used to leave the block pointing at the removed one.
- [Media Blocks SDK .Net] An audio or video effect added while the pipeline was being stopped or disposed is no longer silently lost. Stopping the pipeline from the effect's own
OnUpdatehandler let the block build the effect's element against a pipeline that no longer existed: nothing failed, nothing was reported, and the effect was simply absent from the graph. The block now reports it and keeps the effect registered, so the next start puts it in. - [Core] Calling
Dispose()on a GStreamer wrapper object no longer prints a GLib critical such asgst_iterator_free: assertion 'it != NULL' failedorgst_structure_free: assertion 'structure != NULL' failed. The object was always freed correctly; a second, redundant free with a null handle produced the log line. This affectedGst.Iterator,Gst.Structure,Gst.Video.VideoInfo,Gst.Audio.AudioInfo,Gst.Video.VideoConverter,Gst.ParseContextand the other non-reference-counted opaque wrapper types, all of which are now safe to dispose.
2026.8.18¶
- [Core] Fixed a crash when playback was stopped while the WPF
VideoViewwas rendering throughDirect2DManaged. The view freed the RGBA staging buffer on the UI thread while a frame was still being converted into it on the streaming thread, which corrupted the heap or took the process down outright. The same buffer was also sized from the very first frame and never grown, so a source that switched to a higher resolution mid-stream overflowed it. - [Core] Fixed the WPF
VideoViewsilently replacing a classic engine'sWPF_WinUI_Callback/FrameCallback,None,Direct2DManagedorD3D11Composablerenderer mode with EVR. The view built a native HWND renderer instead of the requested one, so WPF controls placed over the video stopped composing (airspace), and forWPF_WinUI_CallbackandNonethe engine'sVideo_Renderer.VideoRendererread backEVR— a mode the application never set. (Direct2DManagedandD3D11Composablestill read back asFrameCallback: the view draws those itself and the engine feeds it frames.) CallingVideoView1.SetNativeRendering(false)is no longer required for the software rendering path. - [Media Blocks SDK .Net] Stopping a pipeline that has already reached the end of its stream no longer waits ten seconds for an end-of-stream that has already happened. The output file was already complete; the stop just took that long to return.
- [Media Blocks SDK .Net] Fixed stopping a pipeline reporting a spurious error —
Resume for EOS did not reach PLAYING ... Muxer may not finalize— when the pipeline had not finished starting up yet. The stop also stalled two seconds before reporting it, and applications that treat an SDK error as a failure saw a clean stop as a failed one. - [Media Blocks SDK .Net] Fixed a crash when chroma-key settings were changed while the pipeline was being stopped. Updating the key color, alpha or sensitivity from one thread used to be able to land on the filter while another thread was tearing it down.
- [Media Blocks SDK .Net] Fixed audio effect settings being silently discarded when changed while the pipeline was being stopped. Every audio effect — volume, balance, amplify, echo, compressor/expander, both equalizers, pitch, loudness normalization, RNNoise, HRTF, Csound, the Chebyshev filters, karaoke, wide stereo, reverberation and the rest — used to be able to push a change onto an element another thread had already released, in which case nothing happened and nothing was reported.
- [Media Blocks SDK .Net] Fixed removing an audio effect while the pipeline is being stopped leaving that effect in the graph. The removal reported success while the effect was still spliced into the chain, and could also throw
IndexOutOfRangeExceptionout ofAudioEffectsBlock.Clear. - [Media Blocks SDK .Net] Fixed
AudioEffectsBlock.Removenot removing an effect that had been updated since it was added. The live element was unplugged but the effect stayed in the list, so the next time playback started it came back. - [Media Blocks SDK .Net] Fixed
AudioEffectsBlock.AddOrUpdatecalled twice with the same effect object stopping that effect's later property changes from reaching the graph. - [Media Blocks SDK .Net] Audio effect names are now matched the same way everywhere — case-insensitively. Adding
Volumeand thenvolumeused to create two effects that both drove the first one. - [Media Blocks SDK .Net] Fixed a
NullReferenceExceptionwhen an audio effect property was changed after the pipeline had been stopped. - [Media Blocks SDK .Net] Pipelines containing an
AudioEffectsBlockno longer carry one unused audio converter element each. - [Media Blocks SDK .Net] Fixed the whole video or audio effect chain silently disappearing for the rest of the run after a stop that had to give up waiting for an effect operation to finish. The block was left claiming it was built while owning nothing, so every later start produced no effects at all and reported no error.
- [Media Blocks SDK .Net] Fixed
VideoEffectsBlockkeeping every effect object it was given alive after it was disposed. The effects stayed subscribed to the disposed block, so neither they nor the pipeline's elements could be collected, and changing one of their properties afterwards reached a block whose pipeline was gone.
2026.8.17¶
- [Media Blocks SDK .Net] Fixed playback freezing for the rest of the run when a video or audio effect added to a running pipeline is refused by the graph. The effect is simply not applied now, instead of leaving the chain cut at the point it was being inserted.
- [Media Blocks SDK .Net] Fixed the same freeze on the removal side: removing a video or audio effect from a running pipeline no longer cuts the chain when the surrounding elements cannot be linked to each other. The effect stays in place and the removal reports failure, instead of reporting success over a chain nothing flows through.
- [Media Blocks SDK .Net] Removing an effect that is built from several elements — box, crop, aspect-ratio crop, resize, pan/zoom, fisheye, LUT, text overlay, image overlay, QR overlay, mouse highlight, overlay manager, pitch, compressor/expander, loudness normalization — now takes them out of a running graph as one unit. A removal that succeeded for some of an effect's elements and failed for the rest used to leave the effect half in the graph: the next effect added live could end up in the wrong position, or the block could stop producing output altogether. The removal now either takes the whole effect out or leaves it running untouched and reports failure.
- [Media Blocks SDK .Net] Removing a LUT or QR-code overlay effect live no longer leaves the chain pinned to that effect's pixel format. Both build an internal format filter, and it used to stay in the graph after the effect was gone, forcing RGB on everything downstream of it for the rest of the run.
- [Media Blocks SDK .Net] Repeatedly adding and removing a LUT effect during playback no longer leaves an unused element in the pipeline for every add. That internal format filter is now taken out with the rest of the effect instead of accumulating one per add; the QR-code overlay releases its own the same way.
- [Media Blocks SDK .Net] Changing an effect's settings from one thread while the pipeline is being stopped on another no longer silently does nothing. The push used to be able to land on an element the teardown had already released, in which case it was discarded without any error being reported. Most visible on Android, where the renderer's resize is updated from the view thread whenever the view is resized or the device is rotated.
- [Media Blocks SDK .Net] Fixed a
NullReferenceExceptionwhen the Android renderer's view was resized while the pipeline was stopping.
2026.8.16 - stable¶
- [Core] Fixed video fingerprinting
FrameSource.PlayAsyncthrowingNullReferenceExceptionunless the optionalCropandCustomResolutionproperties were set. - [Core] Video fingerprinting: new
FrameSource.StopAsync()stops the current session and releases its pipeline so the instance can be reused — previously the only way to stop was disposing the whole object. - [Core] Video fingerprinting: the
VFPAnalyzererror callback now fires exactly once per failed analysis, on the caller's thread, with the underlying cause — previously mid-run errors could be swallowed entirely or delivered from the pipeline's internal thread. - [Core] Video fingerprinting: a repeated
FrameSource.PlayAsyncnow stops and disposes the previous session instead of leaving its pipeline playing for the life of the process, a failedPlayAsynccleans up the half-built pipeline and is reported through theVFPAnalyzererror callback instead of hanging the analysis, andDisposetears the session down in a safe order. - [Core] Fixed event handlers subscribed after start never being called in
VideoCaptureCoreX(OnError,OnStart, including separate outputs),MediaPlayerCoreX(OnError,OnStart,OnPause,OnResume) and the video fingerprintingFrameSource(OnError,OnStop) — the engines captured a snapshot of the handler list at start, so late subscribers were silently ignored and unsubscribing mid-session did not detach. - [Media Blocks SDK .Net] Fixed LiveVideoCompositor
Video_Effects_Clearremoving every channel's effects instead of only the requested channel's — clearing channel 0 no longer wipes the effects of all other channels for the rest of the run. - [Media Blocks SDK .Net] LiveVideoCompositor video-effect calls that target a channel which does not exist, or that run after the compositor was disposed, no longer throw
ArgumentOutOfRangeException— the call is ignored and reported through the log andOnError. Applies toVideo_Effects_AddOrUpdateAsync,Video_Effects_Get, bothVideo_Effects_RemoveAsyncoverloads andVideo_Effects_Clear. - [Media Blocks SDK .Net] Fixed LiveVideoCompositor
OnErrorhandlers never being called — pipeline errors were dropped instead of reaching subscribers. - [Media Blocks SDK .Net] Video effects added during playback are now inserted at their position in the effect list, so the applied order no longer depends on whether an effect was added before or during playback, and the block's output correctly follows the last effect after live additions and removals.
- [Media Blocks SDK .Net] Video effect names are now matched without regard to case. Adding
"Blur"and then"blur"updates one effect instead of creating a second one that could never be updated or removed, andVideo_Effects_Getkeeps finding an effect whatever case it is asked for. - [Media Blocks SDK .Net] Updating a video effect with one of a different type under the same name now replaces it in the pipeline. The graph used to keep applying the old effect and only report the mismatch.
- [Media Blocks SDK .Net] Fixed a video effect added while the pipeline was starting never reaching the pipeline for the rest of the run. It is now applied as soon as playback begins.
- [Media Blocks SDK .Net] Fixed adding, removing and updating video effects from several threads at once leaving a filter in the pipeline that no public call could reach, or applying settings to an effect that was being removed.
- [Media Blocks SDK .Net] Adding a video effect to a running pipeline now returns only once playback has resumed, so stopping right after it no longer reports that the pipeline could not be resumed.
2026.8.15¶
- [Media Player SDK .Net] / [Media Blocks SDK .Net] Fixed
Video_Effects_RemoveAsyncnever returning when the pipeline has nothing to pause — a player that was never opened, or one already being stopped. It polled for the paused state with no way out, and in one overload it blocked the calling thread outright, so the call could not be interrupted from outside either. It now checks the pause once and returns: a pause that did not land is reported through the log and the effect is left in place.LiveVideoCompositor.Video_Effects_RemoveAsyncis fixed the same way. - [Media Blocks SDK .Net] Fixed adding a video effect never returning when the pipeline is shutting down, and adding one to a paused pipeline waiting forever. The wait for playback to resume is now capped at thirty seconds; past it the effect is left for the next start and the wait is reported.
- [Media Blocks SDK .Net] Fixed a crash when changing a property of a video effect that is not applied to the running pipeline — one added while playback was paused or stopped, with at least one other effect already active. The property setter threw an exception instead of doing nothing.
- [Media Blocks SDK .Net] Fixed an effect being applied twice to a running pipeline, leaving a duplicate filter that could no longer be updated or removed, and an effect coming back after being removed when it had been re-added under the same name.
2026.8.14¶
- [Video Capture SDK .Net] / [Media Player SDK .Net] Fixed a GStreamer error when removing a video effect (grayscale, balance, and the other live filters) from a paused capture or player pipeline.
- [Video Capture SDK .Net] / [Media Player SDK .Net] Fixed video stopping after removing an image overlay, overlay manager, pan/zoom, or LUT effect at runtime.
- [Media Player SDK .Net] Fixed audio going silent after removing an audio effect during file playback.
- [Media Player SDK .Net] / [Media Blocks SDK .Net] Fixed a hang when removing pitch, compressor, loudnorm, or similar multi-element audio effects from a live pipeline.
- [Media Blocks SDK .Net] Fixed a crash when disposing an
AudioEffectsBlockthat still had effects in the public list. - [Video Capture SDK .Net] / [Media Blocks SDK .Net] Fixed MP4 recordings that could not be played back after stopping a paused capture (
VideoCaptureCoreX/MediaBlocksPipeline). Start → Pause → Stop (without Resume) left a non-zero file with nomoovindex. Stopping a paused capture now finalizes the file. - [Media Blocks SDK .Net] RTSP sources can send their own GET_PARAMETER keep-alive. Set
RTSPSourceSettings.ForceCustomKeepAlive(or the same flag onRTSPRAWSourceSettings) to replace the default RTSP keep-alive with a GET_PARAMETER every 30 seconds. Off by default — use it if a camera drops the session under the built-in keep-alive. -
[Demos] The RTSP Preview demos now have a transport selector (Auto / TCP / UDP) and a Force custom keep-alive checkbox, so a camera that works in VLC but dies after a minute can be tried the same way without rebuilding.
-
[Media Blocks SDK .Net] Fixed the first line of an
OverlayManagerText(andOverlayManagerDateTime) disappearing whenYwas 0 or close to the top of the frame.XandYare the top-left corner of the text in pixels;(0, 0)is a valid position and the first line of a multiline string is fully visible there. Previously the coordinates were treated as the Cairo baseline, so a block placed at the origin had its first line clipped off the top of the picture. - [Media Player SDK .Net]
MediaPlayerCoreXnow has the same overlay manager as capture. SetVideo_Overlay_EnabledbeforeOpenAsync/PlayAsyncand useVideo_Overlay_AddwithOverlayManagerText(includingTextProvider). The overlay is drawn on the preview only — after the sample grabber and after any custom video outputs — so the file on disk, snapshots and exports are not modified. Overlays added once stay acrossStopand opening another file.
2026.8.13¶
- [Media Blocks SDK .Net]
OverlayManagerTextcan now build its text for every frame through the newTextProvidercallback. SetTextProviderto aFunc<TimeSpan, string>and it is asked for the text once per frame, receiving the frame timestamp counted from the pipeline start; returningnullfalls back toText. This is the supported way to overlay a live readout — sensor values, a clock, a frame counter, or a template mixing all three — without removing and re-adding the overlay or touching the pipeline. AssigningTextdirectly still works and is equally cheap: the text layout is cached on the element and re-measured only when the string, font or geometry actually changes, so an unchanged value costs nothing. The callback runs on the streaming thread while the overlay list is locked, so it must be short and must not block — calling back into a UI dispatcher from it can deadlock rather than merely drop a frame. A callback that throws is reported once throughOnErrorand is then not called again: the element falls back toTextfor the rest of the run, because retrying it would unwind an exception at the frame rate under that lock. AssignTextProvideragain to re-enable it — worth knowing if your callback can throw on its first frame, while the values it reads are still being initialised.OverlayManagerDateTimeinherits the property and substitutes its[DATETIME]token into whatever the callback returned. - [Media Blocks SDK .Net] Overlay elements are now up to twice as fast on multi-core machines. Cairo-based overlays render through
cairooverlay, which only accepts BGRx/BGRA/RGB16, so a YUV source pays for two full-frame colour conversions per frame — and those conversions were running single-threaded, which was not enough to sustain 1080p50 on many machines. The recording branch was the first to suffer, because a preview renderer silently drops late frames while an encoder writes whatever reaches it, so the preview looked fine and the recorded file did not. Measured on a 14-core machine at 1920x1080 NV12: 361 to 815 frames per second throughOverlayManagerBlock. AffectsOverlayManagerBlock,ImageOverlayCairoBlock,PanZoomBlock, the mouse-highlight overlay and the Android text overlay. - [Media Blocks SDK .Net] Fixed
StartTimeandEndTimeon overlay elements being ignored unless both were set. The visibility window was only applied when neither value wasTimeSpan.Zero, so the common case of "show this for the first ten seconds" — a zeroStartTimewith a realEndTime— left the element on screen for the whole session. Either bound now defines a window on its own, and anEndTimeofTimeSpan.Zeromeans the element has no end. The break is symmetric, so check both directions: an element with onlyEndTimeset used to stay visible for the whole session and now disappears at that moment, and an element with onlyStartTimeset used to be drawn from the first frame and is now hidden until that moment. If you set either value and relied on it being ignored, clear it. Frames that carry no timestamp at all — anappsrcfeeding unstamped buffers, for instance — are outside any window that can be judged, and every element is drawn on them. - [Media Blocks SDK .Net] RTCP is now on by default for RTSP sources.
RTSPSourceSettings.DoRTCPandRTSPRAWSourceSettings.DoRTCPdefaulted tofalse, and the value is always written to the underlying RTSP source — so no VisioForge application ever sent RTCP receiver reports unless it set the property itself. Many cameras and RTSP servers use those reports to tell that the client is still watching and tear the session down without them: the picture freezes on the last decoded frame and the stream ends a session timeout later, with nothing in between to explain it. The same omission also madeNTPSyncineffective, because the NTP mapping arrives in RTCP sender reports. Both properties now default totrue, which is also the default of the underlying GStreamer element. SetDoRTCP = falseexplicitly if you talk to an old server that cannot handle RTCP. - [Demos] Fixed the RTSP Preview demos building a second pipeline when Start was clicked twice. Connecting to a camera takes a few seconds, and nothing appears on screen while it happens, so a second click was easy to make — it created a second pipeline over the same
VideoViewand opened a second session to the same camera. The two fought over the preview window, one of them failed with "Failed to open window", and on a camera that serves a single session its teardown stopped the stream for the surviving pipeline too, leaving a frozen picture. The Start button is now disabled while a start is in progress, a pipeline abandoned by a failed start is released instead of leaking, and the demos now report the stream ending — including a camera dropping the session — in their log instead of leaving a still frame with no explanation. - [Media Blocks SDK .Net] A user-defined overlay element can now be drawn through the new
IOverlayManagerDrawableinterface.Video_Overlay_Addaccepts anyIOverlayManagerElement, but only the built-in element types were rendered, so a custom type was silently never drawn. An element that implementsIOverlayManagerDrawable.Drawnow receives the live Cairo context of the frame exactly likeOverlayManagerCallbackdoes. A custom type that implements neither the interface nor a built-in type is still not drawn, but is now reported once throughOnErrornaming the type instead of failing silently.
2026.8.7¶
- [Core] The BCL cryptography packages now match the framework you target instead of always being the .NET 10 line.
System.Security.Cryptography.Pkcs,System.Security.Cryptography.XmlandSystem.Formats.Asn1were pinned at 10.0.10 for every target framework, so a .NET 6, 7, 8 or 9 application referencing a VisioForge package was pulled onto the 10.0.x line whether or not it wanted to be there — and an application holding the 8.0.x servicing line got a version conflict it could not resolve, because our own assemblies were compiled againstSystem.Security.Cryptography.Pkcs, Version=10.0.0.0. A .NET 6, 7 or 8 application now resolves the 8.0.x line and .NET 9 the 9.0.x line; .NET 10, .NET Framework 4.7.2/4.8 and .NET Standard are unchanged at 10.0.10. .NET Framework 4.6.1, .NET Core 3.1 and .NET 5 move down to the 6.0.x line — that is the only line these three are supported on, and it is what gives them a realnet461/netcoreapp3.1build instead of anetstandardfallback, but 6.0.x is out of support and did not receive the 2026System.Security.Cryptography.Xmlfixes. If you target one of those three frameworks and that matters to you, add an explicitPackageReferencetoSystem.Security.Cryptography.Xml 10.0.10in your own project — expect a build warning with it, because 10.0.x states it does not support those frameworks and falls back to itsnetstandard2.0build. That warning is exactly the reason the SDK itself does not take 10.0.x there. Every other rung sits at a patched version (8.0.4, 9.0.19, 10.0.10), because those advisories are fixed in each branch separately. On .NET 6 and .NET 7 this also replaces anetstandard2.0fallback with the real framework build. - [Core]
System.Text.Encoding.CodePagesnow matches the framework you target as well — 6.0.1 on .NET Framework 4.6.1, .NET Core 3.1 and .NET 5, 8.0.0 on .NET 6 and .NET 7, and 10.0.6 unchanged on .NET 8 and newer, on .NET Framework 4.7.2/4.8 and on .NET Standard. Those older frameworks were previously handed the 10.0.6 package, which states it does not support them and gave them anetstandard2.0build; they now get one made for the framework they run on. This package carries no security advisory at any version. - [Core] Fixed
VisioForge.DotNet.Corenot declaring its dependency onSystem.Security.Cryptography.Pkcs. The package has needed it since 2026.2.19 — the licensing code verifies Authenticode signatures — but it was declared only from 2026.4.21 onwards, and only as a side effect of how the dependency graph happened to be built. If you are on a version between 2026.2.19 and 2026.4.18, the shipped assembly requiresSystem.Security.Cryptography.Pkcs 10.0.0.0with nothing in the package asking for it; add the package reference yourself or move to a current release. - [Demos] Fixed the Unity package's sample scenes logging three "The referenced script (Unknown) on this Behaviour is missing!" errors each in any project that does not use the Universal Render Pipeline and the Input System. The scenes were authored from a URP 2D template and carried a
Light2D, aUniversalAdditionalCameraDataand anInputSystemUIInputModulethat none of the samples use — the video is rendered into a uGUIRawImage, which needs no render pipeline and no input module. They now open cleanly on Built-in, URP and HDRP alike. - [Demos] Fixed the Unity RTSP and IP-camera samples printing a "Frame stall" warning the moment a stream starts, on the first connect and on every reconnect after it. The watchdog compared its timeout against the time since the last decoded frame, which is infinite before the first frame ever arrives and, after a drop, still points at the last frame of the previous session — so it fired seconds before the camera could deliver anything. The reported stall is now capped at the age of the current stream, and a camera that genuinely never delivers is still reported after the same timeout.
- [Core] Fixed the Avalonia
VideoViewreporting a black background even when one was set.GetBackgroundColor()only read immutable solid-color brushes, so the mutableSolidColorBrushthe control installs itself — and any colour a user assigns — always fell back to black, and that wrong colour fed the renderer as its clear colour. It now reads any solid-color brush, mutable or immutable.
2026.8.6¶
- [Core] Fixed video editing and video preview breaking on macOS.
VideoEditCoreXfailed every render that had a video track — any container, any codec — withInternal data stream error, while audio-only output still worked; andVideoRendererBlockfroze the pipeline on the first frame in any application without a Cocoa UI running on its main thread, such as a console tool, a background service or a test host. GStreamer picks several elements automatically by rank rather than by name, and the Metal elements' ranks put them ahead of the software ones, so they were selected in places they were never meant for — including as the mixer inside every video-editing timeline. They are now registered for explicit use only, and the Metal video renderer is used only when you give it a view to draw into.MetalVideoCompositor,MetalConvertScale,MetalVideoRendererSettingsand the other Metal wrappers are unaffected and still give you GPU rendering when you ask for it. - [Core] Fixed
VideoRendererBlock(pipeline, windowHandle)ignoring the window handle on Windows and macOS — only the Android and iOS paths read it, so elsewhere the renderer behaved as though no target window had been given and opened one of its own. On macOS this constructor now also defaults to the Metal renderer, which is the only one there that can draw into a handle you supply. Two consequences, both documented on the constructor: the handle must be anNSView*(not anNSWindow*), and your main thread must keep running a Cocoa run loop while the pipeline plays, because the Metal renderer attaches to the view on the main queue.
2026.8.5¶
- [Core] The SDK no longer brings a pre-release package into your dependency graph. SkiaSharp moves from
3.119.4-preview.1.1to the stable3.119.4, and Avalonia from 12.0.3 to 12.0.5 — the two had to move together, because Avalonia itself switched to the stable SkiaSharp in 12.0.4 and holding it back would have kept a preview build of the WebAssembly native assets in the graph. Restoring a VisioForge package used to pull those preview builds transitively, with no opt-in on your side and no warning: they simply appeared in your lock file and indotnet list package --include-transitive. That matters if you mirror packages into an internal feed that rejects pre-release versions, or if a policy scan flags them. Everything the SDK resolves is now a stable release. The SkiaSharp difference itself is confined to bundled native libraries (libexpat 2.7.5, libpng 1.6.58) — no API changed. - [Core] The Avalonia package no longer brings a nightly build of DialogHost.Avalonia with it.
VisioForge.DotNet.Core.UI.Avaloniauses MessageBox.Avalonia forShowMessageEx, and MessageBox.Avalonia 12.0.0 — still its newest release — depends onDialogHost.Avalonia 0.12.1-nightly.0.1, so that nightly landed in the dependency graph of every application referencing our Avalonia package. DialogHost is now pinned to the stable 0.12.3. No API or behaviour change on our side. - [Core]
VisioForge.DotNet.Core.AI.Whispernow requires .NET 8 or newer. Seven builds are gone from the package —net5.0,net5.0-windows,net6.0,net6.0-windows,net7.0,net7.0-windowsandnet7.0-windows10.0.19041.0— so a WinUI or WPF head on one of those is affected as much as a plain console project.net8.0,net9.0,net10.0and their Windows, Android, iOS, macOS and Mac Catalyst variants are unchanged. Speech-to-text runs on Whisper.net, which now depends onMicrosoft.Extensions.AI.Abstractionsand through it onSystem.Text.Json10, andSystem.Text.Json10 states that it does not support and has not been tested on anything below .NET 8 — so those seven builds could only have shipped in a configuration Microsoft declares untested. .NET 5, 6 and 7 are themselves all out of support. If you reference this package from any .NET 5, 6 or 7 project, retarget it tonet8.0or later — keeping the same platform suffix if it has one; no code changes are needed. Only this package is affected — every other VisioForge package keeps its full framework list, down to .NET Framework 4.6.1. - [Core] The macOS native package now ships the SRT and WebRTC GStreamer plugins. Six plugins —
libgstsrt.dylib,libgstsrtp.dylib,libgstwebrtc.dylib,libgstrswebrtc.dylib,libgstwebrtcdsp.dylibandlibgstwebrtchttp.dylib— and the three libraries they load against (libgstwebrtc-1.0.0.dylib,libgstwebrtcnice-1.0.0.dylib,libsrt.1.5.3.dylib) were built and kept current but never packaged, so on macOS any pipeline using SRT or WebRTC failed to find its element, while identical code worked on Mac Catalyst, whose package has carried them all along.VisioForge.CrossPlatform.Core.macOS.Addsnow ships the same 58 files as its Mac Catalyst counterpart.
2026.8.1¶
- [Demos] Fixed several shipped samples referencing outdated packages. The macOS and Mac Catalyst native packages in the demo projects were six months behind the published versions, a
net472demo pinned aSystem.Resources.Extensionsbuild meant for .NET 8 and newer, and the Virtual Camera and WebM redistributables were pinned to 2023-era releases. If you copied a demo project as a starting point, its package references were older than the SDK you installed. - [Core] Security: updated
System.Security.Cryptography.Xmlto 10.0.10, closing five advisories that affected the version shipped before it — CVE-2026-47304, a bypass of XML encryption protections rated 8.1, and four denial-of-service issues rated 7.5.System.Security.Cryptography.PkcsandSystem.Formats.Asn1moved to 10.0.10 with it. The SDK does not call these APIs itself; they are reached through WCF, which ONVIF device communication uses. No action is needed on your side beyond taking the new package — but a security scan run against the previous release will have flagged it. - [Core] Fixed a random process crash while GStreamer objects were being released. On any platform, an application could die with an access violation (
0xC0000005on Windows,SIGSEGVon macOS) on a background thread, with no error, no exception and nothing in the log to connect it to what the application had been doing — the crash landed long after the code that caused it. The SDK now checks that a native object is still alive before releasing it, and when it is not, writes one line naming the type instead of taking the process down. - [Core] API change:
VisioForge.GStreamer.API.CustomAPI.g_signal_connect,g_signal_connect_dataandg_signal_handler_disconnectnow useUIntPtrfor the GLib signal handler id instead ofuint. The id is agulong, which is 64-bit on macOS, Linux, iOS and Android, so the previous declaration truncated it. These are low-level interop helpers; if you call them directly, change the variable holding the handler id toUIntPtr. - [Media Blocks SDK .Net] The SDK no longer takes ownership of the elements a decoder builds while playing a file. Playing any file made the SDK hold a native reference to every element inside
uridecodebin— parsers, demuxers, queues, several hundred per playback — and those references were given back only later, on a background thread, so the elements stayed alive past the pipeline that owned them. This is the same ownership mistake behind the render-time crash fixed below, on the playback path; measured on a four-class test run, the number of such references dropped by 78%. Affects every engine that plays or captures through a file or URL source. - [Core] Fixed an error or warning on the pipeline bus tearing down the bus handler. In
VideoEditCoreXandSimplePlayerCoreX, an error message that carried no source element raised aNullReferenceExceptioninside the handler, so that message and every message after it was lost — including the error you needed to see. A state-change message with no source could also be mistaken for one from the pipeline itself while the pipeline was being torn down. - [Video Edit SDK .Net] Fixed a process crash after rendering with
VideoEditCoreX. An application that rendered several timelines in one session could die with an access violation on a background thread, typically long after the render had finished and the objects involved had been released. Rendering to WMV made it most likely, but the underlying cause affected any render. Applications that create and destroyVideoEditCoreXrepeatedly — batch converters, render services — were the most exposed. - [Core] Fixed
Debug_Modewriting an empty log file. With debug logging enabled, the log was buffered and never flushed when the engine was disposed, so a short session produced an empty file and a longer one lost everything after the last automatic flush — exactly the log you are asked for when reporting a problem. The file also stayed locked for the life of the process, so it could not be read or deleted. AffectsVideoCaptureCoreX,MediaPlayerCoreX,SimplePlayerCoreX,VideoEditCoreXandMediaBlocksPipeline. - [Core] Fixed the same empty log file when the engine was disposed with
await using. The fix above covered the synchronousDispose()only, soMediaPlayerCoreXandSimplePlayerCoreXreleased asynchronously — the form most applications use — still produced an empty or truncated log and still held the file open.SimplePlayerCoreX.DisposeAsyncis also safe to call twice now, and on all three engines a failure during teardown no longer swallows the log, which is precisely the case you need it for. - [Media Blocks SDK .Net] Fixed open-vocabulary detection exhausting memory on Apple hardware.
OpenVocabularyDetectorBlockandObjectAnalyticsBlockwith an open-vocabulary detector could consume every gigabyte the machine had and bring it down rather than produce a detection. ONNX Runtime cannot map OWLv2 or Grounding DINO onto CoreML in one piece — it splits them into 126 and 255 separately compiled models — soProvider = Autonow selects the CPU for these two model families on Apple hardware and leaves every other AI block unchanged. SettingProvidertoCoreMLby name still does what you ask; it is not recommended for these models. On the CPU provider the memory retained after a detector is disposed also drops by about 2.4 GB on the same models, with no change to inference time. - [Media Blocks SDK .Net] Fixed a crash while tearing down
ObjectAnalyticsBlockwith an open-vocabulary detector. Disposing the block while a frame was still being analysed could free the inference session underneath the analysis and abort the process. - [Core] Fixed Media Foundation H.264 and H.265 encoder settings being silently ignored. On a machine whose Media Foundation encoder does not advertise a given control - the property set differs by GPU, driver and machine - the SDK wrote the value anyway. Nothing threw, the call reported success, and the encoder quietly kept its default, so the same code produced different output on different machines with no way to tell. Settings the encoder cannot accept are now skipped, and each one is named in a warning. This covers encoders you build yourself (
HEVCEncoderBlock,H264EncoderBlock,CreateBlock()) and the AMD MA35D encoders and decoders. Encoding profiles -MP4Outputand the other render outputs - are not covered yet, so the original symptom can still occur there. - [Core] Fixed an instability while enumerating Decklink capture cards and outputs. Plugging a card in or out, or listing devices from more than one place at once, could leave the SDK using a device object it had already released — harmless in the log on a good day, a crash on a bad one.
- [Core] Fixed WASAPI2 audio capture breaking up under load and never recovering. From 2026.3.7, audio captured through a WASAPI2 device could develop artifacts that got worse over time and only cleared when the pipeline was restarted; the log filled with
Found N frames gapwarnings. The bundled GStreamer runtime was requesting a capture buffer of roughly 20 ms instead of the 200 ms it used to, so any brief stall lost audio at the driver. The buffer is back to its previous size on capture and playback alike, and theLowLatencysetting again means what it says. Affects Windows x86, x64 and ARM64. - [Core] Added
BufferTimeandLatencyTimetoWASAPI2AudioCaptureDeviceSourceSettings,WASAPIAudioCaptureDeviceSourceSettings,LoopbackAudioCaptureDeviceSourceSettings,WASAPIRendererSettingsandWASAPI2RendererSettings. They control how much audio the device buffers — raiseBufferTimeon machines that see brief CPU spikes, lower it when you need latency. Defaults are 200 ms and 10 ms, matching previous behaviour; set either toTimeSpan.Zeroto leave the underlying element untouched. - [Core] An audio renderer whose output plugin is missing from the deployment now reports a clear error instead of throwing a
NullReferenceExceptionout ofStartAsync. - [Core] Fixed the built-in HLS/DASH HTTP server never starting on Windows unless the application ran as administrator. With
Custom_HTTP_Server_Enabledset, the sink reported no error and the pipeline ran, but nothing was ever served — the server bindshttp://*:<port>/, which Windows refuses to a process without an elevated token unless a URL reservation exists, and the failure went no further than one line in the log. The server now falls back to the loopback prefixes — bothhttp://localhost:<port>/andhttp://127.0.0.1:<port>/, so a player on the same machine works whichever of the two it is given — and the log names thenetsh http add urlaclcommand to run once as administrator to reach the server from other devices. Elevated applications and machines that already have the reservation are unaffected, as are macOS and Linux. - [Core] Fixed an application that never exits after
DestroySDK(). The SDK runs the GStreamer main loop on a foreground thread, andDestroySDK()could return having failed to stop it: the request to stop was dropped whenever it arrived in the moment between that thread being created and it reaching the loop, and nothing checked afterwards. The process then stayed alive with no window, no error and nothing running — visible as an application that closes but keeps a process in the task list, or a console tool that never returns to the prompt.DestroySDK()now waits for the loop thread to actually finish before returning, and reports it in the log if it does not. - [Core] Fixed the WASAPI2 audio renderer going silent whenever
Volumewas below 1.0. The value was passed to the renderer as a whole number, so anything between 0.0 and 1.0 was rounded down to zero — settingVolume = 0.5produced silence rather than half volume. OnlyVolume = 1.0behaved as expected.
2026.7.27¶
- [Media Blocks SDK .Net] Fixed a stopped pipeline not resuming when it was started again — after
StopAsync(), aStartAsync()on the sameMediaBlocksPipelinewith the same blocks returnedtrueand then did nothing: a recorder wrote no bytes, a preview stayed black, and no error was reported. Stopping now keeps the blocks and the connections you made, and starting rebuilds the pipeline from them, so the same pipeline instance can be recorded, stopped and recorded again. You no longer have to recreate the pipeline and every block between runs (doing so still works). A sink filename changed between runs —SetFilenameOrURL— is picked up by the next run. - [Media Blocks SDK .Net] Fixed a group of blocks that stayed silent after a pipeline was restarted, each in the same way: the block reported a successful start and then produced nothing. OCR (
OcrBlock) and Data Matrix (DataMatrixDecoderBlock) stopped raising their detection events;UniversalDemuxBlock,UniversalAutoDemuxerBlockandUniversalDecoderBlockdelivered no data on the second run (the demuxer could also throw from a streaming thread);StreamSourceBlockcame up over a closed stream, and now also rewinds a seekable one so a restarted source plays from the beginning;PreEventRecordingBlockdropped every frame and then threw fromTriggerRecording(); both squeezeback blocks failed to rebuild. The bridge blocks silently lost theOnEOShandler you had attached at the first stop. - [Media Blocks SDK .Net]
MediaBlocksPipeline.ClearBlocks()now disposes the blocks it removes. Removing a block hands it back to nobody, and the stop path no longer disposes it, so keeping it alive leaked whatever it held — an inference session, an encoder, a device handle. Do not callClearBlocks()for blocks you mean to reuse; a stopped pipeline can simply be started again with the same blocks. - [Media Blocks SDK .Net] A stop no longer closes a file opened by
StreamSourceBlock(filename)for good: the file is released on every stop, as before, and reopened when the pipeline is started again. Stopping and then deleting, overwriting or re-recording to the same path keeps working. A stream you passed in yourself is still never closed by the block — it is yours. - [Media Blocks SDK .Net] Fixed a crash on Android when the video surface was recreated after the pipeline was stopped — rotating the device or returning from the background after
StopAsync()dereferenced the pipeline the stop had already released. - [Media Blocks SDK .Net] Fixed an intermittent crash while a pipeline was being stopped or restarted. Under a restart-heavy load the process aborted outright about one run in three, with no exception to catch — a bus message could still be in the middle of being handled when the stop released the pipeline underneath it. Stopping now waits for an in-flight bus message to finish before releasing anything, and gives up after two seconds rather than hanging.
- [Media Blocks SDK .Net] Fixed a family of latent memory-corruption defects around teardown and restart, in sample grabbers, renderers, sources, decoders, bridge blocks, effects and device enumeration. Nothing failed visibly: GStreamer's own type checks turned the affected calls into no-ops, so the symptom was warnings in the log rather than a crash — but the same code was one timing change away from a hard
AccessViolationException. Restarting a pipeline produces far fewerGST_IS_ELEMENT/GST_IS_PADwarnings; the remaining ones are being worked through. - [Media Blocks SDK .Net] Fixed removing a video or audio effect at runtime leaving the pipeline holding a released element. Every effect filter — 51 of the video ones and 15 of the audio ones — released its GStreamer element while still pointing its own input and output at it, so removing an effect, or clearing them all, worked on the surface while the next teardown reached through a dangling reference. As with the teardown defects above, GStreamer's type checks kept it to log warnings instead of a crash, but the memory was already gone.
- [Media Blocks SDK .Net] Fixed
UniversalTransformBlockreleasing its own pads on the first frame. The transform callback released the pads the block had published, so every later probe, unlink and teardown on that block used a dead reference.CustomMediaBlockdid the same to the pads its wrapped element owns, including the pad handed to it when a demuxer creates one. - [Core] Fixed a reference-counting error that corrupted GStreamer's encoder registry on Windows. Enumerating the available hardware encoders released a reference the SDK never held, on every encoder registered on the machine — audio ones included. GStreamer detected it, logged a warning per encoder and recovered, so nothing failed visibly, but the accounting was left inconsistent and a concurrent registry change could have turned that into a crash.
- [Media Blocks SDK .Net] Fixed Vorbis audio bitrate settings being ignored.
VorbisEncoderSettings.Bitrate,MaxBitrateandMinBitrateare documented as "-1 to disable", which is also their default, and that default was passed to the encoder as an out-of-range value. The encoder rejected the whole assignment and fell back to its own defaults, so a bitrate you set took effect only if you had also set the other two. Encoding profiles built from these settings carried the same invalid value. - [Media Blocks SDK .Net] Fixed the pipeline-graph debug helpers misbehaving once playback had finished.
Debug_GetPipeline()andDebug_SavePipeline()called after a stop — including the stop that happens on its own when a file reaches the end — wrote no graph and logged a GStreamer warning instead.Debug_GetPipeline()now returns an empty string, as documented, andDebug_SavePipeline()does nothing. The same applies toVideoCaptureCoreX.Debug_SavePipeline(). - [Video Capture SDK .Net] Fixed
Video_Source_GetResolutionAndFrameRateandAudio_Source_GetInfodamaging a running capture. Both released the source block's own pad, so calling either of these read-only queries while capturing left the source unusable. - [Video Capture SDK .Net] Fixed the second recording of a separate-capture output silently producing no file. With an output registered and the engine running,
StartCaptureAsync(index, filename)worked the first time and every later call returnedtruewhile writing nothing — the record button worked exactly once per application run. All subsequent recordings now write to the file passed toStartCaptureAsync, with the preview left untouched, which is what the API is for.
2026.7.26¶
- [Media Blocks SDK .Net] Added
AndroidUVCSourceBlock— capture from a USB (UVC) camera connected to an Android device over OTG, such as a webcam or a capture dongle. These cameras are invisible to the regularSystemVideoSourceBlock, because Android only exposes them through Camera2 on devices whose vendor ships the External Camera HAL (Samsung, among others, does not). Connected cameras are listed withAndroidUVCDevices.FindCameras(), access is requested withAndroidUVCDevices.RequestPermissionAsync(), and the requested resolution and frame rate are matched against the modes the camera advertises. Your app must declare and be grantedandroid.permission.CAMERA— Android refuses to hand a USB video device to an app without it, even though the Android camera API is not used. Unplugging the camera ends the stream, so the pipeline reports end-of-stream rather than stalling silently. Requires Android 9 (API 28) or later. Note that a camera enumerating at USB 2.0 speed offers markedly lower frame rates than on a desktop: a Logitech BRIO, for example, tops out at 1080p30 (MJPEG) with no 4K modes available at all. - [Video Capture SDK .Net] USB (UVC) cameras on Android can now be used with
VideoCaptureCoreX— assign anAndroidUVCSourceSettingstoVideo_Sourceand the camera works like any other source, so recording to MP4, network streaming, video effects and snapshots are all available. NewAndroidUVCDevices.GetModes()lists the resolutions, frame rates and formats you can actually pick from — formats the SDK cannot stream are left out — so you can offer the real choices instead of requesting a mode and silently getting the nearest one, andAndroidUVCSourceSettings.Formatasks for one of them. Two things to know: an unplugged camera is reported throughOnError, notOnStop- and only once the stream has been silent for a few seconds, so handle Android'sACTION_USB_DEVICE_DETACHEDbroadcast as well if your app needs to react the moment the cable comes out; and a camera with a built-in microphone also registers as a USB audio input that Android prefers for recording but that cannot be captured while the camera is streaming, so such a recording is video-only. Live capture should also set the newVideoCaptureCoreX.Video_Output_IsSync = false, which stops the bridge feeding an output pipeline from waiting on the clock - left synced it can fill its queue and stall the preview along with it.Audio_Output_IsSyncis the matching switch for the audio branch, so a capture with audio can hand both branches over on the same terms. - [Demos] Added a USB Camera Android sample showing live preview from a UVC camera attached over OTG, including the device and permission handling, in both a Media Blocks SDK and a Video Capture SDK version — the latter also records to MP4.
2026.7.24¶
- [Video Capture SDK .Net] Fixed Picture-in-Picture crashing on .NET 9 and .NET 10 —
VideoCaptureCoreterminated with an unrecoverableExecutionEngineExceptionatStart/StartAsyncas soon as a PiP source was added (the same code worked on .NET 8). Adding a PiP overlay now works on all supported .NET versions. - [Video Edit SDK .Net] Fixed the legacy FFMPEG output crashing at start on .NET 9 and .NET 10 with the same
ExecutionEngineException; it now works as it did on .NET 8. - [Media Blocks SDK .Net] [Video Capture SDK .Net] Fixed video missing or corrupted when streaming MPEG-TS over SRT (
SRTMPEGTSSinkBlock,SRTOutput). The MPEG-TS muxer now emits a full 1316-byte payload per buffer instead of one transport packet at a time, so SRT sends whole datagrams rather than seven times as many undersized ones. Receivers such as MediaMTX, ffmpeg or OBS no longer see an audio-only or truncated stream. The UDP, multi-UDP and RIST MPEG-TS outputs get the same alignment. - [Media Blocks SDK .Net] [Video Capture SDK .Net] Fixed corrupted video from the Apple (iOS / macOS / Mac Catalyst) H.264 hardware encoder.
AppleMediaH264EncoderSettings.AllowFrameReorderingwas enabled by default; the resulting B-frames left a large share of the encoded frames with a presentation timestamp earlier than their own decode timestamp, so MPEG-TS outputs (SRT, UDP, RIST) and MP4/MOV recordings played back torn or undecodable in MediaMTX, ffmpeg and VLC. RTMP/FLV happened to tolerate it, which is why streaming from iOS looked broken over SRT but fine over RTMP. The property now defaults tofalse; set it back totrueonly for offline encoding where you can verify the resulting timestamps. - [Media Blocks SDK .Net] [Video Capture SDK .Net] Fixed SRT and RIST output failing to start on macOS and Mac Catalyst when the Apple hardware H.264 encoder was used: the stream parser those outputs need to feed the MPEG-TS muxer was omitted on those platforms.
- [Media Blocks SDK .Net] [Video Capture SDK .Net] [Video Edit SDK .Net] Fixed MPEG-TS output producing an empty file when AAC audio was encoded with a software encoder (
voaacenc, used on macOS, Linux and iOS). The MPEG-TS muxer only accepts framed AAC, which those encoders do not advertise, so the audio never linked and the muxer waited on it instead of writing - the recording ended as a 0-byte.ts. AffectsMPEGTSSinkBlock/MPEGTSOutputand the SRT, UDP and RIST outputs built on them. - [Media Blocks SDK .Net] Fixed RTSP playback failing with "Failed to link RTSP pad: WasLinked" in
UniversalSourceBlockV2. When the source announced a pad it had already handed over - on reconnect, or when a server re-announced a stream - the block tried to link it a second time and reported the result as an error, ending the session. - [Media Blocks SDK .Net] Fixed DASH output never starting (
DASHSinkBlock): the sink requested its input pads without a name, whichdashsinkrejects because it takes the stream index from the pad name. No manifest or segments were written and the pipeline hung on start instead of reporting the failure. - [Media Blocks SDK .Net] Fixed text overlays rendering as empty boxes (▯▯▯) on iOS, Android and macOS — the SDK now sets up font resolution at startup, so
TextOverlayBlock, subtitle overlays and the trial watermark draw real glyphs instead of tofu. Fonts your app bundles are picked up automatically, and on iOS the SDK carries a fallback font so text renders even in an app that bundles none.
2026.7.22¶
- [Video Capture SDK .Net] Fixed RTSP / IP camera login and password being URL-encoded, which broke authentication for credentials containing special characters such as
&,@,%,?or spaces (e.g. a passwordpassword&@%!?Endwas sent to the camera aspassword%26%40%25!%3fEnd). Credentials are now used verbatim. Applies to both theRTSPSourceSettings(X engine) andIPCameraSourceSettings(VideoCaptureCore) sources. If you previously worked around this by storing the pre-encoded value on the device, revert it to the real password after upgrading. - [Core] MAUI apps now build cleanly for Android 16: the bundled HarfBuzzSharp native library is updated to a 16 KB page-size-aligned build, removing the
XA0141("Android 16 will require 16 KB page sizes") warning on Android app builds.
2026.7.21¶
- [Media Blocks SDK .Net] Added AMD Alveo MA35D hardware acceleration (via the AMD AMA Video SDK) on Linux: H.264, HEVC and AV1 encoders (
AMAH264EncoderSettings/AMAHEVCEncoderSettings/AMAAV1EncoderSettings), matching decoders, and anAMAScalerBlock. A specific MA35D card is selected with theDeviceproperty (-1auto-selects), so you can pin encoding/decoding to the accelerator rather than the host GPU. Requires the AMD AMA Video SDK (kernel driver + GStreamer plugins) to be installed.
2026.7.10¶
- [Media Blocks SDK .Net] Added
AudioEventDetectorBlock— on-device audio event detection that recognizes real-world sounds (siren, dog bark, glass break, alarm, music, speech, and hundreds more from the 521-class AudioSet ontology) in live or file audio using a YAMNet ONNX classifier. Audio passes through unchanged; detections are raised viaOnAudioEventwith a label, confidence, and start/end time, using score smoothing and hysteresis so one continuous sound is a single event rather than a burst of duplicates. Optional class allowlist and a live top-K scores event. Works inVideoCaptureCoreX/MediaPlayerCoreXviaAudio_Processing_AddBlock. - [Demos] Added an Audio Event Detection WPF sample (Media Blocks SDK): open a file or select a microphone, live event log with label/confidence/time, class-filter box, and threshold slider.
2026.7.9¶
- [Core] Video stream info now reports the pixel aspect ratio (
VideoStreamInfo.ParNumerator/ParDenominator) when the negotiated caps carry it, so anamorphic sources can be displayed at the correct proportions. - [Media Blocks SDK .Net] Fixed pipeline restart after a failed start: blocks no longer report themselves as built when their Build fails, so a retried start rebuilds them instead of running a half-built pipeline.
- [Media Blocks SDK .Net] File output blocks (M4A/MP4/MKV/AVI) now fail cleanly instead of throwing an unhandled exception when configured with an unsupported encoder, so the pipeline reports a normal start error you can handle.
- [Core] Fixed stale frame dimensions after a mid-stream resolution change in video frame grabbing: frame callbacks and snapshots kept reporting the old width/height/stride, so the frame data could be mis-read at the new size.
- [Media Blocks SDK .Net] Added AI auto-reframe (
AutoReframeBlock): converts landscape footage into vertical 9:16 (or 1:1, 4:5) video that dynamically crops around the detected subject with smooth, jitter-free tracking — ideal for Shorts/Reels/TikTok. - [Demos] Added an Auto Reframe WPF sample (Media Blocks SDK): open a landscape file, follow the subject in a side-by-side original/reframed preview (9:16, 1:1, or 4:5), configure smoothing, dead zone, detection interval, and the followed class, and optionally export the reframed output to MP4.
- [Media Blocks SDK .Net] Added on-device speaker diarization ("who spoke when"): the new
SpeakerDiarizationBlockanalyses the audio as it plays and, once the recording has finished, reports every speech turn with the speaker who made it. Diarization is inherently offline — a voice heard at minute 1 can only be matched to the same voice at minute 40 once the whole recording has been heard — so the turns are raised at end-of-stream (OnSpeakerSegment, orGetTimeline()in one piece); checkIsTimelineCompletebefore reading them. Pair it with speech-to-text viaDiarizedTranscriptBuilderfor a speaker-labeled transcript. Works withMediaPlayerCoreX/VideoCaptureCoreXand manual Media Blocks pipelines. SetNumSpeakerswhen you know the count, or leave it at-1and tuneClusterThreshold(a cosine distance — smaller yields more speakers). - [Media Blocks SDK .Net] Speaker diarization is multilingual: alongside the default English WeSpeaker voiceprint model you can select the Apache-2.0 3D-Speaker ERes2NetV2 embedding (
SpeakerDiarizationSettings.EmbeddingModel = ERes2NetV2Multilingual) for far better speaker separation on non-English or mixed-language audio. The feature front-end adapts to the chosen model automatically, so no other code changes are needed when you switch. - [Media Blocks SDK .Net] Fixed degraded speech-to-text accuracy on any source that is not already 16 kHz mono — that is, on essentially every camera, capture card, media file and RTSP stream. The audio front-end decimated to the 16 kHz the model needs without band-limiting first, so everything above 8 kHz folded back into the speech band and corrupted the features both Whisper and the voice-activity detector consume. The audio is now low-pass filtered before the rate conversion.
- [Media Blocks SDK .Net][Video Capture SDK .Net] Added PTZ auto-tracking — an ONVIF PTZ camera can now automatically follow a detected object.
PTZAutoTrackingControllerturns detections fromObjectAnalyticsBlock(orYOLOObjectDetectorBlock) into continuous pan/tilt/zoom commands with a configurable dead zone, sticky target tracking, a lost-target timeout (with optional return-to-preset), and command rate limiting. Target selection by largest object, first detected, tracker ID, or class label. Includes the new "PTZ Auto Tracking" WPF demo. - [Media Blocks SDK .Net][Video Capture SDK .Net] PTZ auto-tracking can now run an idle preset patrol — when no target reappears for a configurable delay, the camera cycles through a list of ONVIF presets (with a per-preset dwell time) until a new target is acquired, which immediately aborts the patrol and resumes tracking.
- [Demos] Added a PTZ Auto Tracking WPF sample for the Media Blocks SDK — the same ONVIF auto-tracking built on a low-level
MediaBlocksPipeline(RTSP source →ObjectAnalyticsBlock→ video renderer, withPTZAutoTrackingControllerdriving the camera). - [Media Blocks SDK .Net] Added
VideoStabilizationBlock— real-time video stabilization that removes camera shake by estimating global inter-frame motion (translation and rotation) with OpenCV optical flow, smoothing the camera trajectory, and warping each frame back onto the smoothed path. Configurable smoothing radius, crop/zoom ratio, and per-frame correction limits; all tunable live. Requires the OpenCV redistributable (Windows). - [Media Blocks SDK .Net][Video Capture SDK .Net][Media Player SDK .Net]
VideoStabilizationBlockcan now be used with the X engines: pass it toVideo_Processing_AddBlock()onVideoCaptureCoreXorMediaPlayerCoreXto stabilize a live camera or a playback stream, with live retuning throughApplySettings(). - [Demos] Added a Video Stabilization WPF sample (Media Blocks SDK): open a file, preview stabilized playback, record the stabilized result to MP4, and adjust the smoothing radius and crop ratio live.
- [Demos] Added a Video Stabilization Capture X WPF sample (Video Capture SDK X): stabilize a live camera with
VideoCaptureCoreXand tune the stabilizer while the capture runs. - [Demos] Added a Video Stabilization Camera WPF sample (Media Blocks SDK): stabilize a live camera with a hand-built
MediaBlocksPipeline(camera source → stabilizer → renderer), with live tuning.
2026.7.8¶
- [Video Edit SDK .Net] Fixed a native process crash (fail-fast) when rendering FLAC output from a timeline with more than one clip (or a gap before the audio clip) in
VideoEditCoreX. - [Video Capture SDK .Net] Fixed empty WMA audio-only recordings from the legacy
VideoCaptureCoreengine: the default WMA profile was variable-bitrate (VBR), which the WM ASF Writer cannot produce from a live capture source, so the file contained only an ASF header with no audio data. The default is now an equivalent constant-bitrate WMA profile. - [Core][Video Capture SDK .Net][Media Blocks SDK .Net] Fixed a 32-bit (x86) ABI bug that mis-sized the native
GMutexfield (as a pointer) in the GStreamer object layout, shifting every element's field offsets by 8 bytes on x86. This made the element pad list read as empty and caused a NullReferenceException crash whenever the video/audio sample grabber, snapshots, or a frame-processing block was used on 32-bit. Frame grabbing, snapshots, and per-frame processing now work correctly on x86 (x64 unaffected).
2026.7.6¶
- [Media Blocks SDK .Net] Fixed an intermittent "Unable to create sample grabber element" failure that could occur when starting several camera pipelines (e.g. multiple RTSP cameras) at the same time. Managed element construction is now thread-safe.
- [Media Blocks SDK .Net] Fixed a NullReferenceException crash in the video sample grabber (and related processing elements) that could occur on the streaming thread when a frame buffer was momentarily unavailable.
2026.7.3¶
- [Media Blocks SDK .Net] Added
PIIRedactionBlock— automatic on-video redaction of personally identifiable information: faces (YuNet), vehicle license plates (FastALPR detector), and on-screen text (PP-OCRv5 detection + recognition — recognition filters out the detector's non-text false positives — with an optional regex filter that redacts only matching text such as e-mails or phone numbers). Redaction styles: Gaussian blur, pixelate, and solid fill. Each category can be toggled live; regions are padded and held between detection cycles so PII stays covered through motion and detector flicker. Works inVideoCaptureCoreX/MediaPlayerCoreXviaVideo_Processing_AddBlock. - [Demos] Added a PII Redaction WPF sample (Media Blocks SDK): webcam, file, or RTSP source with live category/style switching.
- [Demos] Added Player PII Redaction X and Capture PII Redaction X samples (WPF and MAUI) — live face/plate/text redaction on
MediaPlayerCoreX(file playback) andVideoCaptureCoreX(camera) viaVideo_Processing_AddBlock.
2026.7.2¶
- [Media Blocks SDK .Net] Added an open-vocabulary object-detection block (
OpenVocabularyDetectorBlock) that detects objects from free-text prompts (OWLv2 / Grounding DINO) instead of a fixed class list, with prompts swappable at runtime. It can also driveObjectAnalyticsBlockas a detector for tripwire / zone analytics. - [Media Blocks SDK .Net] Added a Florence-2 vision-language block (
VLMBlock) for frame captioning, OCR, phrase grounding, and object detection. - [Media Blocks SDK .Net] Added a CLIP video-embedding block (
VideoEmbeddingBlock) with a semantic frame-search index, for natural-language search over indexed video. - [Media Blocks SDK .Net]
VideoEmbeddingBlockcan index a file at full decode speed with no dropped samples viaVideoEmbeddingSettings.BackpressureNoDrop(backpressures the pipeline instead of dropping frames when the encoder is busy). - [Media Blocks SDK .Net]
OpenVocabularyDetectorBlockconfidence and IoU thresholds can now be adjusted at runtime (SetConfidenceThreshold/SetIoUThreshold); the new value takes effect on the next frame without rebuilding the pipeline. - [Demos] Added three WPF samples: Open Vocabulary Detection, VLM Captioning, and Semantic Video Search.
- [Media Player SDK .Net] Added
MediaPlayerCoreX.Video_Renderer_IsSync— set it tofalseto run the video renderer without clock synchronization so a file is processed at full decode speed (for offline AI indexing / analysis) instead of in real time;null(default) keeps the automatic behavior. - [Demos] Added X-engine versions of the new AI samples (WPF and MAUI): Open Vocabulary Detection and VLM Captioning for both
VideoCaptureCoreX(camera) andMediaPlayerCoreX(file), plus Semantic Video Search forMediaPlayerCoreX. Each inserts the AI block through theVideo_Processing_AddBlockAPI.
2026.6.30¶
- [Demos] Added Face Recognition and OCR demos for the X engines, in both WPF and MAUI: Player Face Recognition X and Player OCR X (
MediaPlayerCoreX), plus Capture Face Recognition X and Capture OCR X (VideoCaptureCoreX). Each inserts the AI block through theVideo_Processing_AddBlockAPI — the face demos enroll people from photos and label them on the video; the OCR demos draw and log recognized text. - [Demos] Added a Capture Live Subtitles X WPF sample (
VideoCaptureCoreXwith on-device Whisper speech-to-text subtitles).
2026.6.29¶
- [Media Blocks SDK .Net] Speech-to-text (
SpeechToTextBlock) now always transcribes the full input losslessly — the source is paced to Whisper so no audio is ever dropped. The previous live drop-buffer mode and theSpeechToTextSettings.BackpressureWhenBusyoption were removed (the lossless behavior is now the only mode).
2026.6.27¶
- [Video Capture SDK .Net]
VideoCaptureCoreXcan now insert AI processing blocks — object detection, OCR, face recognition, license-plate recognition, object analytics, background removal, generic ONNX inference, and Whisper speech-to-text — directly into the capture pipeline throughVideo_Processing_AddBlock/Audio_Processing_AddBlock, with on-frame overlays and detection events. - [Media Player SDK .Net]
MediaPlayerCoreXgains the sameVideo_Processing_AddBlock/Audio_Processing_AddBlockAPI to run AI processing (object detection, OCR, speech-to-text, and more) on played files and streams. - [Demos] Added a Player AI Processing demo (WPF): plays a file in
MediaPlayerCoreXwith a YOLO object detector or a Whisper speech-to-text block inserted through the new processing-block API. - [Demos] Added four MAUI AI demos (Android/iOS/Mac Catalyst/Windows) for the new X-engine processing-block API: Player Object Detection X and Player Live Subtitles X (
MediaPlayerCoreX), plus Capture Object Detection X and Capture Live Subtitles X (VideoCaptureCoreX). - [Media Blocks SDK .Net] Fixed an
AccessViolationException("Attempted to read or write protected memory") that could crash the application when using text overlays (OverlayManagerBlock/OverlayManagerText) — most reliably reproduced by adding a text overlay right afterStartAsyncand then stopping. The font-enumeration path freed Pango-owned font objects it did not own, corrupting memory during a later garbage collection or pipeline shutdown. - [Media Blocks SDK .Net] Fixed a related intermittent fatal crash ("Attempt to execute managed code after the .NET runtime thread state has been destroyed") that could abort the process during text overlay or font enumeration when a background media thread was recycled, or at application exit. The available-fonts / monospace-detection path no longer attaches a managed callback to Pango's internal font map.
2026.6.24¶
- [Media Blocks SDK .Net] Fixed a rare crash during pipeline shutdown or garbage collection in applications with many active GStreamer objects, such as multi-camera RTSP capture with sample grabbers, bridges, and file outputs.
- [Media Blocks SDK .Net]
FaceRecognitionBlock— enrolling a face from a photo that carries an EXIF orientation tag (typical of phone camera shots) now works; the image is rotated upright before detection instead of reporting "no face found". - [Demos] Added a Face Recognition Uno demo (Uno Platform): live camera 1:N face recognition with on-frame name/box overlay, photo enrollment, and switchable SFace / AuraFace embedding models. Android-focused.
- [Demos] The Face Recognition demos (WPF and CLI) now let you pick the embedding model: SFace (128-D) or AuraFace (512-D, ArcFace family, Apache-2.0) — a higher-accuracy, commercially licensed 512-D embedder downloaded on demand. The CLI adds an
--embedding sface|aurafaceswitch. - [Demos] Face Recognition WPF demo: switching the embedding model now automatically rebuilds the gallery from the enrolled photos, so changing models no longer makes every face read as Unknown (embeddings from different models are not comparable).
- [Demos] Face Recognition MAUI demo: added the same SFace/AuraFace embedder selection and automatic gallery rebuild, plus a video-file source with a seek bar and a real-time / max-speed playback toggle (in addition to the live camera).
2026.6.23¶
- [Media Blocks SDK .Net] Unity samples now use Unity's default Enter Play Mode behavior (Domain + Scene Reload); disabling Domain Reload is no longer required. The SDK survives the Editor's Play/Stop and script-recompile domain reloads via a built-in reload guard.
2026.6.21¶
- [Video Capture SDK X .Net] Added Android audio playback capture support to
VideoCaptureCoreX— assignAndroidAudioPlaybackCaptureSourceSettingstoAudio_Sourceto record the audio played by other apps (system AudioPlaybackCapture API, Android 10 / API 29+, on top of aMediaProjectiontoken) straight to a file. Includes a new native Android "Audio Playback Capture" demo built onVideoCaptureCoreXthat records another app's audio to an.m4afile. Only apps that allow playback capture (usage MEDIA/GAME/UNKNOWN and not opted out) can be captured.
2026.6.20¶
- [Media Blocks SDK .Net]
VideoSampleGrabberBlocknow works as a terminal block: if you leave its output unconnected (e.g. you only pollGetLastFrameAsSKBitmap()or handleOnVideoFrameBuffer), the block self-terminates so frames keep flowing. Previously a grabber with an unconnected output stalled after the first frame, so every snapshot returned the same initial image. - [Media Blocks SDK .Net]
VideoSampleGrabberBlock.GetLastFrameAsSKBitmap()andGetLastFrameAsBitmap()now returnnullwhen no frame has been captured yet, instead of throwing aNullReferenceException. - [Media Blocks SDK .Net] Setting
VideoSampleGrabberBlock.SaveLastFrame = falsenow discards the cached frame, so toggling it back on later never hands back a stale frame captured during an earlier session. - [Media Blocks SDK .Net]
KLVParsernow reads MISB KLV packets larger than 127 bytes. Standard MISB ST 0601 metadata uses BER long-form lengths, and the parser previously threw on the common 1- and 2-byte long-form lengths — so real-world packets failed to parse. All BER length forms are now decoded correctly.
2026.6.19¶
- [Media Blocks SDK .Net] Added Android audio playback capture — the new
AndroidAudioPlaybackCaptureSourceBlockrecords the audio played by other apps using the system AudioPlaybackCapture API (Android 10 / API 29+) on top of aMediaProjectiontoken, with a configurable format and usage filter (AndroidAudioPlaybackCaptureSourceSettings). Includes a new native Android "Audio Playback Capture" demo that records another app's audio to an.m4afile. Only apps that allow playback capture (usage MEDIA/GAME/UNKNOWN and not opted out) can be captured. - [Media Blocks SDK .Net] Speech-to-text (
SpeechToTextBlock) gains a lossless file-transcription mode: setSpeechToTextSettings.BackpressureWhenBusy = trueto pace a file source to the transcription engine so no audio is dropped and the pipeline position tracks the transcription frontier — ideal for transcribing a file as fast as the engine allows without losing speech. The newSpeechToTextBlock.RequestStop()lets you stop promptly mid-file, and anOnEndOfStreamevent fires when transcription finishes.
2026.6.18¶
- [Media Blocks SDK .Net] Fixed WMV/ASF output where the video stream was written with a roughly 1000-hour timestamp offset while audio started at zero — players saw a broken duration and the video and audio never shared a timeline. WMV/ASF files now have correctly aligned, overlapping video and audio timestamps.
- [Media Blocks SDK .Net] Fixed MP4 recordings produced from a still/image source (
ImageVideoSourceBlock, live mode) ending up unreadable ("moov atom not found") — a live image source now finalizes its file correctly on stop. - [Media Blocks SDK .Net] VP9 WebM output now uses a real-time-capable speed/quality default:
VP9EncoderSettings.CPUUseddefaults to4instead of0. The previous slowest/highest-quality default could not keep up with a live source, so the recorded video track could be truncated to about a second while audio ran the full length. SetCPUUsed = 0to restore maximum quality for offline encoding. - [Media Blocks SDK .Net] The rav1e AV1 encoder (
RAV1EEncoderSettings) now defaults to the fastest speed preset (SpeedPreset = 10) instead of6. rav1e is a quality-oriented, very slow software encoder; the previous default could encode well under real time (~1 fps at 720p), stalling live and short captures. LowerSpeedPresetfor higher quality in offline encoding where throughput does not matter.
2026.6.14¶
- [Media Blocks SDK .Net] The AI blocks —
YOLOObjectDetectorBlock,OcrBlock, object analytics, ANPR,BackgroundRemovalBlock(VisioForge.DotNet.Core.AI) andSpeechToTextBlock(VisioForge.DotNet.Core.AI.Whisper) — now build and run cross-platform on Linux, macOS, iOS, and Android, including .NET MAUI, in addition to Windows. - [Media Blocks SDK .Net] On-device speech-to-text (
SpeechToTextBlock, Whisper + Silero VAD) now runs on iOS and Android. - [Demos] Added three .NET MAUI sample apps: YOLO Object Detection, OCR Text Recognition, and Live Subtitles (on-device Whisper speech-to-text). The existing Live Subtitles console sample is now cross-platform (Windows, Linux, macOS).
- [Media Blocks SDK .Net] Fixed a crash that could occur when stopping live speech-to-text with
SpeechToTextBlockconfigured withEnableVad = false(fixed-window mode) — stopping the pipeline at end-of-stream while a transcription was in progress could terminate the process. Transcription of the in-progress window now completes cleanly during shutdown. - [Media Blocks SDK .Net]
SpeechToTextSettings.FixedWindowSecondsis now clamped to 1–30 s andSileroVadSettings.MaxSpeechMsno longer accepts "0 = unlimited" (a non-positive value falls back to the 15 s cap), so a single transcription window — and the time a stop waits for it to finish — stays bounded.
2026.6.13¶
- [Media Blocks SDK .Net] Added live speech-to-text / subtitles — the new
SpeechToTextBlock(in the newVisioForge.DotNet.Core.AI.Whisperpackage) transcribes the audio stream in real time with Whisper (Whisper.net / GGML) on a background worker, gated by Silero VAD so silence is skipped and not mis-transcribed. Audio passes through unchanged. It raisesOnSpeechRecognized, can auto-render captions onto video viaSubtitleRenderer+OverlayManagerBlock, and can write.srt/.vttside-car files. Runs fully on-device (CPU or NVIDIA CUDA); Whisper and Silero models are downloaded at runtime. Includes a new WPF Live Subtitles demo. - [Media Blocks SDK .Net] Added AI background removal (matting) — the new
BackgroundRemovalBlockruns an ONNX segmentation model (for example MODNet) to estimate a per-pixel foreground mask and replaces the background in real time with a blur of the original, a solid color, a static image, or transparency. Includes a new WPF Background Removal demo. The background is composited on every frame, so running the model less often (frame skipping) lowers CPU/GPU load without flicker.
2026.6.11¶
- [Media Blocks SDK .Net] Added Object Analytics — multi-object tracking with stable IDs, directed tripwire line crossing (In/Out counts), and polygon zone occupancy on top of ONNX object detection. Includes a turnkey
ObjectAnalyticsBlock, a pure C# analytics API (ByteTracker,LineZone,PolygonZone), overlay rendering with traces and counters, a new analytics mode in the YOLO Object Detection demo, and separate Tripwire and Polygon Zone demo applications.
2026.6.8¶
- [Video Capture SDK .Net] Updated the bundled FFmpeg DirectShow source and encoder filters to FFmpeg 8.1.1, with refreshed codec libraries (VP8/VP9, Opus, Vorbis, Speex, SRT) and current OpenSSL — bringing newer format support and upstream security and stability fixes to FFmpeg-based capture and output.
2026.6.7¶
- [Media Blocks SDK .Net] Fixed a crash when reusing a
TSAnalyzerBlockacross runs: after the block is stopped, analyzing a second transport stream with the same instance in a new pipeline now works instead of failing during rebuild. - [Media Blocks SDK .Net] Fixed MPEG-TS output with KLV metadata aborting (no valid file produced) when a video frame arrived with an out-of-order/duplicate timestamp — the muxer now keeps the stream writable, so KLV-bearing transport streams record reliably.
- [Core] Fixed native memory steadily growing while reading media information for many different files in sequence with
MediaInfoReaderX; per-file discovery resources are now released after each read.
2026.6.6¶
- [Media Player SDK .Net] New "Modern Player" MAUI demo. A from-scratch cross-platform sample (Android, iOS, macCatalyst, Windows) built on
MediaPlayerCoreXwith a dark glassmorphism UI, a YouTube-style seek preview (a thumbnail popup follows the scrub bar — generated in the background from the opened file), a live video + audio effects drawer (brightness/contrast/saturation/hue, gamma, blur/sharpen, grayscale, edge, deinterlace, color presets, flip/rotate, 3D-LUT; plus gain, pitch, 10-band equalizer, reverb, echo, true-bass, and karaoke), frame snapshot, playback-speed control, and volume/mute. - [Media Player SDK .Net] [Media Blocks SDK .Net] Fixed opening local media files by absolute file path on Android, iOS, macOS, and Linux. A path starting with
/(the form returned by the native file pickers) previously failed with a URI-format error;MediaPlayerCoreX.OpenAsync(string),MediaInfoReaderX, andUniversalSourceSettings.CreateAsync(string)now open such files correctly. Windows paths were unaffected. - [Media Blocks SDK .Net] OCR — text recognition: new
OcrBlockrecognizes text in any video or image source using a multi-stage PaddleOCR (PP-OCRv5) ONNX pipeline — text detection, automatic 180° orientation handling, and text-line recognition. Runs on CPU or GPU (DirectML on Windows, CoreML on Apple, CUDA) and is fully cross-platform (Windows/Linux/macOS/Android). It raises the recognized regions per frame (text, confidence, and the text polygon) and can optionally draw the boxes and recognized text directly into the video. Works with the permissive Apache-2.0 PP-OCRv5 mobile models (100+ languages available); the models ship with the sample, not the package. - [Media Blocks SDK .Net] ANPR — license plate recognition: new
LicensePlateRecognizerBlockreads vehicle number plates from a live stream or file using a specialized two-stage pipeline — a dedicated license-plate detector locates each plate, then a plate-specific OCR model (a global head covering the USA and 90+ countries, or a European head) reads its characters. Recognition runs on a background thread so live video never stalls; recognized plates (text, confidence, bounding box) are raised per frame and optionally drawn over the video. Cross-platform and GPU-accelerated (DirectML / CUDA / CoreML). The MIT-licensed models ship with the sample, not the package.
2026.6.4¶
- [Media Blocks SDK .Net] AI inference package renamed: the AI/ONNX inference package is now published as
VisioForge.DotNet.Core.AI(previouslyVisioForge.DotNet.Core.ONNX). Update yourPackageReferenceto the new id — the API and namespaces of the inference blocks are unchanged. - [Media Blocks SDK .Net] Object detection: more models, permissive default.
YOLOObjectDetectorBlocknow decodes three model families via the newYoloDetectorSettings.Modelproperty — YOLOX and RT-DETR / D-FINE (both Apache-2.0) in addition to YOLOv8/v11. Each family's frame preprocessing (resize mode, normalization, channel order) and the model's input size are applied automatically, so you only pick the family and the.onnxfile. The Object Detection demo now ships a ready-to-run Apache-2.0 model (YOLOX-nano) and works out of the box without any third-party model download. RT-DETR / D-FINE detectors are end-to-end (NMS-free). - [Media Blocks SDK .Net] TS analyzer — ETSI TR 101 290 monitoring:
TSAnalyzerBlocknow reports a structured TR 101 290 Priority 1/2/3 check list (sync loss, sync-byte errors, PAT/PMT/PID errors, continuity-count errors, transport errors, CRC errors, PCR/PTS errors, and SI/SDT/EIT/TDT errors), each with its priority, error count, and pass/fail status — turning the block into a broadcast-grade transport-stream monitor. - [Media Blocks SDK .Net] TS analyzer — service information: the report now exposes per-program SDT service names, service provider, and service type, the network name, and the stream UTC time (TDT/TOT), so programs show up as their real service name instead of just a program number.
- [Media Blocks SDK .Net] TS analyzer — audio language: elementary-stream entries now carry the ISO 639 audio language parsed from the PMT descriptors.
- [Media Blocks SDK .Net] TS analyzer — scrambling detection: per-PID and per-program scrambling state is now reported (transport-scrambling-control and free_CA_mode), along with a scrambled-packet count.
- [Media Blocks SDK .Net] TS analyzer — null and effective bitrate: the report adds the null-packet count, the null (stuffing) bitrate, and the effective (useful) bitrate, plus per-PID instantaneous and peak bitrate alongside the existing cumulative average.
- [Media Blocks SDK .Net] TS analyzer — PCR timing and PTS/DTS: PCR statistics now include maximum jitter and PCR repetition errors, and the report tracks PTS/DTS presence per PID and audio/video synchronization offset.
- [Media Blocks SDK .Net] TS analyzer — codec details: video elementary streams now report parsed codec details (resolution, frame rate, profile, level, chroma format, and display aspect ratio) for H.264, HEVC, and MPEG-2. Frame rate and aspect ratio are reported from the MPEG-1/2 sequence header.
- [Media Blocks SDK .Net] TS analyzer — optional EPG: when enabled, the analyzer parses EIT events (event id, start time, duration, name, description) and exposes them as an EPG event list. The new analysis options (service info, EPG, scrambling, TR 101 290, PTS/DTS, codec details) are configurable on
TSAnalyzerSettings. The WPF and console demos display all of the new information. - [Video Capture SDK .Net] Fixed audio capture failing to start with certain WDM capture cards (for example the Viewcast Osprey 460E) when the device was selected by its device path — the device enumerated correctly but capture aborted with an "audio output pin is null" error. Such devices now bind reliably.
- [Media Blocks SDK .Net] Fixed a
MediaBlocksPipelinebecoming unusable after a media file played to its end. Once a source reached End-of-Stream, the nextStartAsync()was permanently rejected with "Already starting or start in progress." and the pipeline could not be restarted without recreating it — for example when switching from a finished file back to a live camera. Playback now shuts down cleanly at end-of-stream exactly like an explicitStopAsync()(sources stopped, resources released), so the same pipeline can be started again.
2026.6.3¶
- [Media Blocks SDK .Net] MPEG-TS analyzer: new
TSAnalyzerBlockanalyzes a transport stream and reports the program/service line-up (PAT/PMT/PSI), the per-PID stream types and codecs, per-PID and total bitrate, continuity-counter errors, and PCR timing (interval min/avg/max and discontinuity count). It accepts a raw MPEG-TS byte stream from a file, UDP, or SRT source and can run terminal (Input) or inline passthrough (InputOutput); subscribe toOnAnalysisUpdatedfor periodic snapshots or callGetReport(). New WPF and console demos ("TS Analyzer Demo", "TS Analyzer CLI") show file and live UDP/SRT analysis. - [Media Blocks SDK .Net] Raw MPEG-TS UDP source: new
UDPRAWMPEGTSSourceBlockreceives a live UDP unicast or multicast transport stream and exposes the untouched MPEG-TS byte stream without demuxing — for analysis or passthrough remuxing/recording. The advertised packet size is configurable viaUDPRAWMPEGTSSourceSettings.PacketSize(188 by default, or 192 for M2TS-style streams). - [Media Blocks SDK .Net] Split-recording segment events:
MP4SinkBlock,MPEGTSSinkBlock, andMP4OutputBlocknow raiseOnSegmentCreatedandOnSegmentClosedwhen configured for split recording (MP4SplitSinkSettings/MPEGTSSplitSinkSettings). The arguments carry the segment file path, fragment index, and timing (running time, plus start offset and duration on close) — so you can be notified when a segment file is finished and, for example, rename it to include its start/end time. - [Media Blocks SDK .Net] Custom split-segment file names: the same blocks add an
OnSegmentFileNameRequestedevent, raised just before each new segment file is created, letting you supply a custom file name (for example one that embeds the segment start date/time). Leave it unset to keep the default name from the location pattern. - [Media Blocks SDK .Net] New AI inference blocks:
OnnxInferenceBlockruns any ONNX Runtime model over the live video frames and raises an event with the raw model outputs, whileYOLOObjectDetectorBlockperforms YOLOv8/v11 object detection, draws bounding boxes and labels directly on the video (label text auto-scales to the frame resolution so it stays readable on 720p/1080p/4K, or pin a fixed size viaYoloDetectorSettings.LabelFontSize), and raises a detections event (with class, confidence, and box for each object). Both support frame skipping to tune throughput. On Windows the package uses the DirectML ONNX Runtime build, so inference runs on any DirectX 12 GPU (NVIDIA, AMD, or Intel) out of the box; the execution provider defaults toAuto, which picks the fastest available backend (DirectML/CUDA/CoreML) and transparently falls back to the CPU. UseOnnxInferenceEngine.GetAvailableProviders()to detect what is available and the newActiveProviderproperty on either block to see which provider engaged. TheVisioForge.DotNet.Core.ONNXpackage targets the full SDK framework matrix (.NET Framework 4.6.1 through .NET 10); inference requires a 64-bit (x64 or ARM64) ONNX Runtime native build.
2026.6.2¶
- [Video Capture SDK .Net] Fixed KLV metadata progressively drifting out of sync with the video (about 2 seconds per source loop) on the receiving side when restreaming a looping KLV-bearing MPEG-TS via
UDP_FFMPEG_EXE. KLV and video now stay aligned across source loop boundaries. - [Video Capture SDK .Net] Unity: new VideoCaptureCoreX samples — local webcam preview + MP4 recording (Windows, macOS) and IP/RTSP camera viewing (Windows, Android, macOS, iOS).
- [Video Edit SDK .Net] Unity: new VideoEditCoreX sample — combine clips, apply effects, preview the timeline in Unity, and render to MP4.
2026.5.31¶
- [Media Blocks SDK .Net] New
UDPRAWSourceBlock: receives a live UDP stream (MPEG-TS, RTP, or raw elementary) and exposes the parsed, still-encoded media without decoding — ideal for recording or remuxing without re-encoding. MPEG-TS feeds are auto-detected; RTP and raw modes let you set the codec, RTP payload type, and a multicast address. It exposes all common video and audio codecs (video: H264, H265, VP8, VP9, AV1, MPEG-2, MJPEG; audio: AAC, MP3/MPEG audio, AC-3, Opus, FLAC); RTP can also carry audio on a separate port (AudioPort/AudioCodec). A codec without a dedicated parser is passed through unchanged rather than dropped, so a connected recorder/muxer is never starved. - [Demos] New WPF "UDP RAW Capture Demo" (Media Blocks SDK .Net): records a live UDP H264/H265 feed to MP4 files without re-encoding, with selectable transport (Auto / MPEG-TS / RTP / raw), starting a new file on a configurable interval and splitting on key-frames so no data is lost between files, while previewing the stream.
- [Media Player SDK .Net] Unity: new MediaPlayerCoreX sample — play files and network URLs with seek, pause and volume, rendered into a Unity
Texture2D.
2026.5.29¶
- [Media Blocks SDK .Net] Unity 6 (.NET Standard 2.1) build flavor: the managed SDK now ships as a single
netstandard2.1assembly compatible with Unity's IL2CPP backend (Api Compatibility Level = .NET Standard 2.1). This lets Unity projects target the SDK without requiring the .NET Framework 4.x compatibility surface. The existing net48 Unity package remains supported. - [Media Blocks SDK .Net] Unity macOS Standalone player support (Universal arm64 + x86_64): the Unity 6 ns2.1
.unitypackagenow ships a third platform flavor for macOS Standalone (in addition to Windows and Android). Includes pre-built P/Invoke for macOS.dylibnames, the bundled CrossPlatform.Core.macOS native runtime (GStreamer dylibs +libgioopensslTLS backend +ca-certificates.crt), and a one-timeConfigure()bootstrap that prunes any system / homebrew GStreamer fromDYLD_LIBRARY_PATHbefore the loader runs. - [Core] New API:
VisioForgeX.StopMainLoop()— explicit teardown of the internal GLib main loop independent ofDestroySDK(), for scenarios that need to release the loop without tearing the SDK down.
2026.5.22¶
- [Demos] Unity
.unitypackagedistribution: the Unity 6 (net48) integration now ships as a single self-contained.unitypackage - [Demos] New Unity 6 (net48) samples:
SimplePlayer(file playback) andRTSPViewer(live RTSP camera) render aMediaBlocksPipelineinto a UnityRawImagevia a reusableVisioForgeVideoViewcomponent (Stretch / Letterbox / Crop). The bundled native + managed runtime is set up automatically; a step-by-step setup guide is included.
2026.5.20¶
- [Media Blocks SDK .Net] Fix: native memory leak in
OverlayManagerFilterandPanZoomFilteron iOS/AOT builds.
2026.5.19¶
- [Media Blocks SDK .Net] Fix:
CVMotionCellsBlock,CVFaceDetectBlock,CVHandDetectBlock,CVTemplateMatchBlock— event subscriptions added afterStartAsyncsometimes were silently dropped. - [Media Blocks SDK .Net] Fix:
CVMotionCellsSettings.GapandPostNoMotionare now rounded and clamped to the ranges accepted by the underlyingmotioncellselement (Gap→[1, 60]s,PostNoMotion→[0, 180]s). Previously sub-second values truncated to0and were silently rejected. - [Media Blocks SDK .Net] Docs:
CVMotionCellsSettings.GridSizeXML-doc clarified that the minimum is 8x8 (constraint of the underlyingmotioncellselement); smaller values are silently rejected.
2026.5.18¶
- [Media Blocks SDK .Net] New API:
SRTSinkSettings.PreResolveHostnameandSRTSourceSettings.PreResolveHostname(bool, defaultfalse). When set totrue, the SDK resolves any DNS hostname in the SRT URI to a literal IPv4 on the managed side (viaSystem.Net.Dns) before handing the URI to the native code.
2026.5.16¶
- [Core] Public-API XML documentation is now validated for correct syntax across the shipped NuGet packages.
2026.5.15¶
- [Core] Added
D3D11ComposableWPF renderer mode: a pure FrameworkElement video panel built on a D3D11 shared texture +D3DImagebridge that composes natively with the WPF visual tree (transforms, opacity, z-order, rounded clips) and keeps frames GPU-resident end-to-end. New type:D3D11ComposablePanel. - [Core] Added true-peak (dBTP) metering per ITU-R BS.1770-4: new
TruePeakComputer(4× polyphase FIR oversampling, per-channel running peak, NaN/Inf-safe) andVUMeterXData.TruePeak[]channel array fired alongside the existing sample-peak/RMS data. - [Core] Added
VolumeMeterLEDWPF control: segmented LED-bar VU meter with broadcast-style green/yellow/red zones, optional peak-hold marker (configurable fall time), optional dB scale labels, optional RMS overlay bar, horizontal/vertical orientation. - [Core] NuGet packages now ship XML documentation generated from real summaries for the full public API surface (previously the doc files were empty).
2026.5.14¶
- [Avalonia] Updated Avalonia, Avalonia.Desktop, Avalonia.Fonts.Inter, Avalonia.Themes.Fluent from 12.0.1 to 12.0.3.
- [WinForms] Resolve issue with WinForms designer when using
VideoViewin .Net Framework 4.x projects - [Dependencies] Closed two transitive security advisories: pinned
System.Drawing.Commonper-TFM on bare/cross-platformnetN.0(was 5.0.1 via DlibDotNet — GHSA-rxg9-xrhp-64gj, critical) and added explicitSharpCompress 0.48.1CPM pin to lift the transitive floor from MongoDB.Driver (was 0.30.1 — GHSA-6c8g-7p36-r338, moderate); bumped MongoDB.Driver 3.8.0 → 3.8.1. - [Breaking]
VisioForge.Core.CVDandVisioForge.Core.FaceAIassemblies are no longer strong-named. The underlyingDlibDotNetdependency is unsigned, so the strong-name chain was already broken at runtime; the<SignAssembly>flag was dropped to silence CS8002. Consumers that referenced these assemblies by fully-qualified strong name (PublicKeyToken=...) or used[InternalsVisibleTo("VisioForge.Core.CVD, PublicKey=...")]must remove the strong-name assertion when upgrading.
2026.5.10¶
- [Core]
CustomMixerSourceBlock: reliability and throughput improvements under heavy load.
2026.5.8¶
- [Dependencies] Upgraded MongoDB.Driver.GridFS 2.30.0 to MongoDB.Driver 3.8.0; pinned Snappier 1.3.1 to resolve NU1903 high-severity vulnerability (GHSA-pggp-6c3x-2xmx)
2026.5.2¶
- [Core] Breaking change: licensing APIs now accept only raw certificate bytes. Removed file-path and stream-based certificate setters across shared licensing, public SDK wrappers, legacy Windows wrappers, tests, and licensing docs. Applications must load
.vflicensefiles into memory and callSetLicenseCertificateAsync(byte[]). - [Core]
AudioMixerBlock:AudioMixerSettings.IgnoreInactivePadsis now opt-in (defaultfalse). The 2026.4.30 release briefly forced ittrue, which broke single-input mixers — silent live audio and corrupted MP4 output. Multi-stream consumers (MediaPlayerCoreXadditional audio streams,LiveVideoCompositor, andAudioMixerSourceSettings-based multi-source capture) now opt in explicitly. If you wired a multi-streamAudioMixerBlockon 2026.4.30–2026.5.1 and relied on the implicittrue, setAudioMixerSettings.IgnoreInactivePads = trueexplicitly.
2026.4.25¶
- [Core] Fixed WinForms designer exception on
VideoViewin net472 demos — SkiaSharp 3 migration regression - [Core] Added transitive
SkiaSharp.NativeAssets.Linuxdependency for bare cross-platform TFMs (netcoreapp3.1,net5.0–net10.0) so consumers publishing tolinux-x64/arm64no longer need to add the package manually; mainSkiaSharpalready covers Win32/macOS/iOS/Android/MacCatalyst/tvOS via per-TFM nuspec groups - [Avalonia] Migrated SDK and all 28 demos from Avalonia 11.3.8 to 12.0.1: replaced
Avalonia.DiagnosticswithAvaloniaUI.DiagnosticsSupport 2.2.1, switched toReactiveUI.Avalonia 12.0.1, updatedRxApp.MainThreadScheduler→RxSchedulers.MainThreadScheduler(ReactiveUI 23.x), newUseReactiveUI(_ => { })signature, moved AndroidCustomizeAppBuilderfromMainActivityto newMainApplication : AvaloniaAndroidApplication<App>, migratedSaveFileDialog/OpenFileDialog/FileDialogFiltertoIStorageProvider.SaveFilePickerAsync/OpenFilePickerAsyncin 4 demos. SkiaSharp pinned to 3.119.3-preview.1.1 (required by Avalonia.Skia 12).
2026.4.23¶
- [NuGet] Extracted Intel Quick Sync Video (QSV) plugin (
gstqsv.dll) fromVisioForge.CrossPlatform.Core.Windows.x64/x86into new optional packagesVisioForge.CrossPlatform.Core.Windows.Intel.x64andVisioForge.CrossPlatform.Core.Windows.Intel.x86; each depends on the corresponding base Core package - [Video Capture SDK .Net] Fixed FFMPEG.exe pipe output argument ordering so resize/aspect options are emitted after all inputs, including KLV metadata pipe input
2026.4.21¶
- [Core] Added
AutoAV1EncoderSettings: auto-selecting AV1 encoder that walks AMF → NVENC → QSV → SVT-AV1 viaEncoderRuntimeTracker, mirroringAutoH264EncoderSettings/AutoHEVCEncoderSettings; AV1 sessions now participate in per-runtime slot accounting - [Core] Added typed
AV1Encoder.CanCreateSession(IAV1EncoderSettings, out string)probe so AV1 runtime selection can detect driver rejections before wiring a pipeline - [Core] Added
MFH264EncoderSettings,D3D12H264EncoderSettings,D3D12HEVCEncoderSettings— alternative Windows runtimes (mfh264enc,d3d12h264enc,d3d12h265enc) with independent per-adapter session counters for bypassing per-runtime caps (e.g., AMD iGPU 2-session ceiling) - [Core] Added
AutoH264EncoderSettings/AutoHEVCEncoderSettings: auto-selecting encoder that probes runtimes in order (AMF → NVENC → QSV → MF → D3D12 → software), tracks in-flight sessions viaEncoderRuntimeTracker, and falls back when a runtime's cap is reached - [Demo] Added
Encoder Concurrency TestWPF demo (Media Blocks SDK): spawn multiple source→encoder→decoder→renderer pipelines with configurable resolution, frame rate, encoder runtime, and adapter to exercise concurrent-session limits end-to-end
2026.4.18¶
- [Media Blocks SDK] UniversalSourceBlock: added
VideoFlipRotateoption for automatic video orientation correction using image-orientation metadata - [Core] VOAACEncoderSettings deprecated in favor of
AVENCAACEncoderSettings - [Core] RTSPXOutput: now accepts any
IAACEncoderSettings, not just VOAAC - [Core] MediaInfoReaderCore: preserves image-orientation flip metadata during media info reading
- [Core] H264Encoder: fixed thread-safety issue in KeyFrameDetected callback
- [iOS] PhotoGalleryHelper: requests
PHAccessLevel.AddOnlyfor iOS 26 compatibility - [Android] GStreamer Android NuGet rebuilt with zbar barcode plugin, bumped to 2026.4.18
- [Platform] macOS demos migrated from net9.0-macos to net10.0-macos
- [Dependencies] Uno.Sdk bumped 6.4.24 → 6.5.31
- [Media Blocks SDK] LiveVideoCompositor V2: added
OnRenderStatisticsevent withActualFps,ConfiguredFps,FramesDelivered, andLastFrameTimestamppayload for detecting when the compositor falls behind the configured frame rate under heavy load - [Media Blocks SDK] LiveVideoCompositor V1 (
VisioForge.Core.LiveVideoCompositor) marked[Obsolete]— migrate toVisioForge.Core.LiveVideoCompositorV2(identical class names, single-lineusingswap); V1 will be removed in a future release - [Demos] WPF LVC Demo and MAUI LVC Demo show the real vs configured output FPS in the UI; WinForms Video Mixer Player migrated from V1 to V2
2026.4.11¶
- [Media Player SDK X] Added
Play_PauseAtFirstFrameproperty to MediaPlayerCoreX — pauses at the first rendered frame for preview/thumbnail scenarios, matching the existing MediaPlayerCore API - [Core] Migrated SkiaSharp from 2.88.9 to 3.119.2 — updated text rendering to SKFont API, replaced SKFilterQuality with SKSamplingOptions, switched SVG library from SkiaSharp.Svg to Svg.Skia
- [UI] Updated SkiaSharp.Views.WPF and SkiaSharp.Views.Maui.Controls to 3.119.2; WPF skins now use DrawImage with high-quality Mitchell resampling
2026.4.8¶
- [Android] Added live camera switching (SwitchCamera) to SystemVideoSourceBlock — switches between front/back cameras without recreating the GStreamer pipeline, preserving resolution and frame rate
- [Video Capture SDK X] Added Video_Source_SwitchCamera for live camera switching on Android without pipeline restart
- [Video Capture SDK X] Added Video_Renderer_IsSync and Audio_Renderer_IsSync properties (default false) for lower-latency live preview
- [Android] New NuGet native version v2026.4.1
2026.3.27¶
- [Core] Fixed UNC path media info reading failure:
MediaInfoReaderAltnow correctly handles SDK initialization guard, null caps inOnPadAdded, and falls through toMediaInfoReaderXon failure.IsSambaURL()extended to detectfile://host/pathUNC URIs.OpenAsyncusesuri.LocalPathfor correct Windows UNC path.
2026.3.18¶
- [Media Blocks SDK .Net] Fixed missed context menu issue in WPF VideoView
2026.3.17¶
- [Media Blocks SDK .Net] Added UDPSinkBlock and MultiUDPSinkBlock for raw UDP streaming output with single and multi-destination support
- [Media Blocks SDK .Net] Added UDPMPEGTSSinkBlock and MultiUDPMPEGTSSinkBlock for MPEG-TS multiplexed UDP streaming with single and multi-destination support
- [Media Blocks SDK .Net] Added UDPSinkSettings, MultiUDPSinkSettings, and UDPSinkSettingsBase for UDP sink configuration with IPv6 support and URL parsing
- [Media Blocks SDK .Net] Added UDP MPEG-TS streamer demo (screen capture to UDP output)
2026.3.11¶
- [Core] Device enumeration: Blackmagic ATEM and Web Presenter devices now appear in regular video/audio device lists instead of being filtered as Decklink hardware. These devices use standard USB/UVC drivers, not the Decklink SDK. Applies to both DirectShow and GStreamer enumeration paths.
- [Core] RTSP info reader: Added audio channel count and sample rate parsing from SDP rtpmap and GStreamer pad caps.
2026.2.16¶
- [Media Blocks SDK .Net] Added PreEventRecordingBlock for circular buffer (pre-event) video recording with configurable buffer duration, keyframe-aware drain, and automatic post-event stop
- [Video Capture SDK .Net] VideoCaptureCoreX: Added pre-event recording API with TriggerPreEventRecording, ExtendPreEventRecording, StopPreEventRecording, and state query methods
- [Video Capture SDK .Net] VideoCaptureCoreX: Added PreEventRecordingOutput for configuring circular buffer recording with MP4, MPEG-TS, and MKV container support
2026.2.12¶
- [Media Blocks SDK .Net] Added OnNetworkSourceDisconnect event for detecting network source disconnections (RTSP, HTTP, SRT, NDI, RTMP, etc.) with detailed error information and source URI
2026.2.11¶
- [Media Player SDK .Net], [Media Blocks SDK .Net] Fixed audio effects pipeline routing
2026.2.10¶
- [Core] Added UNC (SMB/Samba) network path support for file sources across all X-engines, fixing File.Exists() failures on network shares
- [Media Blocks SDK .Net], [Video Capture SDK .Net] Added mouse click highlight support for screen capture with auto-subscribe/unsubscribe, manual click input, and real-time settings update
2026.2.8¶
- [Media Blocks SDK .Net] Added OverlayManagerImageSequence: image sequence overlay with per-frame durations, looping, position/size animation, fade effects, and easing support
- [Media Blocks SDK .Net] Added ImageSequenceItem data class for defining image sequence frames
- [Media Blocks SDK .Net] OverlayManagerBlock: Added convenience methods for image sequence overlays (Video_Overlay_AddImageSequence, UpdateImageSequencePosition, AnimateImageSequence, ImageSequenceFadeIn/Out)
- [Core] Extracted OverlayManagerEasingHelper: shared easing functions for all overlay animation types (Image, Fade, Pan, Squeezeback, ImageSequence)
2026.2.4¶
- [Media Blocks SDK .Net] Added H264PushSourceBlock for pushing raw H.264 encoded data into a decoding pipeline, with automatic AVC-to-byte-stream conversion and PTS rebasing
- [Core] Added RtspDescribeClient: lightweight cross-platform RTSP DESCRIBE client for fast stream discovery (~100-200ms), with SDP parsing and Basic/Digest auth support
- [Core] RTSPSourceSettings: Added fast RTSP discovery path using RtspDescribeClient
- [Core] RTSPRAWSourceSettings: Added fast RTSP discovery path using RtspDescribeClient
- [Core] UniversalSourceSettings: Added fast RTSP discovery path for rtsp:// and rtsps:// URIs
2026.2.2¶
- [Core] VideoCaptureDeviceInfo: Extended Windows device path population to support Media Foundation (MF) devices in addition to KS
- [Core] VideoCaptureDeviceInfo: Fixed pre-existing bug where V4L2 device path validation checked wrong variable
- [Core] VideoCaptureDeviceSourceSettings: Added FindByDevicePath() static methods for restoring saved camera profiles by device path
- [Core] DeviceEnumerator: Added FindVideoSourceByDevicePathAsync() method for looking up devices by path
- [Media Blocks SDK .Net] Added RIST (Reliable Internet Stream Transport) MPEG-TS sink output support
- [Media Blocks SDK .Net] Added WebRTC WHIP (WebRTC-HTTP Ingestion Protocol) output support
- [Video Capture SDK .Net] Added WebRTC WHIP streaming output
- [Video Capture SDK .Net] Added RIST streaming output
2026.1.16¶
- [Media Blocks SDK .Net] BridgeVideoSourceSettings: Added DoTimestamp property to enable fresh timestamp generation for cross-pipeline scenarios
2026.1.15¶
- [Media Blocks SDK .Net] DecklinkVideoSinkSettings: Made Mode parameter required in constructor to prevent frame rate mismatch issues (was defaulting to Unknown mode causing unexpected 23.98fps output)
- [Media Blocks SDK .Net] DecklinkVideoSinkSettings: Made DeviceNumber and Mode properties read-only for immutability
- [Core] DecklinkVideoOutputDialog (WPF): Added Video Mode selector for configuring output frame rate
2026.1.12¶
- [Core] WPF VideoView: Fixed crash (System.ExecutionEngineException) when minimizing window during video overlay playback
2026.1.11¶
- [Media Blocks SDK .Net] RTSPSourceBlock: Fixed video freeze when audio capture is disabled for cameras with multiple audio streams
- [Media Blocks SDK .Net] RTSPRAWSourceBlock: Added fakesink handling for disabled audio streams to prevent pipeline stalls
- [Core] MediaInfoReaderCore: Added logging for discovered audio, video, and RTP streams
- [Core] MediaInfoReaderCore: Fixed excessive block size (5MB) being set for RTSP sources, improving discovery speed
2026.1.10¶
- [Video Capture SDK .Net] DSFFMPEGEXEPipeOutput: Fixed preview lag during video capture with optimized pipe handling and queue processing
- [Video Capture SDK .Net] FFMPEG EXE output: Added real-time encoding optimizations for VP8/VP9, fixed MJPEG quality mode, improved default H264MFSettings defaults
2026.1.6¶
- [Video Capture SDK .Net] VideoCaptureCoreX: Fixed video capture resolution issue when ResizeVideoEffect is applied
2025.12.12¶
- [Media Blocks SDK .Net] Added PitchBlock for audio pitch shifting with semitone control (-12 to +12 range)
- [Media Player SDK X .Net] CDGSource: Added pitch shifting support with EnablePitchShifting option and real-time PitchSemitones control
- [Media Player SDK X .Net / Media Blocks SDK .Net] CDGSourceSettings: Added ZIP archive support for karaoke files (MP3+CDG pairs inside ZIP)
2025.11.8¶
- [Media Blocks SDK .Net] OverlayManagerVideo and OverlayManagerDecklinkVideo: Changed AudioOutput property type from MediaBlock to AudioOutputDeviceInfo for direct audio device selection. Audio is now handled internally via AudioRenderer with automatic channel conversion support.
2025.11.4¶
- .Net 10 support for all SDKs
2025.11.3¶
- WPF VideoView update: Added RotationAngle, RotateCrop, and RotationStretch properties to support rotated video rendering
2025.11.1¶
- [Media Blocks SDK .Net] Add synchronized overlay group support for OverlayManagerBlock
2025.10.10¶
- [Windows SDKs] Updated VideoEffectRotate with no-crop option
2025.10.6¶
🚀 Major Feature: Ultra-Low Latency RTSP Streaming¶
- [Media Blocks SDK .Net] Revolutionary low latency mode for RTSP sources achieving 60-120ms total latency (10-14x improvement over default 1-2 seconds)
- Added
RTSPSourceSettings.LowLatencyModeproperty for one-line enablement of optimized streaming - Automatic pipeline optimization: RTSP source (80ms), queue buffers (10-20ms), and renderer sync control
- GStreamer integration:
latency=80ms,buffer-mode=0, queuemax-size-buffers=2withleaky=downstream -
Perfect for real-time surveillance, security systems, live monitoring, and interactive video applications
-
[Media Blocks SDK .Net] Enhanced RTSPSourceBlock with comprehensive low latency configuration
- Added
RTSPBufferModeenum with 5 modes (None, Auto, Slave, Buffer, Synced) for fine-grained jitter buffer control - Added
RTSPNTPTimeSourceenum (NTP, RunningTime, Clock) for NTP timestamp synchronization in multi-camera scenarios - New properties:
LowLatencyMode,BufferMode,DropOnLatency,NTPSync,NTPTimeSource -
Optimized
QueueElementwith automatic low latency configuration (2 frame max, leaky downstream mode) -
[Video Capture SDK X .Net] Full low latency mode support for RTSP sources
- Compatible with
VideoCaptureCoreXengine across all platforms - Same simple API:
RTSPSourceSettings.LowLatencyMode = true -
Works seamlessly with IP Capture demo and RTSP MultiView demo
-
[Cross-Platform Support] Low latency RTSP streaming now available on all platforms:
- Windows (WPF, WinForms, Console, Blazor)
- macOS (MAUI, Console)
- Linux (Console, WPF with Mono)
- Android (MAUI, Native)
-
iOS (MAUI)
-
[Demo Applications] Updated 6 demos with low latency mode UI controls:
- Media Blocks SDK: RTSP Preview Demo (WPF), RTSP MultiView Demo (WinForms), MAUI RTSPViewer, Android RTSP Client
- Video Capture SDK X: IP Capture (WPF), RTSP MultiView Demo (WinForms)
-
All demos include easy-to-use checkboxes or default-enabled low latency for optimal user experience
-
[Documentation] Official help documentation updated with a low-latency section and best practices.
-
[Testing] Validated on real IP cameras across all platforms. Performance benchmarks: Windows (85ms), macOS (95ms), Linux (80ms), Android (110ms), iOS (100ms).
-
[Backward Compatibility] 100% backward compatible implementation:
- Default behavior unchanged - existing code works without modification
- Low latency mode is opt-in via explicit property
- No performance impact when not using low latency mode
- Queue optimization only applied when
LowLatencyMode=true
2025.10.3¶
- [Media Blocks SDK .Net] Added DASH (Dynamic Adaptive Streaming over HTTP) sink support with DASHSinkBlock and DASHOutput classes
- [Media Blocks SDK .Net] Added UniversalSourceBlockV2 with improved memory usage and performance
- [X-engines] Fixed uvch264src not starting on Linux by properly selecting the appropriate source pad based on video format (vidsrc for H264, vfsrc for raw/MJPEG)
2025.9.5¶
- [Video Fingerprinting SDK] Improved support for flipped videos
2025.9.3¶
- [Media Blocks SDK .Net] Added DataMatrix barcode support using DataMatrixDecoderBlock block
2025.9.1¶
- [Video Fingerprinting SDK] Improved support for flipped videos
2025.8.9¶
- [Video Capture SDK .Net] VideoCaptureCoreX: Resolved issue with Snapshot_GetSK call on Android (wrong colorspace)
2025.8.6¶
- [X-engines] Updated RTSP RAW source block. Added WaitForKeyframe and SyncAudioWithKeyframe properties. Block can wait for keyframes because some cameras may not send them as first frames.
2025.8.4¶
- [X-engines] Added NDI source support in Live Video Compositor
2025.8.2¶
- [ALL] New ONVIF manager code in VisioForge.Core.ONVIFX. Full implementation of various ONVIF services including Device Management, Media v1/v2, PTZ, Events, Imaging, Analytics, Recording, and Replay services.
2025.8.1¶
- [Media Player SDK] Added PauseOnStop property to MediaPlayerCoreX
2025.6.30¶
- [X-engines] Added animated GIF support to
ImageVideoSourceBlock/ImageVideoSourceSettingsclasses - [X-engines] Resolved issues with delayed file start in Live Video Compositor
- [X-engines] Update video mixer API to use GUIDs instead of integer indexes for video sources
2025.6.27¶
- [Video Capture SDK] Resolved issue with RTSP Low Latency engine with some cameras
2025.6.5¶
- [X-engines] Resolved issue with NDI sources playback without audio streams
2025.6.3¶
- [X-engines] Updated GenICam source support for USB Vision cameras. Added GenTL source support.
2025.6.2¶
- [X-engines] Added deinterlace support for interlaced Decklink video sources
2025.6.1¶
- [Live Video Compositor] Resolved issue with file sources paused on start, and resumed with error
2025.5.1¶
- [ALL] Update NuGet dependency packages to the latest versions
- [X-engines] Resolved issue with RTMP network streaming to a custom server
2025.4.8¶
- [ALL] Added Absolute Move API to the
ONVIFDeviceXclass. You can use this API to move the ONVIF camera to the specified absolute position.
2025.2.24¶
- [X-engine] By default, Media Foundation device enumeration is disabled. You can enable it using the
DeviceEnumerator.Shared.IsEnumerateMediaFoundationDevicesproperty.
2025.2.18¶
- [Media Player SDK.Net] Added loop support for the cross-platform engine.
- [ALL] Updated RTSP-X engine output, fixed crash issue with RTSP output and VLC player frequent reconnects
- [X-engines] Changed face detector support to use IFaceDetector interface
- [Live Video Compositor] Fixed registration issues with custom video view attached to video input
2025.2.9¶
- [X-engines] Updated NDI connection speed
2025.2.4¶
- [X-engines] RTSP Server Media Block and RTSPServerOutput added to Video Capture SDK. You can use the RTSPServerBlock to create an RTSP server and stream video and audio to it.
2025.2.1¶
- [X-engines] Added NVENC and AMF AV1 encoders support
2025.1.25¶
- [Windows] Resolved HTTPS issue with the not loaded SSL certificates
2025.1.22¶
- [Windows] Resolved issue with missed ONVIF sources while enumerating on PC with multiple network interfaces
- [Media Blocks SDK .Net] Added the
OnEOSevent toMediaBlockPadclass. You can use this event to get the EOS (End of Stream) event from the media block. It can be useful if you have several file sources with a different duration and you need to stop the pipeline when the first source ends. - [Media Blocks SDK .Net] Added the
SendEOSmethod toMediaBlocksPipelineclass. You can use this method to send the EOS (End of Stream) event to the pipeline.
2025.1.18¶
- [NuGet]
VisioForge.Core.UI.Apple,VisioForge.Core.UI.Android, andVisioForge.Core.UI.WinUIpackages are merged into theVisioForge.DotNet.Corepackage. All namespaces are the same. - [Media Blocks SDK .Net] Added the
ZOrderproperty toLVCVideoInputandLVCVideoAudioInputclasses. You can use this property to set the Z-order for the video input.
2025.1.14¶
- [NuGet]
VisioForge.Core.UI.WPFandVisioForge.Core.UI.WinFormspackages are merged into theVisioForge.DotNet.Corepackage. In WPF projects you have to update the XAML code if the assembly names are used. All namespaces are the same.
2025.1.11¶
- [Video Capture SDK .Net] Resolved QSV H264 FFMPEG encoder issue with the wrong symbols in parameters
2025.1.7¶
- [Cross-platform] Added
libcamerasource support for Linux/Raspberry Pi.
2025.1.5¶
- [Cross-platform] Improved previous frame playback in Media Player SDK .Net (Cross-platform engine)
2025.1.4¶
- [Cross-platform] Resolved issue with AMD AMF plugin initialization
2025.1.1¶
- [Cross-platform] Resolved memory leak in
OverlayManagerImage
2025.1.0¶
- [Cross-platform] Updated Live Video Compositor engine. Improved Decklink support for input and output. Improved performance. The new engine classes are located in the
VisioForge.Core.LiveVideoCompositorV2namespace.
2025.0.29¶
- [Cross-platform] Default video renderer on Windows has been changed to DirectX 11
2025.0.17¶
- [Media Blocks SDK .Net] Added libCamera source support (can be used on Raspberry Pi)
2025.0.16¶
- [Media Blocks SDK .Net] Resolved issue with adding several AudioRendererBlocks to the pipeline
2025.0.14¶
- [Media Blocks SDK .Net] Added the "PushJPEGSourceSettings" class to configure the JPEG source for the "PushSourceBlock". You can use this class to set the JPEG source settings for the "PushSourceBlock". Also "video-from-images" sample added.
2025.0.7¶
- [ALL] Resolved window capture issues in cross-platform SDKs
- [Media Blocks SDK .Net] Added the Bridge Source Switch sample
2025.0.5¶
- [iOS] Resolved issues with playback speed for some video files
- [iOS] Added iOS Simulator support for all SDKs. Camera source is not supported in the simulator.
2025.0.3¶
- [MacOS] Resolved wrong stride issue for vertical camera videos on MacOS
- [Video Capture SDK .Net] Resolved background color issue for the scrolling text overlay
2025.0¶
- [ALL] .Net 9 support
- [Media Blocks SDK .Net] Added
AVIOutputBlockto save video and audio streams to the AVI file format - [Media Blocks SDK .Net]
TeeBlockconstructor now accepts the media type as a parameter - [Video Capture SDK .Net] Added
Video_CaptureDevice_SetDefaultandAudio_CaptureDevice_SetDefaultmethods to theVideoCaptureCoreclass. You can use this method to set the default video and audio capture devices - [Cross-platform] Improved
Metalvideo rendering performance on Apple devices - [All] Improved performance of common video processing operations in Windows classic SDKs
- [CV] Added DNN face detectors for the
Media Blocks SDK .NetandVideo Capture SDK .Net - [Mobile] Improved AOT compatibility for iOS and Android
- [WinUI] Improved performance of the
WinUIvideo rendering - [Media Blocks SDK .Net] Added the
GetLastFrameAsSKBitmapandGetLastFrameAsBitmapmethods toVideoSampleGrabberBlockto get the last frame as aSkiaSharp.SKBitmaporSystem.Drawing.Bitmap - [Video Capture SDK .Net]
VideoCaptureCore: Added theAddFakeAudioSourceproperty toFFMPEGEXEOutput. TheNetwork_Streaming_Audio_Enabledproperty ofVideoCaptureCoreshould be set to false to use this fake audio. - [ALL] Improved WinUI (and MAUI on Windows) VideoView performance
- [Video Capture SDK .Net]
VideoCaptureCore: Added thePIP_Video_CaptureDevice_CameraControl_API to control the camera settings for the Picture-in-Picture mode - [X-engines] Added the headers support for the HTTP sources created using the
HTTPSourceSettingsclass - [X-engines] Updated Avalonia samples, with projects for macOS, Linux, and Windows
- [X-engines] Added NuGet redist packages for macOS and MacCatalyst (including MAUI)
- [Video Capture SDK .Net]
VideoCaptureCore: Added device path support forPIP_Video_CaptureDevice_CameraControlAPI - [Video Capture SDK .Net]
VideoCaptureCore: Added theFFMPEG_MaxLoadTimeoutproperty for IP camera sources. It allows you to set the maximum time to wait for the FFMPEG source to load the stream - [X-engines] Updated Linux support for
ALSA,PulseAudioandPipeWireaudio devices - [X-engines] Updated Linux support for
V4L2devices - [X-engines] Avalonia samples has be changed to a modern 1-project structure
- [X-engines] Resolved issue with
MAUIcrashes on Windows afterSkiaSharpupdate - [X-engines] Resolved issue with
TextureViewcrashes on Android inMAUIapplications - [X-engines] Resolved playback issue for http sources using the
UniversalSourceBlock - [X-engines] Added Mobile Streamer sample for Android
- [X-engines] Added
OverlayManagerBlocksupport for Android (now it's available for all platforms) - [Video Capture SDK .Net]
VideoCaptureCoreX: AddedCustomVideoProcessor/CustomAudioProcessorproperties for all output formats. You can use these properties to set custom video/audio processing blocks for the output format. - [Media Blocks SDK .Net] Added the
KeyFrameDetectorBlockto detect key frames in video streams (H264, H265, VP8, VP9, AV1, etc.) - [Media Blocks SDK .Net] Fixed licensing issue for the
LiveVideoCompositorclass
15.10.0¶
- [Windows] Updated window capture API to capture only the specified parent window by default. Added the
UpdateHotkeymethod to theWindowCaptureFormclass to update the hotkey for the window capture form. - [X-engines] Better AOT compatibility for default MAUI settings in iOS.
- [Media Blocks SDK .Net] Added the
DNNFaceDetectorBlockto detect faces and blur/pixelate them using OpenCV and DNN models. - [Media Blocks SDK .Net] Added the
MKVOutputBlockto save video and audio streams to the MKV file format. - [X-engines] Better support for video source size dynamic changing in MAUI applications.
- [X-engines] Resolved an issue with two or more VU meters in the same pipeline.
- [X-engines] Resolved volume/mute error issue with audio mixer in Live Video Compositor engine.
- [X-engines] The
Spinnakersource forFLIR/Teledynecameras is included in the main package and no longer requires an additional plugin. - [Video Capture SDK .Net] Resolved the issue with the
SeparateCaptureAPI if noVideoViewwas used. - [X-engines] The
MediaBlocksPipelineconstructor no longer has theliveparameter. For more customizable pipelines, video and audio renderers got theIsSyncproperty (trueby default). - [X-engines] Resolved
VideoViewTXcrash in MAUI Android applications. - [X-engines]
IVideoEncoderinterface added to theMPEG2VideoEncoderclass. It allows the use ofMPEG2VideoEncoderwithMPEGTSOutput,AVIOutput, and other output classes. - [X-engines] Resolved the issue with window capture using the
ScreenCaptureD3D11SourceSettingsclass. If the rectangle was incorrect or not specified, it caused an error. - [X-engines]
Metalrenderer was added to SDK for Apple devices and used by default for iOS and MAUI. - [Media Blocks SDK .Net] Added the MAUI Screen Capture sample.
- [Video Capture SDK .Net] VideoCaptureCore: Added the
VLC_CustomDefaultFrameRateproperty toIPCameraSourceSettingsto set a custom frame rate for the VLC IP camera source if the source does not provide the correct frame rate. - [Media Blocks SDK .Net]
RTSPSourceBlock: If the RTSP source has audio but you've disabled the audio stream inRTSPSourceSettings, SDK will add a null renderer automatically to prevent warnings. - [ALL] Resolved issue with
VideoFrameX.ToBitmap()call (wrong color space) - [Windows] Updated KLV support in MPEG-TS output
- [Windows] Resolved MediaPlayerCore serialization issue
- [ALL] Video renderer settings class no longer contains background color. Use the VideoView background color property instead.
- [X-engines] Updated GStreamer libraries
- [X-engines] Resolved video rendering issues on Android and iOS
- [X-engines] iOS crash fixed during VideoViewGL usage
- [X-engines] Added default AAC encoder for iOS
- [X-engines] iOS camera source update for high frame rate support
- [Windows] Updated VLC source - improved file loading speed
- [Media Blocks SDK .Net]: Added the
UniversalDemuxBlockallows to demux video and audio streams from a file in MP4, MKV, AVI, MOV, TS, VOB, FLV, OGG, and WebM formats - [Windows] Resolved FFMPEG stability issues
- [X-engines] Resolved issue with loopback audio source using VideoCaptureCoreX and audio capture to file
- [X-engines] Added SRT source and sink support in Media Blocks SDK .Net and Video Capture SDK .Net
- [Video Capture SDK .Net] VideoCaptureCore: The
IP_Camera_ONVIF_ListSourcesAsyncExmethod got an overload version with a callback for a more responsible UI - [X-engines] RTSP source compatibility update
- [X-engines]
Breaking API change. Starting with this update, the SDK usesIAudioRendererSettingsinterface implementations for audio output configuration. WASAPI output got the custom configuration classes. Output_AudioDevice properties ofVideoCaptureCoreX/MediaPlayerCoreXtype have been changed toIAudioRendererSettings. You can create theAudioRendererSettingsclass instance fromAudioOutputDeviceInfousing the default constructor. - [X-engines] Resolved problem with missed Media Foundation sources during device enumeration
- [X-engines] Resolved RTSP source problems with audio connection in some situations
- [X-engines] Added the RTSP Preview Demo to Media Blocks SDK .Net
- [Windows] FFMPEG outputs and source updated to FFMPEG v7.0.
- [X-engines] Fixed rare crashes in RTSP source when camera information is not available for some reason (network issue)
- [X-engines] Resolved an issue with
WASAPI/WASAPI2audio renderer usage - [X-engines] Resolved an issue with the audio loopback audio source on Windows
- [X-engines] Improved iOS video rendering performance and stability
- [X-engines] Added AWS S3 Sink output for Media Blocks SDK .Net
- [X-engines] Added Allied Vision USB3/GigE cameras support in Media Blocks SDK .Net and Video Capture SDK .Net
15.9¶
- [X-engines] Resolved wrong aspect ratio with video resize effect/block
- [X-engines] Updated GStreamer redist
- [X-engines] Added Basler USB3/GigE cameras support in Media Blocks SDK .Net and Video Capture SDK .Net
- [Video Edit SDK .Net] VideoEditCoreX: The TextOverlay class changed to use SkiaSharp-based font settings. Additionally, you can set the custom font file name or configure all rendering parameters using custom SKPaint.
- [Windows] Added Stream support in
MediaInfoReader. You can get the video/audio file information from a stream (DB, network, memory, etc.). - [X-engines] Updated Live Video Compositor engine, which improved support of the file sources
- [Video Capture SDK .Net] Added camera-covered detector into the
Computer Vision Demoand theVisioForge.Core.CVpackage - [X-engines] Added API to get snapshots from video files using MediaInfoReaderX: GetFileSnapshotBitmap, GetFileSnapshotSKBitmap, GetFileSnapshotRGB
- [X-engines] iOS support in MAUI samples
- [X-engines] Resolved memory leak issue for RTSP sources
- [Media Player SDK .Net] MediaPlayerCore: Added support for data streams in video files using the FFMPEG source engine. Add the OnDataFrameBuffer event to get data frames (KLV or other) from the video file.
- [Video Capture SDK .Net] VideoCaptureCore: Added support for data streams in video files using the IP Capture FFMPEG source engine. Add the OnDataFrameBuffer event to get data frames (KLV or other) from the MPEG-TS UDP network stream or other supported source.
- [Video Capture SDK .Net] VideoCaptureCore: Added the FFMPEG_CustomOptions property to the IPCameraSourceSettings class. This property allows you to set custom FFMPEG options for the IP camera source
- [Windows] Fixed the hang problem with the FFMPEG source when a network connection is lost
- [Media Blocks SDK .Net] Added RTSP MultiView in Sync Demo
- [X-engines] Added support for FLIR/Teledyne cameras (USB3Vision/GigE) using the Spinnaker SDK
- [Video Edit SDK .Net] VideoEditCoreX: Added support for .Net Stream usage as an input source
- The IAsyncDisposable interface was added to all SDK's core classes. The
DisposeAsynccall should be used to dispose of the core objects using async methods. - [Video Capture SDK .Net] VideoCaptureCoreX: Resolved issues with Android video capture (sometimes started only one time)
- [Media Blocks SDK .Net] Added HLS streaming sample
- [Video Capture SDK .Net] VideoCaptureCore: Resolved crash if the
multiscreenis enabled and screens added as window's handles (WinForms) - [X-engines] Improved MAUI video rendering speed
- [X-engines] Resolved MAUI media playback issues (decoding) in MAUI Android
- [X-engines] Resolved an issue with the H264 webcam sources (sometimes not connected)
- [X-engines] Resolved an issue with audio stream playback in the Live VideoCompositor engine
- [Media Blocks SDK .Net] Resolved a bad audio issue while mixing using the Live Video Compositor engine
- [Media Blocks SDK .Net] Added Decklink output and file source into the Live Video Compositor sample
- [Media Player SDK .Net] MediaPlayerCore: Added growing MPEG-TS file support for the VLC engine. You can play growing MPEG-TS files while it's recorded
15.8¶
- [X-engines] [API breaking change] DeviceEnumerator can now be used only by using
DeviceEnumerator.Sharedproperty. One enumerator per app is required. DeviceEnumerator objects used by API have been removed - [X-engines] [API breaking change] Android Activity is not required anymore to create SDK engines
- [X-engines] [API breaking change] X-engines require additional initialization and de-initialization steps. To initialize SDK, use the
VisioForge.Core.VisioForgeX.InitSDK()call. To de-initialize SDK, use theVisioForge.Core.VisioForgeX.DestroySDK()call. You need to initialize SDK before any SDK class usage and de-initialize SDK before the application exits. - [Windows] Improved MAUI video rendering performance in Windows
- [Windows] Added a mouse highlight for screen capture sources
- [Windows] Resolved a CallbackOnCollectedDelegate call issue with the BasicWindow class
- [Avalonia] Resolved an issue with Avalonia VideoView resize
- [X-engines] Added the StartPosition and StopPosition properties to UniversalSourceSettings. You can use these properties to set the start and stop positions for the file source.
- [ALL] Resolved the issue with passwords with special characters used for RTSP sources
- [ALL] Resolved the rare video flip issue with the Virtual Camera SDK engine
- [ALL] The VisioForge MJPEG Decoder filter was removed from the SDK's NuGet packages. You can optionally add it to your project by file copying or COM registration deployment.
- [X-engines] Fixed memory leak in the OverlayManager
- [Media Blocks SDK .Net] Resolved issue with the VideoSampleGrabberBlock, SetLastFrame option
- [Video Capture SDK .Net] VideoCaptureCoreX: WASAPI and WASAPI2 audio sources can be used now with the VideoCaptureCoreX engine
- [X-engines] DeviceEnumerator got events to notify about devices added/removed: OnVideoSourceAdded, OnVideoSourceRemoved, OnAudioSourceAdded, OnAudioSourceRemoved, OnAudioSinkAdded, OnAudioSinkRemoved
- [X-engines] Added custom error handler support for MediaBlocks, VideoCaptureCoreX, and MediaPlayerCoreX engines. Use the IMediaBlocksPipelineCustomErrorHandler interface and the SetCustomErrorHandler method to set a custom error handler.
- [Video Capture SDK .Net] VideoCaptureCoreX: Resolved issue with incorrect device index error for KS video sources (Windows)
- [Video Capture SDK .Net] VideoCaptureCore: Added Virtual_Camera_Output_AlternativeAudioFilterName property to set a custom audio filter for the Virtual Camera SDK output
- [Video Edit SDK .Net] VideoEditCore: Added Virtual_Camera_Output_AlternativeAudioFilterName property to set a custom audio filter for the Virtual Camera SDK output
- [Media Player SDK .Net] MediaPlayerCore: Added Virtual_Camera_Output_AlternativeAudioFilterName property to set a custom audio filter for the Virtual Camera SDK output
- [Video Capture SDK .Net] VideoCaptureCoreX: Added NDI streaming support and sample app.
- [Media Blocks SDK .Net] Added the BufferSink block to get video/audio frames from the pipeline
- [Media Blocks SDK .Net] Added the CustomMediaBlock class to create custom media blocks for any GStreamer element
- [Media Blocks SDK .Net] Added the UpdateChannel method to update the channel of the bridge source or sink
- [Media Player SDK .Net] MediaPlayerCore: Updated Tempo effect.
- [X-engines] Updated device enumerator. Removed unwanted firewall dialog when listing NDI sources.
- [X-engines] Fixed an issue with the video mixer when adding/removing video sources.
- [Media Blocks SDK .Net] Added VideoCropBlock and VideoAspectRatioCropBlock blocks to crop video frames.
- [Media Blocks SDK .Net] Resolved wrong frame rate issue with VideoRateBlock.
- [All] Resolved an issue with the Tempo audio effect.
- [Video Capture SDK .Net] VideoCaptureCore: Added WASAPI audio renderer support for the VideoCaptureCore engine.
15.7¶
- [ALL] .Net 8 support
- [Video Capture SDK .Net] VideoCaptureCore: Fixed problem with the OnNetworkSourceDisconnect event being called twice.
- [X-engines] Added the MPEG-2 video encoder.
- [X-engines] Added the MP2 audio encoder.
- [X-engines] Resolved Decklink enumeration issues.
- [X-engines] Default VP8/VP9 settings changed to live recording.
- [X-engines] Added DNxHD video encoder support.
- [Video Capture SDK .Net] VideoCaptureCoreX: Fixed problem with audio source format setting (regression).
- [Video Capture SDK .Net] VideoCaptureCoreX: Resolved WPF native rendering issue with a pop-up window.
- [All] Avalonia 11.0.5 support.
- [Video Capture SDK .Net] VideoCaptureCoreX: Resolved licensing issues.
- [Video Capture SDK .Net] VideoCaptureCore: Start/StartAsync method will return false if the video capture device is already used by another application.
- [All] Updated VLC source (libVLC 3.0.19).
- [All] Updated FFMPEG sources and encoders. Resolved issue with missed MSVC dependencies.
- [Video Capture SDK] Updated ONVIF engine.
- [Cross-platform SDKs] Updated Decklink source. Resolved the issue with the incorrect device name.
- [All] SkiaSharp security updates.
- [Cross-platform SDKs] Updated Overlay Manager. Added OverlayManagerDateTime class to draw current date time and custom text.
- [Cross-platform SDKs] Updated OverlayManagerImage. Resolved issue with System.Drawing.Bitmap usage.
- [ALL] VideoCaptureCore: Resolved rare crash issue with WinUI VideoView
- [Video Capture SDK .Net] VideoCaptureCore: Updated FFMPEG.exe output. Improved support of x264 and x265 encoders of custom FFMPEG builds.
15.6¶
- [Video Capture SDK .Net] VideoCaptureCore: Improved video crop performance on modern CPUs
- [ALL] VideoCaptureCore, MediaPlayerCore, VideoEditCore: Added the static CreateAsync method that can be used instead of the constructor to create engines without UI lag.
- [Video Capture SDK .Net] VideoCaptureCore: Resolved issues with video crop.
- [Video Capture SDK .Net] VideoCaptureCoreX: Added video overlays API. The Overlay Manager Demo shows how to use it.
- [Video Capture SDK .Net] Improved HW encoder detection. If you have several GPUs, sometimes only the major GPU can be used for video encoding.
- [Cross-platform SDKs] Updated Avalonia VideoView. Resolved issue with VideoView recreation.
- [Media Player SDK .Net] MediaPlayerCoreX: Resolved startup issue with the Android version of the MediaPlayerCoreX engine.
- [Media Player SDK .Net] MediaPlayerCore: Video_Stream_Index property has been replaced with Video_Stream_Select/Video_Stream_SelectAsync methods.
- [Media Player SDK .Net] MediaPlayerCoreX: Added Video_Stream_Select method.
- [Video Capture SDK .Net] VideoCaptureCore: Network_Streaming_WMV_Maximum_Clients property moved to WMVOutput class. You can set the maximum number of clients for network WMV output.
- [All] Updated WPF rendering. Improved performance for 4K and 8K videos.
- [Video Capture SDK .Net] VideoCaptureCoreX: Resolved issue with multiple outputs used.
- [Video Capture SDK .Net] VideoCaptureCoreX: Resolved issue with OnAudioFrameBuffer event.
- [Video Capture SDK .Net] Decklink source changed to improve startup speed. The Decklink_CaptureDevices method has been replaced by async Decklink_CaptureDevicesAsync.
- [Media Player SDK .Net] MediaPlayerCoreX: Added Custom_Video_Outputs/Custom_Audio_Outputs properties to set custom video/audio renderers
- [Media Player SDK .Net] MediaPlayerCoreX: Added Decklink Output Player Demo (WPF)
- [Video Edit SDK .Net] Added Multiple Audio Tracks Demo (WPF)
- [Video Edit SDK .Net] Updated MP4 output for multiple audio tracks
- [Cross-platform SDKs] Updated device enumerator
- [Video Capture SDK .Net] Resolved issue with VU meter in cross-platform engine
- [Cross-platform SDKs] Resolved issue with VU Meter (event not fired)
- [Media Player SDK .Net] Updated memory playback
- [ALL] Added IAsyncDisposable interface support for cross-platform core classes. It should be used to dispose of the core objects in async methods.
- [Video Capture SDK .Net] Added madVR support for mutiscreen
- [Video Capture SDK .Net] Resolved NDI enumerating issue in the VideoCaptureCore engine
- [Media Player SDK .Net] Added madVR Demo
- [Video Capture SDK .Net] Added madVR Demo
- [ALL] Resolved madVR issues in all SDKs
- [Media Blocks SDK .Net] Added NDI Source demo
- [Video Capture SDK .Net] Added NDI support for cross-platform engine
- [ALL] Resolve the "image not found" issue with the WinUI NuGet package
- [Media Blocks SDK .Net/Media Player SDK .Net (cross-platform)] Added MP3+CDG Karaoke Player demo
- [Media Blocks SDK .Net] Added CDGSourceBlock for MP3+CDG karaoke files playback
- [ALL] Improved madVR support
- WinUI VideoView updated to fix issues during audio file playback
- [Video Capture SDK .Net] Improved VNC source support for the VideoCaptureCoreX engine.
- [Video Capture SDK .Net] Added VNC source support for the VideoCaptureCoreX engine. You can use VNCSourceSettings class to configure Video_Source.
- [Media Blocks SDK .Net] Added VNC source support. You can use the VNCSourceBlock class as a video source block.
- [Video Capture SDK .Net] Video_Resize property has been changed to IVideoResizeSettings type. You can use the VideoResizeSettings class to perform classic resize the same as before or use MaxineUpscaleSettings/MaxineSuperResSettings to perform AI resizing on Nvidia GPU using Nvidia Maxine SDK (SDK or SDK models are required to deploy).
- [ALL] Resolved issues with NDI source detection in the local network
- [ALL] Added KLVParser class to read and decode data from KLV binary files.
- [ALL] Added KLVFileSink block. You can export KLV data from MPEG-TS files.
- [Media Blocks SDK .Net] Added KLV demo.
- [Video Capture SDK .Net] Added MJPEG network streamer.
- [ALL] Added WASAPI 2 support.
- [Media Blocks SDK .Net] Updated Video Effects API. Added Grayscale media block.
- [Media Blocks SDK .Net] Added Live Video Compositor API and sample.
- [ALL] Updated Avalonia VideoView control. Resolved issues with video playback on Windows on HighDPI displays.
- [Video Capture SDK .Net] Added CustomVideoFrameRate property to MFOutput. You can set a custom frame rate if your source provides an incorrect frame rate (IP camera, for example).
- [Video Capture SDK .Net] Updated NVENC encoder. Resolved issue with high-definition video capture.
- [Video Capture SDK .Net] Resolved issue with TV Tuning on Avermedia devices
- [Media Blocks SDK .Net] Added OpenCV blocks: CVDewarp, CVDilate, CVEdgeDetect, CVEqualizeHistogram, CVErode, CVFaceBlur, CVFaceDetect, CVHandDetect, CVLaplace, CVMotionCells, CVSmooth, CVSobel, CVTemplateMatch, CVTextOverlay, CVTracker
- [CV] Resolved the issue with wrong face coordinates.
- [CV, Media Blocks SDK .Net] Added Face Detector block.
- [Media Blocks SDK .Net] Added rav1e AV1 video encoder.
- [Media Blocks SDK .Net] Added GIF video encoder.
- [Media Blocks SDK .Net] Added NDI Sink and NDI source blocks.
- [ALL] Resolved NDI SDK detection issues.
- [Media Blocks SDK .Net] Updated Speex encoder.
- [Media Blocks SDK .Net] Updated Video Mixer block.
- [ALL] Added Save/Load methods for output format to serialize into JSON.
- [Media Blocks SDK .Net] Added MJPEG HTTP Live streaming sink block.
- [ALL] Resolved MP4 HW QSV H264 regression.
- [ALL] WinForms and WPF VideoView stability updates.
- [Media Player SDK .Net] Removed FilenamesOrURL legacy property. Please use the
PlaylistAPI instead. - [Media Blocks SDK .Net] Added fade-in/out feature for image overlay block.
- [ALL] Telemetry update
- [ALL] SDKs updated to use the
ObservableCollectioninstead of theListin public API. - [ALL] Updated MP4 HW output. Improved NVENC performance.
- [Media Blocks SDK .Net] Added Video Compositor sample.
- [Media Blocks SDK .Net] Added YouTubeSink and FacebookLiveSink blocks with custom YouTube/Facebook configurations. The
RTMPSinkcan stream to YouTube/Facebook in the same way as before. - [Media Blocks SDK .Net] Added SqueezeBack video mixer block.
- [ALL] Updated scrolling text logo. We've added the Preload method to render a text overlay before playback.
- [ALL] Updated scrolling text logo (performance)
- [Media Blocks SDK .Net] Updated Decklink sink blocks
- [ALL] Resolved crashes with a text logo with a custom resolution
- [Media Blocks SDK .Net] Added Intel QuickSync H264, HEVC, VP9, and MJPEG encoders support.
- [Video Edit SDK .Net] Added FastEdit_ExtractAudioStreamAsync method to extract the audio stream from the video file.
- [Video Edit SDK .Net] Added "Audio Extractor" WinForms sample.
- [Media Blocks SDK .Net] Updated MP4SinkBlock. The sink can split output files by duration, file size, or timecode. Use MP4SplitSinkSettings instead of MP4SinkSettings to configure.
- [Video Capture SDK .Net] Added the OnMJPEGLowLatencyRAWFrame event that fired when the MJPEG low latency engine received a RAW frame from a camera.
- [Media Blocks SDK .Net] Added VideoEffectsBlock to use video effects, available in Windows SDKs
- [Media Blocks SDK .Net] Updated Decklink source
- [Media Blocks SDK .Net] Added Decklink Demo (WPF)
- [ALL] Resolved the DeinterlaceBlend video effect crash
- [ALL] Used 3rd-party libraries moved to VisioForge.Libs.External assembly/NuGet
- [ALL] Added Nvidia Maxine Video Effects SDK (BETA) and sample app for Media Player SDK .Net and Video Capture SDK .Net
- [Video Capture SDK .Net] Added Decklink_Input_GetVideoFramesCount/Decklink_Input_GetVideoFramesCountAsync API to get total and dropped frames for the Decklink source
- [ALL] VisioForge HW encoders update
15.5¶
- .Net 7 support
- Added NetworkDisconnect event support to MJPEG Low Latency IP camera engine
- Added Linux support for the VideoEditCoreX-based demos
- Added OnRTSPLowLatencyRAWFrame event to get RAW frames from RTSP stream, using RTSP Low Latency engine
- Added AutoTransitions property to the VideoEditCoreX engine
- System.Drawing.Rectangle and System.Drawing.Size types are replaced by VisioForge.Types.Rectangle and VisioForge.Types.Size in all crossplatform APIs
- MAUI samples (BETA) are added
- Improved compatibility with Snap Camera for MP4 HW encoding
- Online licensing updated
- Added Camera Light demo
- Added segments support in Media Player SDK .Net (Cross-platform engine)
- Added Playlist API in Media Player SDK .Net (Windows-only engine)
- Resolved issues with the "rtsp_source_create_audio_resampler" call in the RTSP Low Latency engine in Video Capture SDK .Net (Windows-only engine)
- Added support for multiple Decklink outputs in Video Capture SDK .Net and Video Edit SDK .Net (Windows-only engine)
- Resolved issues with the reverse playback engine in Media Player SDK .Net (Windows-only engine)
- ONVIFControl and other ONVIF-related APIs are available for all platforms
- API breaking change: the frame rate changed from double to VideoFrameRate in all APIs
- Added GPU HW decoding for VLC engine
- Resolved issue with WPF HighDPI apps that use EVR
- Resolved issue with MediaPlayerCore.Video_Renderer_SetCustomWindowHandle method
- Added previous frame playback in Media Player SDK .Net (Cross-platform engine)
- Added WPF Screen Capture Demo to Media Blocks SDK .Net
15.4¶
- Resolved an issue with ignored Play_PauseAtFirstFrame property
- Updated HighDPI support in WinForms samples
- Resolved an issue with HighDPI support for the Direct2D video renderer
- Added additional API to ONVIFControl class: GetDeviceCapabilities, GetMediaEndpoints
- Resolved forced reencoding issue with FFMPEG files joining without reencoding
- Sentry update
- Added video interpolation settings for Zoom and Pan video effects
- Added GtkSharp UI framework support for video rendering
- FastEdit API has been changed to async
- Resolved screen flip issue with Video_Effects_AllowMultipleStreams property of Video Capture SDK .Net core
- Updated RTSP MultiView demo (added GPU decoding, added RAW stream access)
- Added OnLoop event into Media Player SDK .Net
- Added Loop feature into Media Blocks SDK .Net
- Avalonia VideoView was downgraded to 0.10.12 because of Avalonia UI problems with NativeControl
- Added File Encryptor demo for Video Edit SDK .Net
15.3¶
- App start-up time improved for PCs with Decklink cards
- NDI SDK v5 support
- Resolved an issue with MKV Legacy output (wrong cast exception).
- Zoom and pan effects performance optimizations
- Added basic Media Blocks API (WIP)
- Added HLS network streaming to Video Edit SDK .Net
- Added Rotate property to WPF VideoView. You can rotate the video by 90, 180, or 270 degrees. Also, you can use the GetImageLayer() method to get the Image layer and apply custom transforms
- API change - FilterHelpers renamed to FilterDialogHelper
- VisioForge.Types and VisioForge.MediaFramework assemblies merged into VisioForge.Core
- UI classes moved to VisioForge.Core.UI.* assemblies and independent NuGet packages
- VisioForge.Types renamed to VisioForge.Core.Types
- VisioForge.Core no longer depends on the Windows Forms framework
15.2¶
- Added HorizontalAlignment and VerticalAlignment properties to the text and image logos
- Updated ONVIF support, resolved an issue with username and password specified in URL but not specified in source settings
- Resolved an issue with the FFMPEG.exe output dialog
- Resolved an issue with the separate capture in a service applications
- SDK migrated to System.Text.Json from NewtonsoftJson
- Updated DirectCapture output for IP cameras
- Video processing performance optimizations
- IPCameraSourceSettings.URL property type changed from string to a
System.Uri - Added DirectCapture ASF output for IP cameras
15.1¶
- Disabled Sentry debug messages in the console
- Added Icecast streaming
- VideoStreamInfo.FrameRate property type changed to VideoFrameRate (with numerator and denominator) from double
- Updated WPF VideoView, resolved the issue for IP camera stream playback
- API breaking change:
VisioForge.Controls,VisioForge.Controls.UI,VisioForge.Controls.UI.Dialogs, andVisioForge.Toolsassemblies are merged inside theVisioForge.Coreassembly - Audio effect API now uses string name instead of index
- Added Android support in Media Player SDK .Net
- Added a new GStreamer-based cross-platform engine to support Windows and other platforms within the v15 development cycle
15.0¶
- Added StatusOverlay property for VideoCapture class. Assign the
TextStatusOverlayobject to this property to add text status overlay, for example, to show "Connecting..." text during IP camera connecting. - RTSP Live555 IP camera engine has been removed. Please use RTSP Low Latency or FFMPEG engines.
- Resolved SDK_Version possible issue.
- Added Settings_Load API. You can load the settings file saved by Settings_JSON. Be sure that device names are correct.
- Resolved issue with an exception if separate capture started before Start/StartAsync method call.
- RTP support for the VLC source engine.
- API breaking change: SDK_State property has been removed. We do not have TRIAL and FULL SDK versions anymore.
- API breaking change: DirectShow_Filters_Show_Dialog, DirectShow_Filters_Has_Dialog, Audio_Codec_HasDialog, Audio_Codec_ShowDialog, Video_Codec_HasDialog, Video_Codec_ShowDialog, Filter_Supported_LAV, Filter_Exists_MatroskaMuxer, Filter_Exists_OGGMuxer, Filter_Exists_VorbisEncoder, Filter_Supported_EVR, Filter_Supported_VMR9 and Filter_Supported_NVENC has been moved to VisioForge.Tools.FilterHelpers class.
- The
VFAudioStreamInfo/VFVideoStreamInfoclasses use theTimespanfor the duration. - Decklink types from VisioForge.Types assembly moved to VisioForge.Types.Decklink namespace.
- Telemetry updated.
- Custom redist loader updated.
- NDI update.
- API breaking change: The
Statusproperty was renamed to theState. The property type isPlaybackStatein all SDKs. - API breaking change: UI controls split into Core (VideoCaptureCore, MediaPlayerCore, VideoEditCore) and VideoView.
- API breaking change: Video_CaptureDevice... properties merged into Video_CaptureDevice property of VideoCaptureSource type.
- API breaking change: Audio_CaptureDevice... properties merged into Audio_CaptureDevice property of AudioCaptureSource type.
- API breaking change: In the Media Player SDK, the
Source_StreamAPI properties were merged into theSource_MemoryStreamproperty of theMemoryStreamSourcetype - Updated DVD playback
- Updated FFMPEG source
- API breaking change: Media Player SDK types moved from VisioForge.Types namespace to VisioForge.Types.MediaPlayer
- API breaking change: Video Capture SDK types moved from VisioForge.Types namespace to VisioForge.Types.VideoCapture
- API breaking change: Video Edit SDK types moved from VisioForge.Types namespace to "VisioForge.Types.VideoEdit"
- API breaking change: Output types moved from VisioForge.Types namespace to VisioForge.Types.Output
- API breaking change: Video Effects types moved from VisioForge.Types namespace to VisioForge.Types.VideoEffects
- API breaking change: Audio Effects types moved from VisioForge.Types namespace to VisioForge.Types.AudioEffects
- API breaking change: Event types moved from VisioForge.Types namespace to VisioForge.Types.Events
- Added Video_Renderer_SetCustomWindowHandle method to set custom video renderer by Win32 window/control HWND handle
14.4¶
- Windows 11 support
- Telemetry update
- Resolved issues with Picture-in-Picture in 2x2 mode
- Resolved issues with MJPEG Low Latency source in .Net 5/.Net 6/.Net Core 3.1
- Resolved issue with UDP network streaming for Decklink source
- VFMP4v11Output renamed to VFMP4HWOutput
- Added Microsoft H265 encoder support
- Added Intel QuickSync H265 encoder support
- Added OnDecklinkInputDisconnected/OnDecklinkInputReconnected events
- Updated Decklink output
- Resolved issues with Separate capture for MP4 HW, MOV, MPEG-TS, and MKVv2 outputs
- Added Video_CaptureDevice_CustomPinName property. You can use this property to set a custom output pin name for a video capture device with several output video pins
- Custom redist configuration updated
- Updated IP camera RTSP Low Latency engine
14.3¶
- An issue with Video Resize filter creation for NuGet redists has been resolved
- Telemetry update
- Updated VFDirectCaptureMP4Output output
- .Net 6 (preview) support
- Nvidia CUDA removed. NVENC is a modern alternative and is available for H264/HEVC encoding.
- IP camera MJPEG Low Latency engine has been updated
- The NDI source listing has been updated
- Improved ONVIF support
- Added .Net Core 3.1 support for RTSP Low Latency source engine
- Resolved issues with Picture-in-Picture for 2x2 mode
- Split project and solutions by independent files for .Net Framework 4.7.2, .Net Core 3.1, .Net 5 and .Net 6
14.2¶
- An issue with audio stream capture with enabled Virtual Camera SDK output was resolved
- VFMP4v8v10Output was replaced with VFMP4Output
- The "CanStart" method was added for Video_CaptureDevices items. The method returns true if the device can start and is not used exclusively in another app
- Added async/await API to the ONVIFControl
- An issue with wrong ColorKey processing in the Text Overlay video effect was resolved
- Added forced frame rate support for the RTSP Low Latency IP camera source
- MP4v11 AMD encoders were updated
- The timestamp issue that happened during the MP4v11 separate capture pause/resume was resolved
- FFMPEG.exe network streaming update
- FFMPEG output was updated to the latest FFMPEG version
- VC++ redist is no longer required to be installed. VC++ linking changed to static (except optional XIPH output)
- Many base DirectShow filters moved to the VisioForge_BaseFilters module
14.1¶
- Added WPF VideoView control. You can push video frames from the OnVideoFrameBuffer event to control to render them
- Correct default transparency value for a text logo
- ONVIF support added to .Net 5 / .Net Core 3.1 builds
- Added IP_Camera_ONVIF_ListSourcesAsync method to discover ONVIF cameras in the local network
- (BREAKING API CHANGE) Changed video capture device API for frame rates enumerating to support modern 4K cameras
- Updated MJPEG Decoder (improved performance)
- Removed MP4 v8 legacy encoders
- INotifyPropertyChanged support in WinForms/WPF wrappers to provide MVVM application support
- Resolved issue with RTMPS streaming to Facebook
- IP camera source added to the TimeShift demo
- Added separate output support for MOV
- Added fast-start FFMPEG flag for MP4v11 output that used FFMPEG MP4 muxer
- Added GPU decoding for the IP Camera source in demo applications
- Added CustomRedist_DisableDialog property to disable the redist message dialog
- Removed Kinect assemblies and demos. Please contact us if you still need Kinect packages
- MP4v10 default profile has been changed to Baseline / 5.0 for better browser compatibility
14.0¶
- .Net 5.0 support
- Resolved issue with not visible Decklink sources in NuGet SDK version
- Resolved issue with device added/removed notifier
- Added alternative NDI source in Video Capture SDK .Net
- Added NDI streaming (server) in Video Capture SDK .Net
- Resolved Separate Capture usage issue for NuGet deployment
- Resolved issue with merged text/image logos
- Updated device notifier
- Added CameraPowerLineControl class to control webcam power line frequency option
- Legacy audio effects have been removed.
- Removed HTTP_FFMPEG, RTSP_UDP_FFMPEG, RTSP_TCP_FFMPEG and RTSP_HTTP_FFMPEG from VFIPSource enumeration. You can use the Auto_FFMPEG value
- Updated HLS server. Correct error reporting about used port
- Added NDI streaming (server) in Video Edit SDK .Net
- Added NDI streaming (server) in Media Player SDK .Net
- Added IP_Camera_CheckAvailable method in Video Capture SDK .Net
- Updated FFMPEG Source filter, more supported codecs, and added GPU decoding
12.1¶
- Migrated to .Net 4.6
- Added Debug_DisableMessageDialogs property to disable error dialog if OnError event is not implemented.
- Fixed issue with resizing on the pause for WPF controls.
- Updated ONVIF engine in Video Capture SDK .Net
- Updated What You Hear source in Video Capture SDK .Net
- Added OnPause/OnResume events
- Updated YouTube demo in Media Player SDK .Net
- Improved support of webcams with integrated H264 encoder in Video Capture SDK .Net
- Updated VLC source
- Removed unwanted warning in MP4 v11 output
- One installer for TRIAL and FULL versions
- Same NuGet packages for TRIAL and FULL versions
- .Net Core NuGet packaged merged with .Net Framework package
- Added NuGet redists. Deployment was never so simple!
12.0¶
- Async / await API for all SDKs
- Breaking API change: All time-related API now uses TimeSpan instead of long (milliseconds)
- Tag reader/writer - correct logo loading for some video formats
- Removed legacy DirectX 9 video effects
- Fixed audio conversion progress issue in Video Edit SDK .Net
- Improved .Net Core compatibility
- Virtual Camera SDK output added to Media Player SDK .Net (as one of the video renderers)
- NewTek NDI devices support added to Video Capture SDK .Net as a new engine for IP cameras
- Added Video_Effects_MergeImageLogos and Video_Effects_MergeTextLogos properties. If you have three or more logos, you can set these properties to true to optimize video effects' performance
- Added playlist type option for HLS network streaming
- Added integrated lightweight HTTP server for HLS network streaming
- Added VR 360° video support in Media Player SDK .Net
- Improved DirectX 11 video processing
- Added MPEG-TS AAC-only no video support for MPEG-TS output
- Improved What You Hear audio source
- Several new demo applications
- Improved MP4 v11 output
- Separate capture for MP4 v11 can split files without frame lose
- Many minor bugfixes
- .Net Core assemblies updated to .Net Core 3.1 LTS
- Updated demos repository on GitHub
11.4¶
- Added ASP.Net MVC video conversion demo app to Video Edit SDK .Net
- Alternative OSD implementation to handle Windows 10 changes
- Updated GPU video effects
- Updated memory source in Media Player SDK .Net
- Updated OSD API
- Resolved issues with video encryption using binary keys
- Update screen capture demos for Video Capture SDK .Net, added window selection to capture. You can capture any window, including windows in the background
- Mosaic effect added for Computer Vision demo in Video Capture SDK .Net
- Added Multiple IP Cameras Demo (WPF) in Video Capture SDK .Net
- Added custom video resize option for MP4v11 output
- Merge module (MSM) redists added to all SDKs
- Updated FFMPEG.exe output using pipes instead of virtual devices
- Resolved issue with PIP custom output resolution option in Video Capture SDK .Net
- Resolved issue with file lock using LAV engine in Media Player SDK .Net
- Added DirectX11-based GPU video processing
11.3¶
- Resolved issue with audio renderer connection if Virtual Camera SDK output enabled in Video Capture SDK
- Improved subtitles support with autoloading in Media Player SDK .Net
- Updated audio fade-in/fade-out effects
- Added MIDI and KAR files support in Media Player SDK .Net
- Added CDG karaoke files support (and new demo application) in Media Player SDK .Net
- Added Async playback in Media Player SDK .Net
- Updated integrated JSON serializer
- Added optional GPU decoding in Media Player SDK .Net. Available decoding engines: DXVA2, Direct3D 11, nVidia CUVID, Intel QuickSync
- Added .Net Core 3.0 support, including WinForms and WPF demo apps (Windows only)
11.2¶
- Added Loop property to Video Edit SDK .Net
- Updated audio enhancer
- Updated RTSP Low Latency source
- Resolved crop issue for Decklink source
- Added property to use TCP or UDP in RTSP Low Latency engine
- Deployment without COM registration and admin rights for Video Edit SDK and Media Player SDK (BETA)
- Updated video mixer with improved performance
- Added YouTube playback code snippet
- Added method to move OSD
11.1¶
- Fixed seeking issue with some MP4 files in Video Edit SDK
- Fixed stretch/letterbox issue in the WPF version of all SDKs
- Fixed issue with an equalizer on sample rate 16000 or less
- Fixed problem with sample grabber for DirectShow source in Media Player SDK
- Fixed encrypted files playback in Media Player SDK
- Added DVDInfoReader class to read info about DVD files
- Resolved issue with wrong file name in OnSeparateCaptureStopped event
- Improved barcode detection quality for rotated images
- The minimal .Net Framework version is .Net 4.5 now
- Improved YouTube playback in Media Player SDK. Added OnYouTubeVideoPlayback event to select video quality for playback
- Added the
Play_PauseAtFirstFrameproperty to the Media Player SDK .Net. If true playback will be paused on the first frame - Multiple screen support in Screen Capture demo in Video Capture SDK .Net
- Resolved issue with network stream playback in Media Player SDK .Net WPF applications
- Added low latency HTTP MJPEG stream playback (IP cameras or other sources) in Video Capture SDK .Net
- Added Fake Audio Source DirectShow filter, which produces a tone signal
- Updated Computer Vision demo in Video Capture SDK .Net
- Added Frame_GetCurrentFromRenderer method to all SDKs. Using this method, you can get the currently rendered video frame directly from the video renderer.
- Added low latency RTSP source playback in Video Capture SDK .Net
11.0¶
- Fixed bug with MP4 v11 output, custom GOP settings
- Updated MJPEG Decoder
- Fixed bug with MP4 v11 output. Added Windows 7 full support
- OnStop event of Video Edit SDK returns a successful status
- Video Capture SDK Main Demo update - multiscreen can automatically use connected external displays
- Media Player SDK Main Demo update - multiscreen can automatically use connected external displays
- Added fade-in / fade-out for text logo
- Updated Decklink output
- Video Edit SDK can fast-cut files from network sources (HTTP/HTTPS)
- Added Computer Vision demo, with cars/pedestrian counter and face/eyes/nose/mouth detector/tracker
- Updated MP4 output to use alternative muxer that provides constant frame rate
- Added MPEG-TS output
- Added MOV output