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

Alexandre Janniaux ajanni at videolabs.io
Wed May 6 14:25:05 CEST 2020


Hi,

On Wed, May 06, 2020 at 03:10:52PM +0300, Rémi Denis-Courmont wrote:
> Hi,
>
> That looks more like a bug to me. Why is there no stand-alone provider to begin with? That should be even more useful on mobile platforms, where full screen is most common, and embedded video is least useful.
>
> And on the other hand, you could make the same point for all platforms anyway... We can't test the embedded provider on Windows or Linux easily. I don't see why that would be a particular problem on iOS.

That's not the same, there is litteraly no point in having
a different module for iOS, whereas we maintain both embedded
and desktop usage for Linux or Windows.

Adding a new module that will never be used in application
while loosing the ability to test the correct video output
and window module is a nonsense for a developer tool.

I originally made this work especially to test the refactor
I made for the iOS display and window module, so not being
able to test it with a tool specifically designed for this
is wrong to me.

Regards,
--
Alexandre Janniaux
Videolabs

>
> Le 6 mai 2020 12:18:09 GMT+03:00, Alexandre Janniaux <ajanni at videolabs.io> a écrit :
> >Hi,
> >
> >This application won't be shipped to the end user, but it noticeably
> >simplify development and testing. The app itself is unusable without
> >debug tools as it would just open libvlc without arguments and do
> >nothing.
> >
> >Using a different window provider than the one used by real-world
> >applications would defeat the initial purpose, hence the static
> >interface plugin playing the role of libvlc_media_player_set_nsobject.
> >
> >I hope it's clearer,
> >
> >Regards,
> >--
> >Alexandre Janniaux
> >Videolabs
> >
> >On Wed, May 06, 2020 at 12:02:19PM +0300, Rémi Denis-Courmont wrote:
> >> Hi,
> >>
> >> Why do you make a static plugin here? Can't you use the dummy
> >interface and have a proper stand-alone window provider, essentially
> >like CLI VLC does on Unix?
> >>
> >> Le 6 mai 2020 11:51:37 GMT+03:00, Alexandre Janniaux
> ><ajanni at videolabs.io> a écrit :
> >> >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
> >>
> >> --
> >> Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez
> >excuser ma brièveté.
> >
> >> _______________________________________________
> >> vlc-devel mailing list
> >> To unsubscribe or modify your subscription options:
> >> https://mailman.videolan.org/listinfo/vlc-devel
> >_______________________________________________
> >vlc-devel mailing list
> >To unsubscribe or modify your subscription options:
> >https://mailman.videolan.org/listinfo/vlc-devel
>
> --
> Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté.

> _______________________________________________
> 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