diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-05-02 18:46:20 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-05-02 18:46:25 +0200 |
commit | cea9ee5dbd9312076676693be4dfadb0664ea420 (patch) | |
tree | 54798510ff5c7fc69501edbb28df4a8127bca668 /libavdevice | |
parent | 41a679000f22884017107e90bfbcf2069c69d08c (diff) | |
parent | fa4f7b17bc120effb82874538d895da1c92ba886 (diff) | |
download | ffmpeg-cea9ee5dbd9312076676693be4dfadb0664ea420.tar.gz |
Merge remote-tracking branch 'lukaszmluki/master'
* lukaszmluki/master:
lavd/xv: reident after previous commits
lavf/mux: pass options to nested structs of priv data
lavu/opt: add av_opt_set_dict2() function
lavd/opengl_enc: fix window size correction code
lavd/opengl_enc: add window size param
lavd/opengl_enc: use flag to mark inited context
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavdevice')
-rw-r--r-- | libavdevice/opengl_enc.c | 25 | ||||
-rw-r--r-- | libavdevice/version.h | 2 | ||||
-rw-r--r-- | libavdevice/xv.c | 23 |
3 files changed, 31 insertions, 19 deletions
diff --git a/libavdevice/opengl_enc.c b/libavdevice/opengl_enc.c index 5f9748dd6f..28a01181a0 100644 --- a/libavdevice/opengl_enc.c +++ b/libavdevice/opengl_enc.c @@ -178,6 +178,7 @@ typedef struct OpenGLContext { #endif FFOpenGLFunctions glprocs; + int inited; ///< Set to 1 when write_header was successfully called. uint8_t background[4]; ///< Background color int no_window; ///< 0 for create default window char *window_title; ///< Title of the window @@ -309,8 +310,7 @@ static int opengl_resize(AVFormatContext *h, int width, int height) OpenGLContext *opengl = h->priv_data; opengl->window_width = width; opengl->window_height = height; - /* max_viewport_width == 0 means write_header was not called yet. */ - if (opengl->max_viewport_width) { + if (opengl->inited) { if (opengl->no_window && (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"); @@ -407,7 +407,8 @@ static int av_cold opengl_sdl_create_window(AVFormatContext *h) 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->width, opengl->height)) < 0) + 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; @@ -871,8 +872,8 @@ static av_cold int opengl_prepare_vertex(AVFormatContext *s) int tex_w, tex_h; if (opengl->window_width > opengl->max_viewport_width || opengl->window_height > opengl->max_viewport_height) { - opengl->window_width = FFMAX(opengl->window_width, opengl->max_viewport_width); - opengl->window_height = FFMAX(opengl->window_height, opengl->max_viewport_height); + opengl->window_width = FFMIN(opengl->window_width, opengl->max_viewport_width); + opengl->window_height = FFMIN(opengl->window_height, opengl->max_viewport_height); av_log(opengl, AV_LOG_WARNING, "Too big viewport requested, limited to %dx%d", opengl->window_width, opengl->window_height); } glViewport(0, 0, opengl->window_width, opengl->window_height); @@ -951,7 +952,12 @@ static int opengl_create_window(AVFormatContext *h) return AVERROR(ENOSYS); #endif } else { - if ((ret = avdevice_dev_to_app_control_message(h, AV_DEV_TO_APP_CREATE_WINDOW_BUFFER, NULL , 0)) < 0) { + AVDeviceRect message; + message.x = message.y = 0; + message.width = opengl->window_width; + message.height = opengl->window_height; + if ((ret = avdevice_dev_to_app_control_message(h, AV_DEV_TO_APP_CREATE_WINDOW_BUFFER, + &message , sizeof(message))) < 0) { av_log(opengl, AV_LOG_ERROR, "Application failed to create window buffer.\n"); return ret; } @@ -1067,6 +1073,10 @@ static av_cold int opengl_write_header(AVFormatContext *h) opengl->width = st->codec->width; opengl->height = st->codec->height; opengl->pix_fmt = st->codec->pix_fmt; + if (!opengl->window_width) + opengl->window_width = opengl->width; + if (!opengl->window_height) + opengl->window_height = opengl->height; if (!opengl->window_title && !opengl->no_window) opengl->window_title = av_strdup(h->filename); @@ -1110,6 +1120,8 @@ static av_cold int opengl_write_header(AVFormatContext *h) ret = AVERROR_EXTERNAL; OPENGL_ERROR_CHECK(opengl); + + opengl->inited = 1; return 0; fail: @@ -1266,6 +1278,7 @@ static const AVOption options[] = { { "background", "set background color", OFFSET(background), AV_OPT_TYPE_COLOR, {.str = "black"}, CHAR_MIN, CHAR_MAX, ENC }, { "no_window", "disable default window", OFFSET(no_window), AV_OPT_TYPE_INT, {.i64 = 0}, INT_MIN, INT_MAX, ENC }, { "window_title", "set window title", OFFSET(window_title), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, ENC }, + { "window_size", "set window size", OFFSET(window_width), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0, ENC }, { NULL } }; diff --git a/libavdevice/version.h b/libavdevice/version.h index 4267872042..163a4c63c2 100644 --- a/libavdevice/version.h +++ b/libavdevice/version.h @@ -29,7 +29,7 @@ #define LIBAVDEVICE_VERSION_MAJOR 55 #define LIBAVDEVICE_VERSION_MINOR 13 -#define LIBAVDEVICE_VERSION_MICRO 100 +#define LIBAVDEVICE_VERSION_MICRO 101 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ LIBAVDEVICE_VERSION_MINOR, \ diff --git a/libavdevice/xv.c b/libavdevice/xv.c index 7353310892..d1f8907d99 100644 --- a/libavdevice/xv.c +++ b/libavdevice/xv.c @@ -145,19 +145,18 @@ static int xv_write_header(AVFormatContext *s) } } if (!xv->window_id) { - //TODO: reident - xv->window = XCreateSimpleWindow(xv->display, DefaultRootWindow(xv->display), - xv->window_x, xv->window_y, - xv->window_width, xv->window_height, - 0, 0, 0); - if (!xv->window_title) { - if (!(xv->window_title = av_strdup(s->filename))) { - ret = AVERROR(ENOMEM); - goto fail; + xv->window = XCreateSimpleWindow(xv->display, DefaultRootWindow(xv->display), + xv->window_x, xv->window_y, + xv->window_width, xv->window_height, + 0, 0, 0); + if (!xv->window_title) { + if (!(xv->window_title = av_strdup(s->filename))) { + ret = AVERROR(ENOMEM); + goto fail; + } } - } - XStoreName(xv->display, xv->window, xv->window_title); - XMapWindow(xv->display, xv->window); + XStoreName(xv->display, xv->window, xv->window_title); + XMapWindow(xv->display, xv->window); } else xv->window = xv->window_id; |