waylandsink: handle the list of supported formats properly

enum wl_shm_format is not a flags enum, as it may have been in the past,
so multiple formats cannot be stored in a bitfield. Use an array instead.
This commit is contained in:
George Kiagiadakis 2014-02-26 18:35:29 +02:00
parent 873671f2b6
commit 26ce7f2344
4 changed files with 26 additions and 11 deletions

View file

@ -219,29 +219,37 @@ gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
GstWaylandSink *sink; GstWaylandSink *sink;
GstBufferPool *newpool; GstBufferPool *newpool;
GstVideoInfo info; GstVideoInfo info;
enum wl_shm_format format;
GArray *formats;
gint i;
GstStructure *structure; GstStructure *structure;
static GstAllocationParams params = { 0, 0, 0, 15, }; static GstAllocationParams params = { 0, 0, 0, 15, };
guint size;
sink = GST_WAYLAND_SINK (bsink); sink = GST_WAYLAND_SINK (bsink);
GST_LOG_OBJECT (sink, "set caps %" GST_PTR_FORMAT, caps); GST_LOG_OBJECT (sink, "set caps %" GST_PTR_FORMAT, caps);
/* extract info from caps */
if (!gst_video_info_from_caps (&info, caps)) if (!gst_video_info_from_caps (&info, caps))
goto invalid_format; goto invalid_format;
if (!gst_wayland_sink_format_from_caps (&sink->format, caps)) format = gst_video_format_to_wayland_format (GST_VIDEO_INFO_FORMAT (&info));
if (format == -1)
goto invalid_format; goto invalid_format;
if (!(sink->display->formats & (1 << sink->format))) { /* verify we support the requested format */
GST_DEBUG_OBJECT (sink, "%s not available", formats = sink->display->formats;
gst_wayland_format_to_string (sink->format)); for (i = 0; i < formats->len; i++) {
return FALSE; if (g_array_index (formats, uint32_t, i) == format)
break;
} }
if (i >= formats->len)
goto unsupported_format;
/* store the video size */
sink->video_width = info.width; sink->video_width = info.width;
sink->video_height = info.height; sink->video_height = info.height;
size = info.size;
/* create a new pool for the new configuration */ /* create a new pool for the new configuration */
newpool = gst_wayland_buffer_pool_new (sink->display); newpool = gst_wayland_buffer_pool_new (sink->display);
@ -252,7 +260,7 @@ gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
} }
structure = gst_buffer_pool_get_config (newpool); structure = gst_buffer_pool_get_config (newpool);
gst_buffer_pool_config_set_params (structure, caps, size, 2, 0); gst_buffer_pool_config_set_params (structure, caps, info.size, 2, 0);
gst_buffer_pool_config_set_allocator (structure, NULL, &params); gst_buffer_pool_config_set_allocator (structure, NULL, &params);
if (!gst_buffer_pool_set_config (newpool, structure)) if (!gst_buffer_pool_set_config (newpool, structure))
goto config_failed; goto config_failed;
@ -268,6 +276,12 @@ invalid_format:
"Could not locate image format from caps %" GST_PTR_FORMAT, caps); "Could not locate image format from caps %" GST_PTR_FORMAT, caps);
return FALSE; return FALSE;
} }
unsupported_format:
{
GST_DEBUG_OBJECT (sink, "Format %s is not available on the display",
gst_wayland_format_to_string (format));
return FALSE;
}
config_failed: config_failed:
{ {
GST_DEBUG_OBJECT (bsink, "failed setting config"); GST_DEBUG_OBJECT (bsink, "failed setting config");

View file

@ -58,7 +58,6 @@ struct _GstWaylandSink
gint video_width; gint video_width;
gint video_height; gint video_height;
enum wl_shm_format format;
gchar *display_name; gchar *display_name;
}; };

View file

@ -43,6 +43,7 @@ gst_wl_display_class_init (GstWlDisplayClass * klass)
static void static void
gst_wl_display_init (GstWlDisplay * self) gst_wl_display_init (GstWlDisplay * self)
{ {
self->formats = g_array_new (FALSE, FALSE, sizeof (uint32_t));
self->wl_fd_poll = gst_poll_new (TRUE); self->wl_fd_poll = gst_poll_new (TRUE);
} }
@ -56,6 +57,7 @@ gst_wl_display_finalize (GObject * gobject)
if (self->thread) if (self->thread)
g_thread_join (self->thread); g_thread_join (self->thread);
g_array_unref (self->formats);
gst_poll_free (self->wl_fd_poll); gst_poll_free (self->wl_fd_poll);
if (self->shm) if (self->shm)
@ -117,7 +119,7 @@ shm_format (void *data, struct wl_shm *wl_shm, uint32_t format)
{ {
GstWlDisplay *self = data; GstWlDisplay *self = data;
self->formats |= (1 << format); g_array_append_val (self->formats, format);
} }
static const struct wl_shm_listener shm_listener = { static const struct wl_shm_listener shm_listener = {

View file

@ -47,7 +47,7 @@ struct _GstWlDisplay
struct wl_compositor *compositor; struct wl_compositor *compositor;
struct wl_shell *shell; struct wl_shell *shell;
struct wl_shm *shm; struct wl_shm *shm;
guint32 formats; GArray *formats;
/* private */ /* private */
gboolean own_display; gboolean own_display;