diff --git a/libavdevice/opengl_enc.c b/libavdevice/opengl_enc.c index f2145852ed..b91b32c9b5 100644 --- a/libavdevice/opengl_enc.c +++ b/libavdevice/opengl_enc.c @@ -889,6 +889,49 @@ static int opengl_prepare(OpenGLContext *opengl) return AVERROR_EXTERNAL; } +static int opengl_create_window(AVFormatContext *h) +{ + OpenGLContext *opengl = h->priv_data; + int ret; + + if (!opengl->no_window) { +#if HAVE_SDL + if ((ret = opengl_sdl_create_window(h)) < 0) { + av_log(opengl, AV_LOG_ERROR, "Cannot create default SDL window.\n"); + return ret; + } +#else + av_log(opengl, AV_LOG_ERROR, "FFmpeg is compiled without SDL. Cannot create default window.\n"); + return AVERROR(ENOSYS); +#endif + } else { + if ((ret = avdevice_dev_to_app_control_message(h, AV_DEV_TO_APP_CREATE_WINDOW_BUFFER, NULL , 0)) < 0) { + av_log(opengl, AV_LOG_ERROR, "Application failed to create window buffer.\n"); + return ret; + } + if ((ret = avdevice_dev_to_app_control_message(h, AV_DEV_TO_APP_PREPARE_WINDOW_BUFFER, NULL , 0)) < 0) { + av_log(opengl, AV_LOG_ERROR, "Application failed to prepare window buffer.\n"); + return ret; + } + } + return 0; +} + +static int opengl_release_window(AVFormatContext *h) +{ + int ret; + OpenGLContext *opengl = h->priv_data; + if (!opengl->no_window) { +#if HAVE_SDL + SDL_Quit(); +#endif + } else if ((ret = avdevice_dev_to_app_control_message(h, AV_DEV_TO_APP_DESTROY_WINDOW_BUFFER, NULL , 0) < 0)) { + av_log(opengl, AV_LOG_ERROR, "Application failed to release window buffer.\n"); + return ret; + } + return 0; +} + static av_cold int opengl_write_trailer(AVFormatContext *h) { OpenGLContext *opengl = h->priv_data; @@ -901,13 +944,7 @@ static av_cold int opengl_write_trailer(AVFormatContext *h) if (opengl && opengl->glprocs.glDeleteBuffers) opengl->glprocs.glDeleteBuffers(2, &opengl->index_buffer); -#if HAVE_SDL - if (!opengl->no_window) - SDL_Quit(); -#endif - if (opengl->no_window && - avdevice_dev_to_app_control_message(h, AV_DEV_TO_APP_DESTROY_WINDOW_BUFFER, NULL , 0) < 0) - av_log(opengl, AV_LOG_ERROR, "Application failed to release window buffer.\n"); + opengl_release_window(h); return 0; } @@ -991,25 +1028,8 @@ static av_cold int opengl_write_header(AVFormatContext *h) if (!opengl->window_title && !opengl->no_window) opengl->window_title = av_strdup(h->filename); - if (!opengl->no_window) { -#if HAVE_SDL - if ((ret = opengl_sdl_create_window(h)) < 0) - goto fail; -#else - av_log(opengl, AV_LOG_ERROR, "FFmpeg is compiled without SDL. Cannot create default window.\n"); - ret = AVERROR(ENOSYS); + if ((ret = opengl_create_window(h))) goto fail; -#endif - } else { - if ((ret = avdevice_dev_to_app_control_message(h, AV_DEV_TO_APP_CREATE_WINDOW_BUFFER, NULL , 0)) < 0) { - av_log(opengl, AV_LOG_ERROR, "Application failed to create window buffer.\n"); - goto fail; - } - if ((ret = avdevice_dev_to_app_control_message(h, AV_DEV_TO_APP_PREPARE_WINDOW_BUFFER, NULL , 0)) < 0) { - av_log(opengl, AV_LOG_ERROR, "Application failed to prepare window buffer.\n"); - goto fail; - } - } if ((ret = opengl_read_limits(opengl)) < 0) goto fail;