meta: add video damage region metadata

Add damage region meta
Implement damage region in video-src and export-sink
This commit is contained in:
Wim Taymans 2018-07-09 12:07:30 +02:00
parent c98fbfe0a9
commit f49ab32874
5 changed files with 100 additions and 31 deletions

View file

@ -399,13 +399,24 @@ static int impl_port_enum_params(struct spa_node *node,
":", t->param_buffers.align, "i", 16);
}
else if (id == t->param.idMeta) {
if (*index != 0)
switch (*index) {
case 0:
param = spa_pod_builder_object(builder,
id, t->param_meta.Meta,
":", t->param_meta.type, "I", t->meta.Header,
":", t->param_meta.size, "i", sizeof(struct spa_meta_header));
break;
case 1:
param = spa_pod_builder_object(builder,
id, t->param_meta.Meta,
":", t->param_meta.type, "I", t->meta.VideoDamage,
":", t->param_meta.size, "iru", sizeof(struct spa_meta_region),
SPA_POD_PROP_MIN_MAX(1 * sizeof(struct spa_meta_region),
16 * sizeof(struct spa_meta_region)));
break;
default:
return 0;
param = spa_pod_builder_object(builder,
id, t->param_meta.Meta,
":", t->param_meta.type, "I", t->meta.Header,
":", t->param_meta.size, "i", sizeof(struct spa_meta_header));
}
}
else if (id == t->param_io.idPropsOut) {
struct props *p = &d->props;
@ -495,12 +506,15 @@ static int do_render(struct spa_loop *loop, bool async, uint32_t seq,
const void *_data, size_t size, void *user_data)
{
struct data *d = user_data;
struct pw_type *t = d->t;
const struct spa_buffer *buf = *(struct spa_buffer**)_data;
uint8_t *map;
void *sdata, *ddata;
int sstride, dstride, ostride;
uint32_t i;
uint8_t *src, *dst;
struct spa_meta *m;
struct spa_meta_region *r;
handle_events(d);
@ -519,6 +533,17 @@ static int do_render(struct spa_loop *loop, bool async, uint32_t seq,
fprintf(stderr, "Couldn't lock texture: %s\n", SDL_GetError());
return -EIO;
}
if ((m = spa_buffer_find_meta(buf, t->meta.VideoDamage))) {
spa_meta_region_for_each(r, m) {
if (!spa_meta_region_is_valid(r))
break;
fprintf(stderr, "region %dx%d->%dx%d\n",
r->region.position.x, r->region.position.y,
r->region.size.width, r->region.size.height);
}
}
sstride = buf->datas[0].chunk->stride;
ostride = SPA_MIN(sstride, dstride);

View file

@ -76,6 +76,7 @@ static void on_timeout(void *userdata, uint64_t expirations)
int i, j;
uint8_t *p, *map;
struct spa_meta_header *h;
struct spa_meta *m;
pw_log_trace("timeout");
@ -102,7 +103,7 @@ static void on_timeout(void *userdata, uint64_t expirations)
} else
return;
if ((h = spa_buffer_find_meta(buf, data->t->meta.Header))) {
if ((h = spa_buffer_find_meta_data(buf, data->t->meta.Header, sizeof(*h)))) {
#if 0
struct timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
@ -114,6 +115,17 @@ static void on_timeout(void *userdata, uint64_t expirations)
h->seq = data->seq++;
h->dts_offset = 0;
}
if ((m = spa_buffer_find_meta(buf, data->t->meta.VideoDamage))) {
struct spa_meta_region *r = spa_meta_first(m);
if (spa_meta_check(r, m)) {
r->region.position = SPA_POINT(0,0);
r->region.size = data->format.size;
r++;
}
if (spa_meta_check(r, m))
r->region = SPA_REGION(0,0,0,0);
}
for (i = 0; i < data->format.size.height; i++) {
for (j = 0; j < data->format.size.width * BPP; j++) {
@ -167,7 +179,7 @@ on_stream_format_changed(void *_data, const struct spa_pod *format)
struct pw_type *t = data->t;
uint8_t params_buffer[1024];
struct spa_pod_builder b = SPA_POD_BUILDER_INIT(params_buffer, sizeof(params_buffer));
const struct spa_pod *params[2];
const struct spa_pod *params[3];
if (format == NULL) {
pw_stream_finish_format(stream, 0, NULL, 0);
@ -190,7 +202,14 @@ on_stream_format_changed(void *_data, const struct spa_pod *format)
":", t->param_meta.type, "I", t->meta.Header,
":", t->param_meta.size, "i", sizeof(struct spa_meta_header));
pw_stream_finish_format(stream, 0, params, 2);
params[2] = spa_pod_builder_object(&b,
t->param.idMeta, t->param_meta.Meta,
":", t->param_meta.type, "I", t->meta.VideoDamage,
":", t->param_meta.size, "iru", sizeof(struct spa_meta_region) * 16,
SPA_POD_PROP_MIN_MAX(sizeof(struct spa_meta_region) * 1,
sizeof(struct spa_meta_region) * 16));
pw_stream_finish_format(stream, 0, params, 3);
}
static const struct pw_stream_events stream_events = {