diff --git a/plugins/linux-pipewire/pipewire.c b/plugins/linux-pipewire/pipewire.c index 53b8faadc..82cdf31ae 100644 --- a/plugins/linux-pipewire/pipewire.c +++ b/plugins/linux-pipewire/pipewire.c @@ -253,13 +253,15 @@ static bool push_rotation(obs_pipewire_stream *obs_pw_stream) return rotation != 0; } -static const struct { +struct format_data { uint32_t spa_format; uint32_t drm_format; enum gs_color_format gs_format; bool swap_red_blue; const char *pretty_name; -} supported_formats[] = { +}; + +static const struct format_data supported_formats[] = { { SPA_VIDEO_FORMAT_BGRA, DRM_FORMAT_ARGB8888, @@ -311,20 +313,17 @@ static const struct { #define N_SUPPORTED_FORMATS \ (sizeof(supported_formats) / sizeof(supported_formats[0])) -static bool lookup_format_info_from_spa_format( - uint32_t spa_format, uint32_t *out_drm_format, - enum gs_color_format *out_gs_format, bool *out_swap_red_blue) +static bool +lookup_format_info_from_spa_format(uint32_t spa_format, + struct format_data *out_format_data) { for (size_t i = 0; i < N_SUPPORTED_FORMATS; i++) { if (supported_formats[i].spa_format != spa_format) continue; - if (out_drm_format) - *out_drm_format = supported_formats[i].drm_format; - if (out_gs_format) - *out_gs_format = supported_formats[i].gs_format; - if (out_swap_red_blue) - *out_swap_red_blue = supported_formats[i].swap_red_blue; + if (out_format_data) + *out_format_data = supported_formats[i]; + return true; } return false; @@ -579,6 +578,7 @@ static void on_process_cb(void *user_data) struct spa_meta_header *header; struct spa_meta_region *region; struct spa_meta_videotransform *video_transform; + struct format_data format_data; struct spa_buffer *buffer; struct pw_buffer *b; bool swap_red_blue = false; @@ -638,8 +638,8 @@ static void on_process_cb(void *user_data) #endif if (!lookup_format_info_from_spa_format( - obs_pw_stream->format.info.raw.format, &drm_format, - NULL, NULL)) { + obs_pw_stream->format.info.raw.format, + &format_data)) { blog(LOG_ERROR, "[pipewire] unsupported DMA buffer format: %d", obs_pw_stream->format.info.raw.format); @@ -668,9 +668,9 @@ static void on_process_cb(void *user_data) DRM_FORMAT_MOD_INVALID; obs_pw_stream->texture = gs_texture_create_from_dmabuf( obs_pw_stream->format.info.raw.size.width, - obs_pw_stream->format.info.raw.size.height, drm_format, - GS_BGRX, planes, fds, strides, offsets, - use_modifiers ? modifiers : NULL); + obs_pw_stream->format.info.raw.size.height, + format_data.drm_format, GS_BGRX, planes, fds, strides, + offsets, use_modifiers ? modifiers : NULL); if (obs_pw_stream->texture == NULL) { remove_modifier_from_format( @@ -684,11 +684,10 @@ static void on_process_cb(void *user_data) } } else { blog(LOG_DEBUG, "[pipewire] Buffer has memory texture"); - enum gs_color_format gs_format; if (!lookup_format_info_from_spa_format( - obs_pw_stream->format.info.raw.format, NULL, - &gs_format, &swap_red_blue)) { + obs_pw_stream->format.info.raw.format, + &format_data)) { blog(LOG_ERROR, "[pipewire] unsupported buffer format: %d", obs_pw_stream->format.info.raw.format); @@ -711,9 +710,9 @@ static void on_process_cb(void *user_data) g_clear_pointer(&obs_pw_stream->texture, gs_texture_destroy); obs_pw_stream->texture = gs_texture_create( obs_pw_stream->format.info.raw.size.width, - obs_pw_stream->format.info.raw.size.height, gs_format, - 1, (const uint8_t **)&buffer->datas[0].data, - GS_DYNAMIC); + obs_pw_stream->format.info.raw.size.height, + format_data.gs_format, 1, + (const uint8_t **)&buffer->datas[0].data, GS_DYNAMIC); } if (swap_red_blue) @@ -756,7 +755,6 @@ read_metadata: spa_meta_cursor_is_valid(cursor); if (obs_pw_stream->cursor.visible && obs_pw_stream->cursor.valid) { struct spa_meta_bitmap *bitmap = NULL; - enum gs_color_format gs_format; if (cursor->bitmap_offset) bitmap = SPA_MEMBER(cursor, cursor->bitmap_offset, @@ -768,8 +766,8 @@ read_metadata: if (bitmap && bitmap->size.width > 0 && bitmap->size.height > 0 && - lookup_format_info_from_spa_format( - bitmap->format, NULL, &gs_format, &swap_red_blue)) { + lookup_format_info_from_spa_format(bitmap->format, + &format_data)) { const uint8_t *bitmap_data; bitmap_data = @@ -780,10 +778,11 @@ read_metadata: obs_pw_stream->cursor.height = bitmap->size.height; assert(obs_pw_stream->cursor.texture == NULL); - obs_pw_stream->cursor.texture = gs_texture_create( - obs_pw_stream->cursor.width, - obs_pw_stream->cursor.height, gs_format, 1, - &bitmap_data, GS_DYNAMIC); + obs_pw_stream->cursor.texture = + gs_texture_create(obs_pw_stream->cursor.width, + obs_pw_stream->cursor.height, + format_data.gs_format, 1, + &bitmap_data, GS_DYNAMIC); if (swap_red_blue) swap_texture_red_blue(