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

Steve Lhomme robux4 at ycbcr.xyz
Wed May 6 11:26:33 CEST 2020


Yes, I'll simplify it even more. It was just the d3d samples without the 
D3D parts.

On 2020-05-06 10:48, Rémi Denis-Courmont wrote:
> 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;
>     +}
> 
> 
> -- 
> 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