[vlc-devel] [PATCH] doc: libvlc: add a simple win32 app using set_hwnd()

Rémi Denis-Courmont remi at remlab.net
Wed May 6 10:48:23 CEST 2020


Hi,

It looks like the render context does nothing here? To the extent possible, it's preferable that the embedded window provider plugin detects size changes without help of the app (as is done for X11). Otherwise devs will get it wrong, especially in the case of portable frameworks around LibVLC.

Le 6 mai 2020 11:28:28 GMT+03:00, Steve Lhomme <robux4 at ycbcr.xyz> a écrit :
>---
> doc/libvlc/win_player.c | 148 ++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 148 insertions(+)
> create mode 100644 doc/libvlc/win_player.c
>
>diff --git a/doc/libvlc/win_player.c b/doc/libvlc/win_player.c
>new file mode 100644
>index 000000000000..41061d936c4e
>--- /dev/null
>+++ b/doc/libvlc/win_player.c
>@@ -0,0 +1,148 @@
>+/* compile: cc win_player.c -o win_player.exe -L<path/libvlc> -lvlc */
>+
>+#include <windows.h>
>+#include <assert.h>
>+
>+#include <vlc/vlc.h>
>+
>+#define SCREEN_WIDTH  1500
>+#define SCREEN_HEIGHT  900
>+#define BORDER_LEFT    (-0.95f)
>+#define BORDER_RIGHT   ( 0.85f)
>+#define BORDER_TOP     ( 0.95f)
>+#define BORDER_BOTTOM  (-0.90f)
>+
>+#define check_leak(x)  assert(x)
>+
>+struct render_context
>+{
>+    HWND hWnd;
>+    CRITICAL_SECTION sizeLock; // the ReportSize callback cannot be
>called during/after the Cleanup_cb is called
>+    unsigned width, height;
>+    void (*ReportSize)(void *ReportOpaque, unsigned width, unsigned
>height);
>+    void *ReportOpaque;
>+};
>+
>+static LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM
>wParam, LPARAM lParam)
>+{
>+    if( message == WM_CREATE )
>+    {
>+        /* Store p_mp for future use */
>+        CREATESTRUCT *c = (CREATESTRUCT *)lParam;
>+        SetWindowLongPtr( hWnd, GWLP_USERDATA,
>(LONG_PTR)c->lpCreateParams );
>+        return 0;
>+    }
>+
>+    LONG_PTR p_user_data = GetWindowLongPtr( hWnd, GWLP_USERDATA );
>+    if( p_user_data == 0 )
>+        return DefWindowProc(hWnd, message, wParam, lParam);
>+    struct render_context *ctx = (struct render_context *)p_user_data;
>+
>+    switch(message)
>+    {
>+        case WM_SIZE:
>+        {
>+            /* tell libvlc that our size has changed */
>+            ctx->width  = LOWORD(lParam) * (BORDER_RIGHT -
>BORDER_LEFT) / 2.0f; /* remove the orange part ! */
>+            ctx->height = HIWORD(lParam) * (BORDER_TOP -
>BORDER_BOTTOM) / 2.0f;
>+            EnterCriticalSection(&ctx->sizeLock);
>+            if (ctx->ReportSize != NULL)
>+                ctx->ReportSize(ctx->ReportOpaque, ctx->width,
>ctx->height);
>+            LeaveCriticalSection(&ctx->sizeLock);
>+        }
>+        break;
>+
>+        case WM_DESTROY:
>+            PostQuitMessage(0);
>+            return 0;
>+    }
>+
>+    return DefWindowProc (hWnd, message, wParam, lParam);
>+}
>+
>+int WINAPI WinMain(HINSTANCE hInstance,
>+                   HINSTANCE hPrevInstance,
>+                   LPSTR lpCmdLine,
>+                   int nCmdShow)
>+{
>+    WNDCLASSEX wc;
>+    struct render_context Context = { };
>+    char *file_path;
>+    libvlc_instance_t *p_libvlc;
>+    libvlc_media_t *p_media;
>+    libvlc_media_player_t *p_mp;
>+    (void)hPrevInstance;
>+
>+    /* remove "" around the given path */
>+    if (lpCmdLine[0] == '"')
>+    {
>+        file_path = strdup( lpCmdLine+1 );
>+        if (file_path[strlen(file_path)-1] == '"')
>+            file_path[strlen(file_path)-1] = '\0';
>+    }
>+    else
>+        file_path = strdup( lpCmdLine );
>+
>+    p_libvlc = libvlc_new( 0, NULL );
>+    p_media = libvlc_media_new_path( p_libvlc, file_path );
>+    free( file_path );
>+    p_mp = libvlc_media_player_new_from_media( p_media );
>+
>+    InitializeCriticalSection(&Context.sizeLock);
>+
>+    ZeroMemory(&wc, sizeof(WNDCLASSEX));
>+
>+    wc.cbSize = sizeof(WNDCLASSEX);
>+    wc.style = CS_HREDRAW | CS_VREDRAW;
>+    wc.lpfnWndProc = WindowProc;
>+    wc.hInstance = hInstance;
>+    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
>+    wc.lpszClassName = "WindowClass";
>+
>+    RegisterClassEx(&wc);
>+
>+    RECT wr = {0, 0, SCREEN_WIDTH, SCREEN_HEIGHT};
>+    AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE);
>+
>+    Context.hWnd = CreateWindowEx(0,
>+                          "WindowClass",
>+                          "libvlc Demo app",
>+                          WS_OVERLAPPEDWINDOW,
>+                          CW_USEDEFAULT, CW_USEDEFAULT,
>+                          wr.right - wr.left,
>+                          wr.bottom - wr.top,
>+                          NULL,
>+                          NULL,
>+                          hInstance,
>+                          &Context);
>+
>+    ShowWindow(Context.hWnd, nCmdShow);
>+
>+    libvlc_media_player_set_hwnd(p_mp, Context.hWnd);
>+
>+    libvlc_media_player_play( p_mp );
>+
>+    MSG msg;
>+
>+    while(TRUE)
>+    {
>+        if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
>+        {
>+            TranslateMessage(&msg);
>+            DispatchMessage(&msg);
>+
>+            if(msg.message == WM_QUIT)
>+                break;
>+        }
>+    }
>+
>+    libvlc_media_player_stop_async( p_mp );
>+
>+    libvlc_media_player_release( p_mp );
>+    libvlc_media_release( p_media );
>+    libvlc_release( p_libvlc );
>+
>+    DeleteCriticalSection(&Context.sizeLock);
>+
>+    return msg.wParam;
>+}
>-- 
>2.17.1
>
>_______________________________________________
>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é.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20200506/70688569/attachment.html>


More information about the vlc-devel mailing list