mp_image_pool: add mp_image_pool_add

Provide a way for the user to add mp_images to the pool. This is required for
dxva2, for which using set_allocator is extremely awkward since all the d3d9
surfaces must be allocated in advance and all together.
This commit is contained in:
Kevin Mitchell 2016-02-15 16:04:52 -08:00
parent cd0a34feb3
commit 01743f4ecd
2 changed files with 11 additions and 4 deletions

View File

@ -164,6 +164,14 @@ struct mp_image *mp_image_pool_get_no_alloc(struct mp_image_pool *pool, int fmt,
return ref; return ref;
} }
void mp_image_pool_add(struct mp_image_pool *pool, struct mp_image *new)
{
struct image_flags *it = talloc_ptrtype(new, it);
*it = (struct image_flags) { .pool_alive = true };
new->priv = it;
MP_TARRAY_APPEND(pool, pool->images, pool->num_images, new);
}
// Return a new image of given format/size. The only difference to // Return a new image of given format/size. The only difference to
// mp_image_alloc() is that there is a transparent mechanism to recycle image // mp_image_alloc() is that there is a transparent mechanism to recycle image
// data allocations through this pool. // data allocations through this pool.
@ -186,10 +194,7 @@ struct mp_image *mp_image_pool_get(struct mp_image_pool *pool, int fmt,
} }
if (!new) if (!new)
return NULL; return NULL;
struct image_flags *it = talloc_ptrtype(new, it); mp_image_pool_add(pool, new);
*it = (struct image_flags) { .pool_alive = true };
new->priv = it;
MP_TARRAY_APPEND(pool, pool->images, pool->num_images, new);
new = mp_image_pool_get_no_alloc(pool, fmt, w, h); new = mp_image_pool_get_no_alloc(pool, fmt, w, h);
} }
return new; return new;

View File

@ -8,6 +8,8 @@ struct mp_image_pool;
struct mp_image_pool *mp_image_pool_new(int max_count); struct mp_image_pool *mp_image_pool_new(int max_count);
struct mp_image *mp_image_pool_get(struct mp_image_pool *pool, int fmt, struct mp_image *mp_image_pool_get(struct mp_image_pool *pool, int fmt,
int w, int h); int w, int h);
// the reference to "new" is transferred to the pool
void mp_image_pool_add(struct mp_image_pool *pool, struct mp_image *new);
void mp_image_pool_clear(struct mp_image_pool *pool); void mp_image_pool_clear(struct mp_image_pool *pool);
void mp_image_pool_set_lru(struct mp_image_pool *pool); void mp_image_pool_set_lru(struct mp_image_pool *pool);