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

Alexandre Janniaux ajanni at videolabs.io
Fri May 22 11:47:36 CEST 2020


Hi !

Ping :) I'd like to move forward to packaging and get back on
the vout modules and build script after that.

Regards,
--
Alexandre Janniaux
Videolabs

On Mon, May 11, 2020 at 09:22:58AM +0200, Alexandre Janniaux wrote:
> 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
> >
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list