summaryrefslogtreecommitdiffstats
path: root/player
diff options
context:
space:
mode:
authorNiklas Haas <git@haasn.xyz>2017-09-11 18:20:18 +0200
committerNiklas Haas <git@haasn.xyz>2017-09-11 18:20:18 +0200
commit3faf1fb0a4482712b2177af2f72ef8877f8adc10 (patch)
tree4a9b118cc074d6acbaa7fffe828e90199db08db1 /player
parent71c25df5e66154e6b8b72ebc0f8ef5ae0c40d7f6 (diff)
downloadmpv-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')
-rw-r--r--player/command.c27
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)