From 8f7183dc8539b87033b69fab4c98e0f57f44b2be Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Mon, 30 May 2011 08:48:29 +0200 Subject: [PATCH] dfbvideosink: Also consider non-accelerated DirectFB surfaces Fixes bug #631390. --- ext/directfb/dfbvideosink.c | 85 +++++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 37 deletions(-) diff --git a/ext/directfb/dfbvideosink.c b/ext/directfb/dfbvideosink.c index d8bb6d9..39d8fc7 100644 --- a/ext/directfb/dfbvideosink.c +++ b/ext/directfb/dfbvideosink.c @@ -998,7 +998,7 @@ beach: static gboolean gst_dfbvideosink_can_blit_from_format (GstDfbVideoSink * dfbvideosink, - DFBSurfacePixelFormat format) + DFBSurfacePixelFormat format, gboolean accelerated) { gboolean res = FALSE; DFBResult ret; @@ -1058,14 +1058,14 @@ gst_dfbvideosink_can_blit_from_format (GstDfbVideoSink * dfbvideosink, } /* Blitting from this format to our primary is accelerated */ - if (mask & DFXL_BLIT) { + if ((mask & DFXL_BLIT) && accelerated) { GST_DEBUG_OBJECT (dfbvideosink, "blitting from format %s to our primary " "is accelerated", gst_dfbvideosink_get_format_name (format)); res = TRUE; - } else { + } else if (!accelerated) { GST_DEBUG_OBJECT (dfbvideosink, "blitting from format %s to our primary " "is not accelerated", gst_dfbvideosink_get_format_name (format)); - res = FALSE; + res = TRUE; } /* Restore original layer configuration */ @@ -1165,41 +1165,52 @@ gst_dfbvideosink_getcaps (GstBaseSink * bsink) caps = gst_dfbvideosink_get_caps_from_format (dfbvideosink->pixel_format); } else { /* Try some formats */ + gboolean accelerated = TRUE; caps = gst_caps_new_empty (); - if (gst_dfbvideosink_can_blit_from_format (dfbvideosink, DSPF_RGB16)) { - gst_caps_append (caps, - gst_dfbvideosink_get_caps_from_format (DSPF_RGB16)); - } - if (gst_dfbvideosink_can_blit_from_format (dfbvideosink, DSPF_RGB24)) { - gst_caps_append (caps, - gst_dfbvideosink_get_caps_from_format (DSPF_RGB24)); - } - /* There's something wrong with RGB32, ffmpegcolorspace ? - if (gst_dfbvideosink_can_blit_from_format (dfbvideosink, DSPF_RGB32)) { - gst_caps_append (caps, - gst_dfbvideosink_get_caps_from_format (DSPF_RGB32)); - } */ - if (gst_dfbvideosink_can_blit_from_format (dfbvideosink, DSPF_ARGB)) { - gst_caps_append (caps, - gst_dfbvideosink_get_caps_from_format (DSPF_ARGB)); - } - if (gst_dfbvideosink_can_blit_from_format (dfbvideosink, DSPF_YUY2)) { - gst_caps_append (caps, - gst_dfbvideosink_get_caps_from_format (DSPF_YUY2)); - } - if (gst_dfbvideosink_can_blit_from_format (dfbvideosink, DSPF_UYVY)) { - gst_caps_append (caps, - gst_dfbvideosink_get_caps_from_format (DSPF_UYVY)); - } - if (gst_dfbvideosink_can_blit_from_format (dfbvideosink, DSPF_I420)) { - gst_caps_append (caps, - gst_dfbvideosink_get_caps_from_format (DSPF_I420)); - } - if (gst_dfbvideosink_can_blit_from_format (dfbvideosink, DSPF_YV12)) { - gst_caps_append (caps, - gst_dfbvideosink_get_caps_from_format (DSPF_YV12)); - } + do { + if (gst_dfbvideosink_can_blit_from_format (dfbvideosink, DSPF_RGB16, + accelerated)) { + gst_caps_append (caps, + gst_dfbvideosink_get_caps_from_format (DSPF_RGB16)); + } + if (gst_dfbvideosink_can_blit_from_format (dfbvideosink, DSPF_RGB24, + accelerated)) { + gst_caps_append (caps, + gst_dfbvideosink_get_caps_from_format (DSPF_RGB24)); + } + if (gst_dfbvideosink_can_blit_from_format (dfbvideosink, DSPF_RGB32, + accelerated)) { + gst_caps_append (caps, + gst_dfbvideosink_get_caps_from_format (DSPF_RGB32)); + } + if (gst_dfbvideosink_can_blit_from_format (dfbvideosink, DSPF_ARGB, + accelerated)) { + gst_caps_append (caps, + gst_dfbvideosink_get_caps_from_format (DSPF_ARGB)); + } + if (gst_dfbvideosink_can_blit_from_format (dfbvideosink, DSPF_YUY2, + accelerated)) { + gst_caps_append (caps, + gst_dfbvideosink_get_caps_from_format (DSPF_YUY2)); + } + if (gst_dfbvideosink_can_blit_from_format (dfbvideosink, DSPF_UYVY, + accelerated)) { + gst_caps_append (caps, + gst_dfbvideosink_get_caps_from_format (DSPF_UYVY)); + } + if (gst_dfbvideosink_can_blit_from_format (dfbvideosink, DSPF_I420, + accelerated)) { + gst_caps_append (caps, + gst_dfbvideosink_get_caps_from_format (DSPF_I420)); + } + if (gst_dfbvideosink_can_blit_from_format (dfbvideosink, DSPF_YV12, + accelerated)) { + gst_caps_append (caps, + gst_dfbvideosink_get_caps_from_format (DSPF_YV12)); + } + accelerated = !accelerated; + } while (accelerated == FALSE); } } -- 2.7.4