diff options
author | Niklas Haas <git@haasn.xyz> | 2017-09-11 18:20:18 +0200 |
---|---|---|
committer | Niklas Haas <git@haasn.xyz> | 2017-09-11 18:20:18 +0200 |
commit | 3faf1fb0a4482712b2177af2f72ef8877f8adc10 (patch) | |
tree | 4a9b118cc074d6acbaa7fffe828e90199db08db1 /player/command.c | |
parent | 71c25df5e66154e6b8b72ebc0f8ef5ae0c40d7f6 (diff) | |
download | mpv-3faf1fb0a4482712b2177af2f72ef8877f8adc10.tar.bz2 mpv-3faf1fb0a4482712b2177af2f72ef8877f8adc10.tar.xz |
vo: avoid putting large voctrl_performance_data on stack
This is around 512 kB, which is just way too much. Heap-allocate it
instead. Also cut down the max pass count to 64, since 128 was
unrealistically high even for vo_opengl.
Diffstat (limited to 'player/command.c')
-rw-r--r-- | player/command.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/player/command.c b/player/command.c index 87709e119c..1147eab14e 100644 --- a/player/command.c +++ b/player/command.c @@ -2913,19 +2913,21 @@ static int mp_property_vo_passes(void *ctx, struct m_property *prop, return M_PROPERTY_OK; } - struct voctrl_performance_data data = {0}; - if (vo_control(mpctx->video_out, VOCTRL_PERFORMANCE_DATA, &data) <= 0) - return M_PROPERTY_UNAVAILABLE; + int ret = M_PROPERTY_UNAVAILABLE; + struct voctrl_performance_data *data = talloc_ptrtype(NULL, data); + if (vo_control(mpctx->video_out, VOCTRL_PERFORMANCE_DATA, data) <= 0) + goto out; switch (action) { case M_PROPERTY_PRINT: { char *res = NULL; res = talloc_asprintf_append(res, "fresh:\n"); - res = asprint_perf(res, &data.fresh); + res = asprint_perf(res, &data->fresh); res = talloc_asprintf_append(res, "\nredraw:\n"); - res = asprint_perf(res, &data.redraw); + res = asprint_perf(res, &data->redraw); *(char **)arg = res; - return M_PROPERTY_OK; + ret = M_PROPERTY_OK; + goto out; } case M_PROPERTY_GET: { @@ -2933,14 +2935,19 @@ static int mp_property_vo_passes(void *ctx, struct m_property *prop, node_init(&node, MPV_FORMAT_NODE_MAP, NULL); struct mpv_node *fresh = node_map_add(&node, "fresh", MPV_FORMAT_NODE_ARRAY); struct mpv_node *redraw = node_map_add(&node, "redraw", MPV_FORMAT_NODE_ARRAY); - get_frame_perf(fresh, &data.fresh); - get_frame_perf(redraw, &data.redraw); + get_frame_perf(fresh, &data->fresh); + get_frame_perf(redraw, &data->redraw); *(struct mpv_node *)arg = node; - return M_PROPERTY_OK; + ret = M_PROPERTY_OK; + goto out; } } - return M_PROPERTY_NOT_IMPLEMENTED; + ret = M_PROPERTY_NOT_IMPLEMENTED; + +out: + talloc_free(data); + return ret; } static int mp_property_vo(void *ctx, struct m_property *p, int action, void *arg) |