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>
This commit is contained in:
Michael Niedermayer 2014-05-02 18:46:20 +02:00
commit cea9ee5dbd
9 changed files with 65 additions and 23 deletions

@ -15,6 +15,9 @@ libavutil: 2012-10-22
API changes, most recent first: API changes, most recent first:
2014-05-xx - xxxxxxx - lavu 52.81.0 - opt.h
Add av_opt_set_dict2() function.
2014-04-xx - xxxxxxx - lavc 55.50.3 - avcodec.h 2014-04-xx - xxxxxxx - lavc 55.50.3 - avcodec.h
Deprecate CODEC_FLAG_MV0. It is replaced by the flag "mv0" in the Deprecate CODEC_FLAG_MV0. It is replaced by the flag "mv0" in the
"mpv_flags" private option of the mpegvideo encoders. "mpv_flags" private option of the mpegvideo encoders.

@ -237,6 +237,10 @@ Application must provide OpenGL context and both @code{window_size_cb} and @code
@item window_title @item window_title
Set the SDL window title, if not specified default to the filename specified for the output device. Set the SDL window title, if not specified default to the filename specified for the output device.
Ignored when @option{no_window} is set. Ignored when @option{no_window} is set.
@item window_size
Set preferred window size, can be a string of the form widthxheight or a video size abbreviation.
If not specified it defaults to the size of the input video, downscaled according to the aspect ratio.
Mostly usable when @option{no_window} is not set.
@end table @end table

@ -178,6 +178,7 @@ typedef struct OpenGLContext {
#endif #endif
FFOpenGLFunctions glprocs; FFOpenGLFunctions glprocs;
int inited; ///< Set to 1 when write_header was successfully called.
uint8_t background[4]; ///< Background color uint8_t background[4]; ///< Background color
int no_window; ///< 0 for create default window int no_window; ///< 0 for create default window
char *window_title; ///< Title of the 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; OpenGLContext *opengl = h->priv_data;
opengl->window_width = width; opengl->window_width = width;
opengl->window_height = height; opengl->window_height = height;
/* max_viewport_width == 0 means write_header was not called yet. */ if (opengl->inited) {
if (opengl->max_viewport_width) {
if (opengl->no_window && if (opengl->no_window &&
(ret = avdevice_dev_to_app_control_message(h, AV_DEV_TO_APP_PREPARE_WINDOW_BUFFER, NULL , 0)) < 0) { (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"); 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()); av_log(opengl, AV_LOG_ERROR, "Unable to initialize SDL: %s\n", SDL_GetError());
return AVERROR_EXTERNAL; 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; return ret;
av_log(opengl, AV_LOG_INFO, "SDL driver: '%s'.\n", SDL_VideoDriverName(buffer, sizeof(buffer))); av_log(opengl, AV_LOG_INFO, "SDL driver: '%s'.\n", SDL_VideoDriverName(buffer, sizeof(buffer)));
message.width = opengl->surface->w; message.width = opengl->surface->w;
@ -871,8 +872,8 @@ static av_cold int opengl_prepare_vertex(AVFormatContext *s)
int tex_w, tex_h; int tex_w, tex_h;
if (opengl->window_width > opengl->max_viewport_width || opengl->window_height > opengl->max_viewport_height) { 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_width = FFMIN(opengl->window_width, opengl->max_viewport_width);
opengl->window_height = FFMAX(opengl->window_height, opengl->max_viewport_height); 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); 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); glViewport(0, 0, opengl->window_width, opengl->window_height);
@ -951,7 +952,12 @@ static int opengl_create_window(AVFormatContext *h)
return AVERROR(ENOSYS); return AVERROR(ENOSYS);
#endif #endif
} else { } 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"); av_log(opengl, AV_LOG_ERROR, "Application failed to create window buffer.\n");
return ret; return ret;
} }
@ -1067,6 +1073,10 @@ static av_cold int opengl_write_header(AVFormatContext *h)
opengl->width = st->codec->width; opengl->width = st->codec->width;
opengl->height = st->codec->height; opengl->height = st->codec->height;
opengl->pix_fmt = st->codec->pix_fmt; 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) if (!opengl->window_title && !opengl->no_window)
opengl->window_title = av_strdup(h->filename); opengl->window_title = av_strdup(h->filename);
@ -1110,6 +1120,8 @@ static av_cold int opengl_write_header(AVFormatContext *h)
ret = AVERROR_EXTERNAL; ret = AVERROR_EXTERNAL;
OPENGL_ERROR_CHECK(opengl); OPENGL_ERROR_CHECK(opengl);
opengl->inited = 1;
return 0; return 0;
fail: 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 }, { "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 }, { "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_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 } { NULL }
}; };

