diff --git a/src/examples/video-play-pull.c b/src/examples/video-play-pull.c index bc66c6601..f0c5892ac 100644 --- a/src/examples/video-play-pull.c +++ b/src/examples/video-play-pull.c @@ -171,14 +171,15 @@ on_process(void *_data) /* copy video image in texture */ if (data->is_yuv) { sstride = data->stride; - SDL_UpdateYUVTexture(data->texture, - NULL, - sdata, - sstride, - SPA_PTROFF(sdata, sstride * data->size.height, void), - sstride / 2, - SPA_PTROFF(sdata, 5 * (sstride * data->size.height) / 4, void), - sstride / 2); + if (buf->n_datas == 1) { + SDL_UpdateTexture(data->texture, NULL, + sdata, sstride); + } else { + SDL_UpdateYUVTexture(data->texture, NULL, + sdata, sstride, + buf->datas[1].data, sstride / 2, + buf->datas[2].data, sstride / 2); + } } else { 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]; Uint32 sdl_format; void *d; - int32_t mult, size; + int32_t mult, size, blocks; /* NULL means to clear the 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, data->size.width, 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) { case SDL_PIXELFORMAT_YV12: case SDL_PIXELFORMAT_IYUV: + data->stride = data->size.width; size = (data->stride * data->size.height) * 3 / 2; 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; 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; + blocks = 1; 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, SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_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_stride, SPA_POD_Int(data->stride * mult), SPA_PARAM_BUFFERS_dataType, SPA_POD_CHOICE_FLAGS_Int((1<stride; if (buf->n_datas == 1) { - datas[0] = sdata; - datas[1] = SPA_PTROFF(sdata, sstride * data->size.height, void); - datas[2] = SPA_PTROFF(sdata, 5 * (sstride * data->size.height) / 4, void); + SDL_UpdateTexture(data->texture, NULL, + sdata, sstride); } else { datas[0] = sdata; datas[1] = buf->datas[1].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 { if (SDL_LockTexture(data->texture, NULL, &ddata, &dstride) < 0) { fprintf(stderr, "Couldn't lock texture: %s\n", SDL_GetError()); - goto done; } 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, data->size.width, 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) { case SDL_PIXELFORMAT_YV12: case SDL_PIXELFORMAT_IYUV: + data->stride = data->size.width; size = (data->stride * data->size.height) * 3 / 2; data->is_yuv = true; blocks = 3; 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: + 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; blocks = 1; break; diff --git a/src/examples/video-src.c b/src/examples/video-src.c index f439f168e..92db5ff78 100644 --- a/src/examples/video-src.c +++ b/src/examples/video-src.c @@ -172,7 +172,7 @@ static void on_stream_state_changed(void *_data, enum pw_stream_state old, enum { 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) { case PW_STREAM_STATE_ERROR: