Skip to content

iOS: Using custom instance of VLCLibrary will crash app when VLCMediaPlayer is deallocated

I'm playing around with MobileVLCKit for iOS (pre-built binary from Carthage Repo, MobileVLCKit-3.3.16.3-c3b4cefc-b4c7317a.tar.xz)

For my specific use case, I need to provide custom options to VLCLibrary to improve RTSP playback (specifically --rtsp-tcp), but I've found that no matter what I do, the app will crash when the VLCMediaPlayer is deallocated.

I originally thought I might be able to use a single shared instance for my app, something like

extension VLCLibrary {
	static let fastRTSP: VLCLibrary = {
		var options = [Any]()
		options.append("--rtsp-tcp")
		return VLCLibrary(options: options)
	}()
}

but this didn't work, so I went to using an instance per media player instead, which still didn't work

var options = [Any]()
options.append("--rtsp-tcp")
let library = VLCLibrary(options: options)
let player = VLCMediaPlayer(library: library)!
loanedPlayers.append(player)

If I just use VLCLibrary.shared() it seems to work fine, but for my needs, I really, really, really need the --rtsp-tcp option

This is the crash

MobileVLCKit`-[VLCLibrary dealloc]:
    0x100d87f28 <+0>:  sub    sp, sp, #0x30             ; =0x30 
    0x100d87f2c <+4>:  stp    x20, x19, [sp, #0x10]
    0x100d87f30 <+8>:  stp    x29, x30, [sp, #0x20]
    0x100d87f34 <+12>: add    x29, sp, #0x20            ; =0x20 
    0x100d87f38 <+16>: mov    x19, x0
    0x100d87f3c <+20>: ldr    x0, [x0, #0x20]
    0x100d87f40 <+24>: cbz    x0, 0x100d87f50           ; <+40> at VLCLibrary.m:267:9
    0x100d87f44 <+28>: bl     0x100d96744               ; libvlc_log_unset
->  0x100d87f48 <+32>: ldr    x0, [x19, #0x20]
    0x100d87f4c <+36>: bl     0x100d9586c               ; libvlc_release
    0x100d87f50 <+40>: ldr    x0, [x19, #0x8]
    0x100d87f54 <+44>: cbz    x0, 0x100d87f5c           ; <+52> at VLCLibrary.m:270:1
    0x100d87f58 <+48>: bl     0x10224947c               ; symbol stub for: fclose
    0x100d87f5c <+52>: adrp   x8, 7046
    0x100d87f60 <+56>: ldr    x8, [x8, #0xb68]
    0x100d87f64 <+60>: stp    x19, x8, [sp]
    0x100d87f68 <+64>: adrp   x8, 7045
    0x100d87f6c <+68>: ldr    x1, [x8, #0xc80]
    0x100d87f70 <+72>: mov    x0, sp
    0x100d87f74 <+76>: bl     0x102249b9c               ; symbol stub for: objc_msgSendSuper2
    0x100d87f78 <+80>: ldp    x29, x30, [sp, #0x20]
    0x100d87f7c <+84>: ldp    x20, x19, [sp, #0x10]
    0x100d87f80 <+88>: add    sp, sp, #0x30             ; =0x30 
    0x100d87f84 <+92>: ret

A GitHub project containing my (crazy) experimentation; https://github.com/RustyKnight/TestVLCMore. Sorry the MobileVLCKit framework is not included, to large, but I pulled it form https://download.videolan.org/cocoapods/prod/MobileVLCKit-3.3.16.3-c3b4cefc-b4c7317a.tar.xz (Carthage reference) and unpacked it myself

I'd love to know if there is something "obvious" which I'm doing wrong here, as it's been driving me crazy

To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information