sub: move RGBA scaling to vo_vaapi

vo_vaapi is the only thing which can't scale RGBA on the GPU. (Other
cases of RGBA scaling are handled in draw_bmp.c for some reason.)

Move this code and get rid of the osd_conv_cache thing.

Functionally, nothing changes.
This commit is contained in:
wm4 2016-07-03 19:29:43 +02:00
parent 37cf92c07a
commit 8ed32e90c9
3 changed files with 25 additions and 73 deletions

View File

@ -30,17 +30,6 @@
#include "video/mp_image.h" #include "video/mp_image.h"
#include "video/sws_utils.h" #include "video/sws_utils.h"
struct osd_conv_cache {
struct sub_bitmap part[MP_SUB_BB_LIST_MAX];
struct sub_bitmap *parts;
void *scratch;
};
struct osd_conv_cache *osd_conv_cache_new(void)
{
return talloc_zero(NULL, struct osd_conv_cache);
}
void mp_blur_rgba_sub_bitmap(struct sub_bitmap *d, double gblur) void mp_blur_rgba_sub_bitmap(struct sub_bitmap *d, double gblur)
{ {
struct mp_image *tmp1 = mp_image_alloc(IMGFMT_BGRA, d->w, d->h); struct mp_image *tmp1 = mp_image_alloc(IMGFMT_BGRA, d->w, d->h);
@ -58,57 +47,6 @@ void mp_blur_rgba_sub_bitmap(struct sub_bitmap *d, double gblur)
talloc_free(tmp1); talloc_free(tmp1);
} }
// If RGBA parts need scaling, scale them.
bool osd_scale_rgba(struct osd_conv_cache *c, struct sub_bitmaps *imgs)
{
struct sub_bitmaps src = *imgs;
if (src.format != SUBBITMAP_RGBA)
return false;
bool need_scale = false;
for (int n = 0; n < src.num_parts; n++) {
struct sub_bitmap *sb = &src.parts[n];
if (sb->w != sb->dw || sb->h != sb->dh)
need_scale = true;
}
if (!need_scale)
return false;
talloc_free(c->parts);
imgs->parts = c->parts = talloc_array(c, struct sub_bitmap, src.num_parts);
imgs->packed = NULL;
// Note: we scale all parts, since most likely all need scaling anyway, and
// to get a proper copy of all data in the imgs list.
for (int n = 0; n < src.num_parts; n++) {
struct sub_bitmap *d = &imgs->parts[n];
struct sub_bitmap *s = &src.parts[n];
struct mp_image src_image = {0};
mp_image_setfmt(&src_image, IMGFMT_BGRA);
mp_image_set_size(&src_image, s->w, s->h);
src_image.planes[0] = s->bitmap;
src_image.stride[0] = s->stride;
d->x = s->x;
d->y = s->y;
d->w = d->dw = s->dw;
d->h = d->dh = s->dh;
struct mp_image *image = mp_image_alloc(IMGFMT_BGRA, d->w, d->h);
talloc_steal(c->parts, image);
if (image) {
d->stride = image->stride[0];
d->bitmap = image->planes[0];
mp_image_swscale(image, &src_image, mp_sws_fast_flags);
} else {
// on OOM, skip the region; just don't scale it
*d = *s;
}
}
return true;
}
bool mp_sub_bitmaps_bb(struct sub_bitmaps *imgs, struct mp_rect *out_bb) bool mp_sub_bitmaps_bb(struct sub_bitmaps *imgs, struct mp_rect *out_bb)
{ {
struct mp_rect bb = {INT_MAX, INT_MAX, INT_MIN, INT_MIN}; struct mp_rect bb = {INT_MAX, INT_MAX, INT_MIN, INT_MIN};

View File

@ -3,16 +3,12 @@
#include <stdbool.h> #include <stdbool.h>
struct osd_conv_cache;
struct sub_bitmaps; struct sub_bitmaps;
struct sub_bitmap; struct sub_bitmap;
struct mp_rect; struct mp_rect;
struct osd_conv_cache *osd_conv_cache_new(void);
// Sub postprocessing // Sub postprocessing
void mp_blur_rgba_sub_bitmap(struct sub_bitmap *d, double gblur); void mp_blur_rgba_sub_bitmap(struct sub_bitmap *d, double gblur);
bool osd_scale_rgba(struct osd_conv_cache *c, struct sub_bitmaps *imgs);
bool mp_sub_bitmaps_bb(struct sub_bitmaps *imgs, struct mp_rect *out_bb); bool mp_sub_bitmaps_bb(struct sub_bitmaps *imgs, struct mp_rect *out_bb);

View File

@ -32,8 +32,9 @@
#include "common/msg.h" #include "common/msg.h"
#include "video/out/vo.h" #include "video/out/vo.h"
#include "video/mp_image_pool.h" #include "video/mp_image_pool.h"
#include "sub/osd.h" #include "video/sws_utils.h"
#include "sub/img_convert.h" #include "sub/img_convert.h"
#include "sub/osd.h"
#include "x11_common.h" #include "x11_common.h"
#include "video/mp_image.h" #include "video/mp_image.h"
@ -58,7 +59,6 @@ struct vaapi_osd_part {
int change_id; int change_id;
struct vaapi_osd_image image; struct vaapi_osd_image image;
struct vaapi_subpic subpic; struct vaapi_subpic subpic;
struct osd_conv_cache *conv_cache;
}; };
#define MAX_OUTPUT_SURFACES 2 #define MAX_OUTPUT_SURFACES 2
@ -336,8 +336,6 @@ static void draw_osd_cb(void *pctx, struct sub_bitmaps *imgs)
if (imgs->change_id != part->change_id) { if (imgs->change_id != part->change_id) {
part->change_id = imgs->change_id; part->change_id = imgs->change_id;
osd_scale_rgba(part->conv_cache, imgs);
struct mp_rect bb; struct mp_rect bb;
if (!mp_sub_bitmaps_bb(imgs, &bb)) if (!mp_sub_bitmaps_bb(imgs, &bb))
goto error; goto error;
@ -365,6 +363,25 @@ static void draw_osd_cb(void *pctx, struct sub_bitmaps *imgs)
for (int n = 0; n < imgs->num_parts; n++) { for (int n = 0; n < imgs->num_parts; n++) {
struct sub_bitmap *sub = &imgs->parts[n]; struct sub_bitmap *sub = &imgs->parts[n];
struct mp_image src = {0};
mp_image_setfmt(&src, IMGFMT_BGRA);
mp_image_set_size(&src, sub->w, sub->h);
src.planes[0] = sub->bitmap;
src.stride[0] = sub->stride;
struct mp_image *bmp = &src;
struct mp_image *tmp = NULL;
if (sub->dw != sub->w || sub->dh != sub->h) {
tmp = mp_image_alloc(IMGFMT_BGRA, sub->dw, sub->dh);
if (!tmp)
goto error;
mp_image_swscale(tmp, &src, mp_sws_fast_flags);
bmp = tmp;
}
// Note: nothing guarantees that the sub-bitmaps don't overlap. // Note: nothing guarantees that the sub-bitmaps don't overlap.
// But in all currently existing cases, they don't. // But in all currently existing cases, they don't.
// We simply hope that this won't change, and nobody will // We simply hope that this won't change, and nobody will
@ -373,8 +390,10 @@ static void draw_osd_cb(void *pctx, struct sub_bitmaps *imgs)
size_t dst = (sub->y - bb.y0) * vaimg.stride[0] + size_t dst = (sub->y - bb.y0) * vaimg.stride[0] +
(sub->x - bb.x0) * 4; (sub->x - bb.x0) * 4;
memcpy_pic(vaimg.planes[0] + dst, sub->bitmap, sub->w * 4, sub->h, memcpy_pic(vaimg.planes[0] + dst, bmp->planes[0], sub->dw * 4,
vaimg.stride[0], sub->stride); sub->dh, vaimg.stride[0], bmp->stride[0]);
talloc_free(tmp);
} }
if (!va_image_unmap(p->mpvaapi, &img->image)) if (!va_image_unmap(p->mpvaapi, &img->image))
@ -630,7 +649,6 @@ static int preinit(struct vo *vo)
struct vaapi_osd_part *part = &p->osd_parts[n]; struct vaapi_osd_part *part = &p->osd_parts[n];
part->image.image.image_id = VA_INVALID_ID; part->image.image.image_id = VA_INVALID_ID;
part->image.subpic_id = VA_INVALID_ID; part->image.subpic_id = VA_INVALID_ID;
part->conv_cache = talloc_steal(vo, osd_conv_cache_new());
} }
int max_display_attrs = vaMaxNumDisplayAttributes(p->display); int max_display_attrs = vaMaxNumDisplayAttributes(p->display);