[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