%{ name: :mob_video, mob_version: "~> 0.7", plugin_spec_version: 1, description: "On-device video processing (clip/probe/thumbnail/extract-audio) via the platform toolkits", # A sample screen the host can navigate to by route. Pure-Elixir + # hot-pushable; drop it and this entry in a real app that builds its own UI. screens: [ %{module: MobVideo.DemoScreen, default_route: "/mob_video/demo"} ], nifs: [ # iOS: Objective-C NIF driving AVFoundation. lang: :objc -> compiled as ObjC # (.m) with -fobjc-arc; platform: :ios so it isn't pulled into the Android # build. %{module: :mob_video_nif, native_dir: "priv/native/ios", lang: :objc, platform: :ios}, # Android: zig NIF bridging to MediaExtractor/MediaMuxer/MediaMetadataRetriever # via the Kotlin MobVideoBridge. platform: :android so the iOS build skips it. %{module: :mob_video_nif, native_dir: "priv/native/jni", lang: :zig, platform: :android} ], # No runtime permission *capability* is registered: processing a file the app # can already read needs none. Obtaining a gallery path is mob_photos' job # (request :photos there); this plugin only consumes a local path. permissions: [], android: %{ bridge_kt: "priv/native/android/MobVideoBridge.kt", bridge_class: "io.mob.video.MobVideoBridge", # Manifest-merged so a screen handed a shared-store gallery path can read it # (Android 13+). All the codecs/muxers are framework — no gradle deps. permissions: ["android.permission.READ_MEDIA_VIDEO"] }, ios: %{ frameworks: ["AVFoundation", "CoreMedia", "CoreGraphics", "ImageIO", "MobileCoreServices"] } }