From patchwork Sun Sep 18 17:15:33 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Lukasz Marek X-Patchwork-Id: 615 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.134 with SMTP id o128csp641899vsd; Sun, 18 Sep 2016 10:15:45 -0700 (PDT) X-Received: by 10.28.94.85 with SMTP id s82mr5618803wmb.24.1474218945762; Sun, 18 Sep 2016 10:15:45 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id o15si5262873wmd.46.2016.09.18.10.15.45; Sun, 18 Sep 2016 10:15:45 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BBED3689F67; Sun, 18 Sep 2016 20:15:28 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf0-f67.google.com (mail-lf0-f67.google.com [209.85.215.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F0601689D38 for ; Sun, 18 Sep 2016 20:15:21 +0300 (EEST) Received: by mail-lf0-f67.google.com with SMTP id s64so7269104lfs.2 for ; Sun, 18 Sep 2016 10:15:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to; bh=vPZL4l/MDB4zk9DJygde0O/xsYJyje8dOIJ19gKRsV0=; b=M+A5sC8U7OXNuo6+abncvCFsMdWNP6pgkNVIGJryz7k21GIXiFbeaDM4r4wKGnjeds aoX5C6rnj6/2I7IbLaRUhus5OCIvXfveXRc6KDNvYsG2KNkCt8d7gIxo7b2u2USzAHtY W7Ye8whD00p15ZxYG/2tHk5T4tSRubvVQKltRoyPTUmvFIFa0F1aGbimKWVSXglntKvG l4VrD2bMADh82l/0Oc+jI/yDjEJJsgj8afFiRUzrrwCRAEmg2fSA/wwzSknjJnONwV5T liD61qi3UWPlfgLp1QDtEpuNe6x6BsYOMUpSd8o9iM/zC3AkLmlkAakMrlL2t/iw7pGa 2U+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to; bh=vPZL4l/MDB4zk9DJygde0O/xsYJyje8dOIJ19gKRsV0=; b=l/RVWoZOqWVTsyAZ0Opo0+HnwDoHk9X3GL/z9G2s3e86P6p4BpFw8SbcnlLebigyaU jzXuYjwonYy4YvDwdKoS9q7iu8HT8JrqwLl3xcWXRuGrqCYpKNbxgwu6yRCSL6zoCcQz jpS8enKbrLU+lnuPNfy4MGBq3Yj7XR4cPbsMJNV/wsqBxAk0UzxMUJFrQ/9SD1NgPx84 53c1asZRH5iM9Q26/M8qAbZEuvn2qVOB3eIG/Sed+iiuTMcTtJ/V6z423mFVRLiLTQiq 5j4ZRouU92kDG04IpdELWG8Yronsj3DgyIA+x0zCYluzfJmHckiyM1Z+Uga5YO+sMonx +mIQ== X-Gm-Message-State: AE9vXwPQUnWK/JY+jacuFlcJcrZdmz9oXg++0sYzgxB0X5kzG5LaPQyguQf0hysqwY/KBA== X-Received: by 10.25.82.202 with SMTP id g193mr8959488lfb.141.1474218935440; Sun, 18 Sep 2016 10:15:35 -0700 (PDT) Received: from [192.168.0.4] (host-80-238-110-231.jmdi.pl. [80.238.110.231]) by smtp.googlemail.com with ESMTPSA id w186sm4130931lfd.5.2016.09.18.10.15.34 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 18 Sep 2016 10:15:34 -0700 (PDT) To: ffmpeg-devel@ffmpeg.org References: <20160917223043.52603-1-josh@itanimul.li> <1474163955.282673.728993113.76AD8063@webmail.messagingengine.com> <65e2b2ff-61bc-feb1-75ab-c76ff7aa5678@itanimul.li> From: Lukasz Marek Message-ID: Date: Sun, 18 Sep 2016 19:15:33 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <65e2b2ff-61bc-feb1-75ab-c76ff7aa5678@itanimul.li> Subject: Re: [FFmpeg-devel] [PATCH] lavd/opengl: use SDL2 X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" On 18.09.2016 10:04, Josh de Kock wrote: > On 18/09/2016 05:51, Lukasz Marek wrote: >> W dniu niedziela, 18 września 2016 Lou Logan > > napisał(a): >> >>> On Sat, Sep 17, 2016, at 05:21 PM, Lukasz Marek wrote: >>>> On 18 September 2016 at 00:30, Josh de Kock wrote: >>> [...] >>>>> Would like some feedback where it doesnt work etc >>> [...] >>>> I said I will patch opengl, your implemantation donsn't look good at >>>> this >>>> point, declined, >>> >>> It would be helpful to provide some details describing what exactly does >>> not look good. >>> _______________________________________________ >> >> >> opengl device depends on opengl context. this patch works on sdl renderer >> which works on X. in many cases X is opengł so patch is working for many >> cases, but is shity in general. >> > > Sorry, I don't understand. Could you rephrase this? I updated my version. I wanted to submit after vote is finished, but to save our time you can review it and include in your sdl patchset. From c8988099c8535c77382b6f05d23326a0270bb2f4 Mon Sep 17 00:00:00 2001 From: Lukasz Marek Date: Sun, 18 Sep 2016 19:13:12 +0200 Subject: [PATCH] lavd/opengl: use SDL2 Signed-off-by: Lukasz Marek --- libavdevice/opengl_enc.c | 109 +++++++++++++++++++++-------------------------- 1 file changed, 49 insertions(+), 60 deletions(-) diff --git a/libavdevice/opengl_enc.c b/libavdevice/opengl_enc.c index 1dbbb80..94259a2 100644 --- a/libavdevice/opengl_enc.c +++ b/libavdevice/opengl_enc.c @@ -46,7 +46,7 @@ #include #endif -#if HAVE_SDL +#if HAVE_SDL2 #include #endif @@ -174,8 +174,9 @@ static const GLushort g_index[6] = typedef struct OpenGLContext { AVClass *class; ///< class for private options -#if HAVE_SDL - SDL_Surface *surface; +#if HAVE_SDL2 + SDL_Window *window; + SDL_GLContext glcontext; #endif FFOpenGLFunctions glprocs; @@ -341,30 +342,14 @@ static int opengl_control_message(AVFormatContext *h, int type, void *data, size return AVERROR(ENOSYS); } -#if HAVE_SDL -static int opengl_sdl_recreate_window(OpenGLContext *opengl, int width, int height) -{ - opengl->surface = SDL_SetVideoMode(width, height, - 32, SDL_OPENGL | SDL_RESIZABLE); - if (!opengl->surface) { - av_log(opengl, AV_LOG_ERROR, "Unable to set video mode: %s\n", SDL_GetError()); - return AVERROR_EXTERNAL; - } - SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - return 0; -} - +#if HAVE_SDL2 static int opengl_sdl_process_events(AVFormatContext *h) { - int ret; OpenGLContext *opengl = h->priv_data; + AVDeviceRect message; SDL_Event event; SDL_PumpEvents(); - while (SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_ALLEVENTS) > 0) { + while (SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT) > 0) { switch (event.type) { case SDL_QUIT: return AVERROR(EIO); @@ -375,23 +360,14 @@ static int opengl_sdl_process_events(AVFormatContext *h) return AVERROR(EIO); } return 0; - case SDL_VIDEORESIZE: { - char buffer[100]; - int reinit; - AVDeviceRect message; - /* clean up old context because SDL_SetVideoMode may lose its state. */ - SDL_VideoDriverName(buffer, sizeof(buffer)); - reinit = !av_strncasecmp(buffer, "quartz", sizeof(buffer)); - if (reinit) { - opengl_deinit_context(opengl); - } - if ((ret = opengl_sdl_recreate_window(opengl, event.resize.w, event.resize.h)) < 0) - return ret; - if (reinit && (ret = opengl_init_context(opengl)) < 0) - return ret; - message.width = opengl->surface->w; - message.height = opengl->surface->h; - return opengl_control_message(h, AV_APP_TO_DEV_WINDOW_SIZE, &message, sizeof(AVDeviceRect)); + case SDL_WINDOWEVENT: + switch(event.window.event) { + case SDL_WINDOWEVENT_RESIZED: + case SDL_WINDOWEVENT_SIZE_CHANGED: + SDL_GL_GetDrawableSize(opengl->window, &message.width, &message.height); + return opengl_control_message(h, AV_APP_TO_DEV_WINDOW_SIZE, &message, sizeof(AVDeviceRect)); + default: + break; } } } @@ -400,23 +376,34 @@ static int opengl_sdl_process_events(AVFormatContext *h) static int av_cold opengl_sdl_create_window(AVFormatContext *h) { - int ret; - char buffer[100]; OpenGLContext *opengl = h->priv_data; AVDeviceRect message; if (SDL_Init(SDL_INIT_VIDEO)) { av_log(opengl, AV_LOG_ERROR, "Unable to initialize SDL: %s\n", SDL_GetError()); return AVERROR_EXTERNAL; } - if ((ret = opengl_sdl_recreate_window(opengl, opengl->window_width, - opengl->window_height)) < 0) - return ret; - av_log(opengl, AV_LOG_INFO, "SDL driver: '%s'.\n", SDL_VideoDriverName(buffer, sizeof(buffer))); - message.width = opengl->surface->w; - message.height = opengl->surface->h; - SDL_WM_SetCaption(opengl->window_title, NULL); - opengl_control_message(h, AV_APP_TO_DEV_WINDOW_SIZE, &message, sizeof(AVDeviceRect)); - return 0; + opengl->window = SDL_CreateWindow(opengl->window_title, + SDL_WINDOWPOS_UNDEFINED, + SDL_WINDOWPOS_UNDEFINED, + opengl->window_width, opengl->window_height, + SDL_WINDOW_RESIZABLE | SDL_WINDOW_OPENGL); + if (!opengl->window) { + av_log(opengl, AV_LOG_ERROR, "Unable to create default window: %s\n", SDL_GetError()); + return AVERROR_EXTERNAL; + } + opengl->glcontext = SDL_GL_CreateContext(opengl->window); + if (!opengl->glcontext) { + av_log(opengl, AV_LOG_ERROR, "Unable to create OpenGL context on default window: %s\n", SDL_GetError()); + return AVERROR_EXTERNAL; + } + SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + av_log(opengl, AV_LOG_INFO, "SDL driver: '%s'.\n", SDL_GetCurrentVideoDriver()); + SDL_GL_GetDrawableSize(opengl->window, &message.width, &message.height); + return opengl_control_message(h, AV_APP_TO_DEV_WINDOW_SIZE, &message, sizeof(AVDeviceRect)); } static int av_cold opengl_sdl_load_procedures(OpenGLContext *opengl) @@ -460,14 +447,14 @@ static int av_cold opengl_sdl_load_procedures(OpenGLContext *opengl) #undef LOAD_OPENGL_FUN } -#endif /* HAVE_SDL */ +#endif /* HAVE_SDL2 */ #if defined(__APPLE__) static int av_cold opengl_load_procedures(OpenGLContext *opengl) { FFOpenGLFunctions *procs = &opengl->glprocs; -#if HAVE_SDL +#if HAVE_SDL2 if (!opengl->no_window) return opengl_sdl_load_procedures(opengl); #endif @@ -517,7 +504,7 @@ static int av_cold opengl_load_procedures(OpenGLContext *opengl) return AVERROR(ENOSYS); \ } -#if HAVE_SDL +#if HAVE_SDL2 if (!opengl->no_window) return opengl_sdl_load_procedures(opengl); #endif @@ -943,7 +930,7 @@ static int opengl_create_window(AVFormatContext *h) int ret; if (!opengl->no_window) { -#if HAVE_SDL +#if HAVE_SDL2 if ((ret = opengl_sdl_create_window(h)) < 0) { av_log(opengl, AV_LOG_ERROR, "Cannot create default SDL window.\n"); return ret; @@ -975,7 +962,9 @@ static int opengl_release_window(AVFormatContext *h) int ret; OpenGLContext *opengl = h->priv_data; if (!opengl->no_window) { -#if HAVE_SDL +#if HAVE_SDL2 + SDL_GL_DeleteContext(opengl->glcontext); + SDL_DestroyWindow(opengl->window); SDL_Quit(); #endif } else if ((ret = avdevice_dev_to_app_control_message(h, AV_DEV_TO_APP_DESTROY_WINDOW_BUFFER, NULL , 0)) < 0) { @@ -1109,9 +1098,9 @@ static av_cold int opengl_write_header(AVFormatContext *h) glClear(GL_COLOR_BUFFER_BIT); -#if HAVE_SDL +#if HAVE_SDL2 if (!opengl->no_window) - SDL_GL_SwapBuffers(); + SDL_GL_SwapWindow(opengl->window); #endif if (opengl->no_window && (ret = avdevice_dev_to_app_control_message(h, AV_DEV_TO_APP_DISPLAY_WINDOW_BUFFER, NULL , 0)) < 0) { @@ -1204,7 +1193,7 @@ static int opengl_draw(AVFormatContext *h, void *input, int repaint, int is_pkt) const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt); int ret; -#if HAVE_SDL +#if HAVE_SDL2 if (!opengl->no_window && (ret = opengl_sdl_process_events(h)) < 0) goto fail; #endif @@ -1245,9 +1234,9 @@ static int opengl_draw(AVFormatContext *h, void *input, int repaint, int is_pkt) ret = AVERROR_EXTERNAL; OPENGL_ERROR_CHECK(opengl); -#if HAVE_SDL +#if HAVE_SDL2 if (!opengl->no_window) - SDL_GL_SwapBuffers(); + SDL_GL_SwapWindow(opengl->window); #endif if (opengl->no_window && (ret = avdevice_dev_to_app_control_message(h, AV_DEV_TO_APP_DISPLAY_WINDOW_BUFFER, NULL , 0)) < 0) { -- 1.9.1