@ -29,7 +29,7 @@
#define LIBAVDEVICE_VERSION_MAJOR 55 #define LIBAVDEVICE_VERSION_MAJOR 55
#define LIBAVDEVICE_VERSION_MINOR 13 #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, \ #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \
LIBAVDEVICE_VERSION_MINOR, \ LIBAVDEVICE_VERSION_MINOR, \

@ -145,7 +145,6 @@ static int xv_write_header(AVFormatContext *s)
} }
} }
if (!xv->window_id) { if (!xv->window_id) {
//TODO: reident
xv->window = XCreateSimpleWindow(xv->display, DefaultRootWindow(xv->display), xv->window = XCreateSimpleWindow(xv->display, DefaultRootWindow(xv->display),
xv->window_x, xv->window_y, xv->window_x, xv->window_y,
xv->window_width, xv->window_height, xv->window_width, xv->window_height,

@ -334,7 +334,7 @@ static int init_muxer(AVFormatContext *s, AVDictionary **options)
if (of->priv_class) { if (of->priv_class) {
*(const AVClass **)s->priv_data = of->priv_class; *(const AVClass **)s->priv_data = of->priv_class;
av_opt_set_defaults(s->priv_data); av_opt_set_defaults(s->priv_data);
if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0) if ((ret = av_opt_set_dict2(s->priv_data, &tmp, AV_OPT_SEARCH_CHILDREN)) < 0)
goto fail; goto fail;
} }
} }

@ -1415,7 +1415,7 @@ void av_opt_free(void *obj)
av_freep((uint8_t *)obj + o->offset); av_freep((uint8_t *)obj + o->offset);
} }
int av_opt_set_dict(void *obj, AVDictionary **options) int av_opt_set_dict2(void *obj, AVDictionary **options, int search_flags)
{ {
AVDictionaryEntry *t = NULL; AVDictionaryEntry *t = NULL;
AVDictionary *tmp = NULL; AVDictionary *tmp = NULL;
@ -1425,7 +1425,7 @@ int av_opt_set_dict(void *obj, AVDictionary **options)
return 0; return 0;
while ((t = av_dict_get(*options, "", t, AV_DICT_IGNORE_SUFFIX))) { while ((t = av_dict_get(*options, "", t, AV_DICT_IGNORE_SUFFIX))) {
ret = av_opt_set(obj, t->key, t->value, 0); ret = av_opt_set(obj, t->key, t->value, search_flags);
if (ret == AVERROR_OPTION_NOT_FOUND) if (ret == AVERROR_OPTION_NOT_FOUND)
av_dict_set(&tmp, t->key, t->value, 0); av_dict_set(&tmp, t->key, t->value, 0);
else if (ret < 0) { else if (ret < 0) {
@ -1439,6 +1439,11 @@ int av_opt_set_dict(void *obj, AVDictionary **options)
return ret; return ret;
} }
int av_opt_set_dict(void *obj, AVDictionary **options)
{
return av_opt_set_dict2(obj, options, 0);
}
const AVOption *av_opt_find(void *obj, const char *name, const char *unit, const AVOption *av_opt_find(void *obj, const char *name, const char *unit,
int opt_flags, int search_flags) int opt_flags, int search_flags)
{ {

@ -541,6 +541,24 @@ int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name)
*/ */
int av_opt_set_dict(void *obj, struct AVDictionary **options); int av_opt_set_dict(void *obj, struct AVDictionary **options);
/**
* Set all the options from a given dictionary on an object.
*
* @param obj a struct whose first element is a pointer to AVClass
* @param options options to process. This dictionary will be freed and replaced
* by a new one containing all options not found in obj.
* Of course this new dictionary needs to be freed by caller
* with av_dict_free().
* @param search_flags A combination of AV_OPT_SEARCH_*.
*
* @return 0 on success, a negative AVERROR if some option was found in obj,
* but could not be set.
*
* @see av_dict_copy()
*/
int av_opt_set_dict2(void *obj, struct AVDictionary **options, int search_flags);
/** /**
* Extract a key-value pair from the beginning of a string. * Extract a key-value pair from the beginning of a string.
* *

@ -56,7 +56,7 @@
*/ */
#define LIBAVUTIL_VERSION_MAJOR 52 #define LIBAVUTIL_VERSION_MAJOR 52
#define LIBAVUTIL_VERSION_MINOR 80 #define LIBAVUTIL_VERSION_MINOR 81
#define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \