mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-29 05:40:27 -04:00
examples: fix texture updates
This commit is contained in:
parent
0b08468035
commit
144c3630ea
3 changed files with 44 additions and 31 deletions
|
|
@ -171,14 +171,15 @@ on_process(void *_data)
|
||||||
/* copy video image in texture */
|
/* copy video image in texture */
|
||||||
if (data->is_yuv) {
|
if (data->is_yuv) {
|
||||||
sstride = data->stride;
|
sstride = data->stride;
|
||||||
SDL_UpdateYUVTexture(data->texture,
|
if (buf->n_datas == 1) {
|
||||||
NULL,
|
SDL_UpdateTexture(data->texture, NULL,
|
||||||
sdata,
|
sdata, sstride);
|
||||||
sstride,
|
} else {
|
||||||
SPA_PTROFF(sdata, sstride * data->size.height, void),
|
SDL_UpdateYUVTexture(data->texture, NULL,
|
||||||
sstride / 2,
|
sdata, sstride,
|
||||||
SPA_PTROFF(sdata, 5 * (sstride * data->size.height) / 4, void),
|
buf->datas[1].data, sstride / 2,
|
||||||
sstride / 2);
|
buf->datas[2].data, sstride / 2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (SDL_LockTexture(data->texture, NULL, &ddata, &dstride) < 0) {
|
if (SDL_LockTexture(data->texture, NULL, &ddata, &dstride) < 0) {
|
||||||
|
|
@ -331,7 +332,7 @@ on_stream_param_changed(void *_data, uint32_t id, const struct spa_pod *param)
|
||||||
const struct spa_pod *params[5];
|
const struct spa_pod *params[5];
|
||||||
Uint32 sdl_format;
|
Uint32 sdl_format;
|
||||||
void *d;
|
void *d;
|
||||||
int32_t mult, size;
|
int32_t mult, size, blocks;
|
||||||
|
|
||||||
/* NULL means to clear the format */
|
/* NULL means to clear the format */
|
||||||
if (param == NULL || id != SPA_PARAM_Format)
|
if (param == NULL || id != SPA_PARAM_Format)
|
||||||
|
|
@ -383,20 +384,29 @@ on_stream_param_changed(void *_data, uint32_t id, const struct spa_pod *param)
|
||||||
SDL_TEXTUREACCESS_STREAMING,
|
SDL_TEXTUREACCESS_STREAMING,
|
||||||
data->size.width,
|
data->size.width,
|
||||||
data->size.height);
|
data->size.height);
|
||||||
if (SDL_LockTexture(data->texture, NULL, &d, &data->stride) < 0) {
|
|
||||||
pw_stream_set_error(stream, -EINVAL, "invalid texture format");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
SDL_UnlockTexture(data->texture);
|
|
||||||
|
|
||||||
switch(sdl_format) {
|
switch(sdl_format) {
|
||||||
case SDL_PIXELFORMAT_YV12:
|
case SDL_PIXELFORMAT_YV12:
|
||||||
case SDL_PIXELFORMAT_IYUV:
|
case SDL_PIXELFORMAT_IYUV:
|
||||||
|
data->stride = data->size.width;
|
||||||
size = (data->stride * data->size.height) * 3 / 2;
|
size = (data->stride * data->size.height) * 3 / 2;
|
||||||
data->is_yuv = true;
|
data->is_yuv = true;
|
||||||
|
blocks = 3;
|
||||||
|
break;
|
||||||
|
case SDL_PIXELFORMAT_YUY2:
|
||||||
|
data->stride = data->size.width * 2;
|
||||||
|
size = data->stride * data->size.height;
|
||||||
|
data->is_yuv = true;
|
||||||
|
blocks = 1;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
if (SDL_LockTexture(data->texture, NULL, &d, &data->stride) < 0) {
|
||||||
|
data->stride = data->size.width * 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
SDL_UnlockTexture(data->texture);
|
||||||
size = data->stride * data->size.height;
|
size = data->stride * data->size.height;
|
||||||
|
blocks = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -410,7 +420,7 @@ on_stream_param_changed(void *_data, uint32_t id, const struct spa_pod *param)
|
||||||
params[0] = spa_pod_builder_add_object(&b,
|
params[0] = spa_pod_builder_add_object(&b,
|
||||||
SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers,
|
SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers,
|
||||||
SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int(8, 2, MAX_BUFFERS),
|
SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int(8, 2, MAX_BUFFERS),
|
||||||
SPA_PARAM_BUFFERS_blocks, SPA_POD_Int(1),
|
SPA_PARAM_BUFFERS_blocks, SPA_POD_Int(blocks),
|
||||||
SPA_PARAM_BUFFERS_size, SPA_POD_Int(size * mult),
|
SPA_PARAM_BUFFERS_size, SPA_POD_Int(size * mult),
|
||||||
SPA_PARAM_BUFFERS_stride, SPA_POD_Int(data->stride * mult),
|
SPA_PARAM_BUFFERS_stride, SPA_POD_Int(data->stride * mult),
|
||||||
SPA_PARAM_BUFFERS_dataType, SPA_POD_CHOICE_FLAGS_Int((1<<SPA_DATA_MemPtr)));
|
SPA_PARAM_BUFFERS_dataType, SPA_POD_CHOICE_FLAGS_Int((1<<SPA_DATA_MemPtr)));
|
||||||
|
|
|
||||||
|
|
@ -181,23 +181,21 @@ on_process(void *_data)
|
||||||
void *datas[4];
|
void *datas[4];
|
||||||
sstride = data->stride;
|
sstride = data->stride;
|
||||||
if (buf->n_datas == 1) {
|
if (buf->n_datas == 1) {
|
||||||
datas[0] = sdata;
|
SDL_UpdateTexture(data->texture, NULL,
|
||||||
datas[1] = SPA_PTROFF(sdata, sstride * data->size.height, void);
|
sdata, sstride);
|
||||||
datas[2] = SPA_PTROFF(sdata, 5 * (sstride * data->size.height) / 4, void);
|
|
||||||
} else {
|
} else {
|
||||||
datas[0] = sdata;
|
datas[0] = sdata;
|
||||||
datas[1] = buf->datas[1].data;
|
datas[1] = buf->datas[1].data;
|
||||||
datas[2] = buf->datas[2].data;
|
datas[2] = buf->datas[2].data;
|
||||||
|
SDL_UpdateYUVTexture(data->texture, NULL,
|
||||||
|
datas[0], sstride,
|
||||||
|
datas[1], sstride / 2,
|
||||||
|
datas[2], sstride / 2);
|
||||||
}
|
}
|
||||||
SDL_UpdateYUVTexture(data->texture, NULL,
|
|
||||||
datas[0], sstride,
|
|
||||||
datas[1], sstride / 2,
|
|
||||||
datas[2], sstride / 2);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (SDL_LockTexture(data->texture, NULL, &ddata, &dstride) < 0) {
|
if (SDL_LockTexture(data->texture, NULL, &ddata, &dstride) < 0) {
|
||||||
fprintf(stderr, "Couldn't lock texture: %s\n", SDL_GetError());
|
fprintf(stderr, "Couldn't lock texture: %s\n", SDL_GetError());
|
||||||
goto done;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sstride = buf->datas[0].chunk->stride;
|
sstride = buf->datas[0].chunk->stride;
|
||||||
|
|
@ -355,21 +353,26 @@ on_stream_param_changed(void *_data, uint32_t id, const struct spa_pod *param)
|
||||||
SDL_TEXTUREACCESS_STREAMING,
|
SDL_TEXTUREACCESS_STREAMING,
|
||||||
data->size.width,
|
data->size.width,
|
||||||
data->size.height);
|
data->size.height);
|
||||||
if (SDL_LockTexture(data->texture, NULL, &d, &data->stride) < 0) {
|
|
||||||
fprintf(stderr, "Couldn't lock texture: %s\n", SDL_GetError());
|
|
||||||
pw_stream_set_error(stream, -EINVAL, "invalid format");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
SDL_UnlockTexture(data->texture);
|
|
||||||
|
|
||||||
switch(sdl_format) {
|
switch(sdl_format) {
|
||||||
case SDL_PIXELFORMAT_YV12:
|
case SDL_PIXELFORMAT_YV12:
|
||||||
case SDL_PIXELFORMAT_IYUV:
|
case SDL_PIXELFORMAT_IYUV:
|
||||||
|
data->stride = data->size.width;
|
||||||
size = (data->stride * data->size.height) * 3 / 2;
|
size = (data->stride * data->size.height) * 3 / 2;
|
||||||
data->is_yuv = true;
|
data->is_yuv = true;
|
||||||
blocks = 3;
|
blocks = 3;
|
||||||
break;
|
break;
|
||||||
|
case SDL_PIXELFORMAT_YUY2:
|
||||||
|
data->is_yuv = true;
|
||||||
|
data->stride = data->size.width * 2;
|
||||||
|
size = (data->stride * data->size.height);
|
||||||
|
blocks = 1;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
|
if (SDL_LockTexture(data->texture, NULL, &d, &data->stride) < 0) {
|
||||||
|
fprintf(stderr, "Couldn't lock texture: %s\n", SDL_GetError());
|
||||||
|
data->stride = data->size.width * 2;
|
||||||
|
} else
|
||||||
|
SDL_UnlockTexture(data->texture);
|
||||||
size = data->stride * data->size.height;
|
size = data->stride * data->size.height;
|
||||||
blocks = 1;
|
blocks = 1;
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -172,7 +172,7 @@ static void on_stream_state_changed(void *_data, enum pw_stream_state old, enum
|
||||||
{
|
{
|
||||||
struct data *data = _data;
|
struct data *data = _data;
|
||||||
|
|
||||||
printf("stream state: \"%s\"\n", pw_stream_state_as_string(state));
|
printf("stream state: \"%s\" %s\n", pw_stream_state_as_string(state), error ? error : "");
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case PW_STREAM_STATE_ERROR:
|
case PW_STREAM_STATE_ERROR:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue