[vlc-devel] [PATCH] bin: add iosvlc.m for iOS development

Alexandre Janniaux ajanni at videolabs.io
Mon May 11 09:22:58 CEST 2020


Hi,

Is it ok if I add a non-embedded window provider afterwards?

Should I move the code to a different location?

Regards,
--
Alexandre Janniaux
Videolabs

On Wed, May 06, 2020 at 10:51:37AM +0200, Alexandre Janniaux wrote:
> iosvlc.m provides a binary usable as an iOS application, forwarding the
> VLC arguments just like VLC on desktop. It allows easier iteration on
> vlccore development for iOS, without the need to test in a VLCKit
> application like VLC for iOS or new external application.
>
> It must be built with dynamic plugins, just like --enable-vlc require
> it already in the configure.ac file.
>
> To develop with it, you must generate a .ipa archive containing both
> the resulting binary as executable, a PkgInfo file, an Info.plist file
> describing the package and the libs (libvlc.dylib, libvlccore.dylib, and
> every plugin .dylib or additional convenience libraries that are not
> linked statically in the Frameworks/ directory. It must then be signed
> with a developer certificate allowed by Apple and provisionned with a
> mobileprovision file allowing installation on the given device for the
> same developer certificate.
>
> Then, tools like libimobiledevice can be used to start the application
> with additional arguments or environment variables. They can also be
> added in XCode through the "Edit Scheme" menu.
>
> A big part of the iOS-specific code has been originally written by
> Marvin Scholz in a more complete libVLC ios sample.
>
> Co-authored-by: Marvin Scholz <epirat07 at gmail.com>
> ---
>  bin/Makefile.am |  10 ++++-
>  bin/iosvlc.m    | 111 ++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 120 insertions(+), 1 deletion(-)
>  create mode 100644 bin/iosvlc.m
>
> diff --git a/bin/Makefile.am b/bin/Makefile.am
> index 699fbd4bf0b..b752d968588 100644
> --- a/bin/Makefile.am
> +++ b/bin/Makefile.am
> @@ -5,10 +5,19 @@ if HAVE_OSX
>  bin_PROGRAMS = vlc-osx
>  noinst_PROGRAMS = vlc-osx-static
>  else
> +if HAVE_IOS
> +vlc_ios_SOURCES = iosvlc.m
> +vlc_ios_LDFLAGS = $(LDFLAGS_vlc) -Wl,-framework,Foundation,-framework,UIKit
> +vlc_ios_LDFLAGS += -Xlinker -rpath -Xlinker "$(libdir)"
> +vlc_ios_CFLAGS = -fobjc-arc
> +vlc_ios_LDADD = ../lib/libvlc.la ../src/libvlccore.la
> +bin_PROGRAMS = vlc-ios
> +else
>  bin_PROGRAMS = vlc
>  noinst_PROGRAMS = vlc-static
>  endif
>  endif
> +endif
>  EXTRA_DIST = vlc_win32_rc.rc.in
>  CLEANFILES = vlc_win32_rc.rc
>
> @@ -70,7 +79,6 @@ vlc_osx_static_OBJCFLAGS += -F$(CONTRIB_DIR)/Frameworks
>  vlc_osx_static_CPPFLAGS = -DHAVE_BREAKPAD
>  endif
>
> -
>  #
>  # Static (debug) VLC executable
>  #
> diff --git a/bin/iosvlc.m b/bin/iosvlc.m
> new file mode 100644
> index 00000000000..f671615e602
> --- /dev/null
> +++ b/bin/iosvlc.m
> @@ -0,0 +1,111 @@
> +/*****************************************************************************
> + * iosvlc.m: iOS specific development main executable for VLC media player
> + *****************************************************************************
> + * Copyright (C) 2020 Videolabs
> + *
> + * Authors: Marvin Scholz <epirat07 at gmail dot com>
> + *          Alexandre Janniaux <ajanni at videolabs.io>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU Lesser General Public License as published by
> + * the Free Software Foundation; either version 2.1 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public License
> + * along with this program; if not, write to the Free Software Foundation,
> + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
> + *****************************************************************************/
> +
> +#ifdef HAVE_CONFIG_H
> +# include "config.h"
> +#endif
> +
> +#import <UIKit/UIKit.h>
> +#include <vlc/vlc.h>
> +
> +#include <vlc_common.h>
> +#include <vlc_variables.h>
> +#include <vlc_plugin.h>
> +
> + at interface AppDelegate : UIResponder <UIApplicationDelegate> {
> +    @public
> +    libvlc_instance_t *_libvlc;
> +    UIWindow *window;
> +}
> + at end
> +
> +
> + at implementation AppDelegate
> +/* Called after application launch */
> +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
> +{
> +    /* Set VLC_PLUGIN_PATH for dynamic loading */
> +    NSString *pluginsDirectory = [[NSBundle mainBundle] privateFrameworksPath];
> +    setenv("VLC_PLUGIN_PATH", [pluginsDirectory UTF8String], 1);
> +
> +    /* Store startup arguments to forward them to libvlc */
> +    NSArray *arguments = [[NSProcessInfo processInfo] arguments];
> +    unsigned vlc_argc = [arguments count];
> +    char **vlc_argv = (char **)malloc(vlc_argc * sizeof(char*));
> +    if (vlc_argv == NULL)
> +        return NO;
> +
> +    for (unsigned i = 0; i < vlc_argc; i++)
> +         vlc_argv[i] = [[arguments objectAtIndex:i] UTF8String];
> +
> +    /* Initialize libVLC */
> +    _libvlc = libvlc_new(vlc_argc, (const char * const*)vlc_argv);
> +    free(vlc_argv);
> +
> +    if (_libvlc == NULL)
> +        return NO;
> +
> +    /* Initialize main window */
> +    window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
> +    window.rootViewController = [UIViewController alloc];
> +    window.backgroundColor = [UIColor whiteColor];
> +    [window makeKeyAndVisible];
> +
> +    /* Start glue interface, see code below */
> +    libvlc_add_intf(_libvlc, "ios_interface,none");
> +
> +    /* Start parsing arguments and eventual playback */
> +    libvlc_playlist_play(_libvlc);
> +
> +    return YES;
> +}
> + at end
> +
> +int main(int argc, char * argv[]) {
> +    @autoreleasepool {
> +        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
> +    }
> +}
> +
> +/* Glue interface code, define drawable-nsobject for display module */
> +static int Open(vlc_object_t *obj)
> +{
> +    AppDelegate *d = (AppDelegate *)[[UIApplication sharedApplication] delegate];
> +    assert(d != nil && d->window != nil);
> +    var_SetAddress(vlc_object_instance(obj), "drawable-nsobject", d->window);
> +
> +    return VLC_SUCCESS;
> +}
> +
> +#define MODULE_NAME ios_interface
> +#define MODULE_STRING "ios_interface"
> +vlc_module_begin()
> +    set_capability("interface", 0)
> +    set_callback(Open)
> +vlc_module_end()
> +
> +/* Inject the glue interface as a static module */
> +typedef int (*vlc_plugin_cb)(vlc_set_cb, void*);
> +
> +__attribute__((visibility("default")))
> +vlc_plugin_cb vlc_static_modules[] = { vlc_entry__ios_interface, NULL };
> --
> 2.26.2
>


More information about the vlc-devel mailing list