video-src: make size dynamic

This commit is contained in:
Wim Taymans 2017-04-19 11:31:51 +02:00
parent 50a7240a52
commit 7ef4fea2f2

View file

@ -50,10 +50,7 @@ init_type (Type *type, SpaTypeMap *map)
spa_type_video_format_map (map, &type->video_format); spa_type_video_format_map (map, &type->video_format);
} }
#define WIDTH 320
#define HEIGHT 240
#define BPP 3 #define BPP 3
#define STRIDE (BPP * WIDTH)
typedef struct { typedef struct {
Type type; Type type;
@ -70,6 +67,7 @@ typedef struct {
PinosListener on_stream_format_changed; PinosListener on_stream_format_changed;
SpaVideoInfoRaw format; SpaVideoInfoRaw format;
int32_t stride;
uint8_t params_buffer[1024]; uint8_t params_buffer[1024];
int counter; int counter;
@ -103,11 +101,11 @@ on_timeout (SpaLoopUtils *utils,
} else } else
return; return;
for (i = 0; i < HEIGHT; i++) { for (i = 0; i < data->format.size.height; i++) {
for (j = 0; j < WIDTH * BPP; j++) { for (j = 0; j < data->format.size.width * BPP; j++) {
p[j] = data->counter + j * i; p[j] = data->counter + j * i;
} }
p += STRIDE; p += buf->datas[0].chunk->stride;
data->counter += 13; data->counter += 13;
} }
@ -173,10 +171,15 @@ on_stream_format_changed (PinosListener *listener,
SpaAllocParam *params[2]; SpaAllocParam *params[2];
if (format) { if (format) {
spa_format_video_raw_parse (format, &data->format, &data->type.format_video);
data->stride = SPA_ROUND_UP_N (data->format.size.width * BPP, 4);
spa_pod_builder_init (&b, data->params_buffer, sizeof (data->params_buffer)); spa_pod_builder_init (&b, data->params_buffer, sizeof (data->params_buffer));
spa_pod_builder_object (&b, &f[0], 0, ctx->type.alloc_param_buffers.Buffers, spa_pod_builder_object (&b, &f[0], 0, ctx->type.alloc_param_buffers.Buffers,
PROP (&f[1], ctx->type.alloc_param_buffers.size, SPA_POD_TYPE_INT, STRIDE * HEIGHT), PROP (&f[1], ctx->type.alloc_param_buffers.size, SPA_POD_TYPE_INT,
PROP (&f[1], ctx->type.alloc_param_buffers.stride, SPA_POD_TYPE_INT, STRIDE), data->stride * data->format.size.height),
PROP (&f[1], ctx->type.alloc_param_buffers.stride, SPA_POD_TYPE_INT, data->stride),
PROP_U_MM (&f[1], ctx->type.alloc_param_buffers.buffers, SPA_POD_TYPE_INT, 32, 2, 32), PROP_U_MM (&f[1], ctx->type.alloc_param_buffers.buffers, SPA_POD_TYPE_INT, 32, 2, 32),
PROP (&f[1], ctx->type.alloc_param_buffers.align, SPA_POD_TYPE_INT, 16)); PROP (&f[1], ctx->type.alloc_param_buffers.align, SPA_POD_TYPE_INT, 16));
params[0] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam); params[0] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
@ -218,7 +221,9 @@ on_state_changed (PinosListener *listener,
spa_pod_builder_format (&b, &f[0], data->type.format, spa_pod_builder_format (&b, &f[0], data->type.format,
data->type.media_type.video, data->type.media_subtype.raw, data->type.media_type.video, data->type.media_subtype.raw,
PROP (&f[1], data->type.format_video.format, SPA_POD_TYPE_ID, data->type.video_format.RGB), PROP (&f[1], data->type.format_video.format, SPA_POD_TYPE_ID, data->type.video_format.RGB),
PROP (&f[1], data->type.format_video.size, SPA_POD_TYPE_RECTANGLE, WIDTH, HEIGHT), PROP_U_MM (&f[1], data->type.format_video.size, SPA_POD_TYPE_RECTANGLE, 320, 240,
1, 1,
4096, 4096),
PROP (&f[1], data->type.format_video.framerate, SPA_POD_TYPE_FRACTION, 25, 1)); PROP (&f[1], data->type.format_video.framerate, SPA_POD_TYPE_FRACTION, 25, 1));
formats[0] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaFormat); formats[0] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaFormat);