summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--video/decode/vd_lavc.c4
-rw-r--r--video/filter/vf.c2
-rw-r--r--video/filter/vf_d3d11vpp.c2
-rw-r--r--video/mp_image_pool.c18
-rw-r--r--video/mp_image_pool.h2
-rw-r--r--video/out/vo_vaapi.c2
6 files changed, 16 insertions, 14 deletions
diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c
index 79adc311a9..eab1427bb7 100644
--- a/video/decode/vd_lavc.c
+++ b/video/decode/vd_lavc.c
@@ -546,8 +546,8 @@ static int init(struct dec_video *vd, const char *decoder)
ctx->opts = vd->opts;
ctx->decoder = talloc_strdup(ctx, decoder);
ctx->hwdec_devs = vd->hwdec_devs;
- ctx->hwdec_swpool = talloc_steal(ctx, mp_image_pool_new(17));
- ctx->dr_pool = talloc_steal(ctx, mp_image_pool_new(INT_MAX));
+ ctx->hwdec_swpool = mp_image_pool_new(ctx);
+ ctx->dr_pool = mp_image_pool_new(ctx);
pthread_mutex_init(&ctx->dr_lock, NULL);
diff --git a/video/filter/vf.c b/video/filter/vf.c
index 48a6e9a3a6..d5df466ba8 100644
--- a/video/filter/vf.c
+++ b/video/filter/vf.c
@@ -233,7 +233,7 @@ static struct vf_instance *vf_open(struct vf_chain *c, const char *name,
.log = mp_log_new(vf, c->log, name),
.hwdec_devs = c->hwdec_devs,
.query_format = vf_default_query_format,
- .out_pool = talloc_steal(vf, mp_image_pool_new(16)),
+ .out_pool = mp_image_pool_new(vf),
.chain = c,
};
struct m_config *config =
diff --git a/video/filter/vf_d3d11vpp.c b/video/filter/vf_d3d11vpp.c
index f49af06424..3be49ede80 100644
--- a/video/filter/vf_d3d11vpp.c
+++ b/video/filter/vf_d3d11vpp.c
@@ -412,7 +412,7 @@ static int reconfig(struct vf_instance *vf, struct mp_image_params *in,
p->params = *in;
p->out_params = *out;
- p->pool = mp_image_pool_new(20);
+ p->pool = mp_image_pool_new(vf);
mp_image_pool_set_allocator(p->pool, alloc_pool, vf);
mp_image_pool_set_lru(p->pool);
diff --git a/video/mp_image_pool.c b/video/mp_image_pool.c
index 809b4f3352..c526772981 100644
--- a/video/mp_image_pool.c
+++ b/video/mp_image_pool.c
@@ -43,11 +43,11 @@ static pthread_mutex_t pool_mutex = PTHREAD_MUTEX_INITIALIZER;
// destructors are thread-safe.)
struct mp_image_pool {
- int max_count;
-
struct mp_image **images;
int num_images;
+ int fmt, w, h;
+
mp_image_allocator allocator;
void *allocator_ctx;
@@ -70,13 +70,12 @@ static void image_pool_destructor(void *ptr)
mp_image_pool_clear(pool);
}
-struct mp_image_pool *mp_image_pool_new(int max_count)
+// If tparent!=NULL, set it as talloc parent for the pool.
+struct mp_image_pool *mp_image_pool_new(void *tparent)
{
- struct mp_image_pool *pool = talloc_ptrtype(NULL, pool);
+ struct mp_image_pool *pool = talloc_ptrtype(tparent, pool);
talloc_set_destructor(pool, image_pool_destructor);
- *pool = (struct mp_image_pool) {
- .max_count = max_count,
- };
+ *pool = (struct mp_image_pool) {0};
return pool;
}
@@ -188,8 +187,11 @@ struct mp_image *mp_image_pool_get(struct mp_image_pool *pool, int fmt,
return mp_image_alloc(fmt, w, h);
struct mp_image *new = mp_image_pool_get_no_alloc(pool, fmt, w, h);
if (!new) {
- if (pool->num_images >= pool->max_count)
+ if (fmt != pool->fmt || w != pool->w || h != pool->h)
mp_image_pool_clear(pool);
+ pool->fmt = fmt;
+ pool->w = w;
+ pool->h = h;
if (pool->allocator) {
new = pool->allocator(pool->allocator_ctx, fmt, w, h);
} else {
diff --git a/video/mp_image_pool.h b/video/mp_image_pool.h
index 5f570bc6f6..a49771ffbb 100644
--- a/video/mp_image_pool.h
+++ b/video/mp_image_pool.h
@@ -5,7 +5,7 @@
struct mp_image_pool;
-struct mp_image_pool *mp_image_pool_new(int max_count);
+struct mp_image_pool *mp_image_pool_new(void *tparent);
struct mp_image *mp_image_pool_get(struct mp_image_pool *pool, int fmt,
int w, int h);
// the reference to "new" is transferred to the pool
diff --git a/video/out/vo_vaapi.c b/video/out/vo_vaapi.c
index a3f701519d..c8ffffcb1e 100644
--- a/video/out/vo_vaapi.c
+++ b/video/out/vo_vaapi.c
@@ -816,7 +816,7 @@ static int preinit(struct vo *vo)
if (!p->image_formats)
goto fail;
- p->pool = mp_image_pool_new(MAX_OUTPUT_SURFACES + 3);
+ p->pool = mp_image_pool_new(p);
va_pool_set_allocator(p->pool, p->mpvaapi, VA_RT_FORMAT_YUV420);
int max_subpic_formats = vaMaxNumSubpictureFormats(p->display);