[vlc-commits] commit: Fixed fourcc selection used for video extraction from vaapi. ( Laurent Aimar )

git at videolan.org git at videolan.org
Sun Jul 11 19:57:19 CEST 2010


vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Sun Jul 11 18:42:07 2010 +0200| [84f1839b2318ac0963bc37d43b078d5992e9e8db] | committer: Laurent Aimar 

Fixed fourcc selection used for video extraction from vaapi.

We now test that the selected fourcc actually works by calling vaGetImage.
Initial patch from Gwenole Beauchesne.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=84f1839b2318ac0963bc37d43b078d5992e9e8db
---

 modules/codec/avcodec/vaapi.c |   23 ++++++++++++++++-------
 1 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/modules/codec/avcodec/vaapi.c b/modules/codec/avcodec/vaapi.c
index 0cda561..08264cb 100644
--- a/modules/codec/avcodec/vaapi.c
+++ b/modules/codec/avcodec/vaapi.c
@@ -239,7 +239,7 @@ static int CreateSurfaces( vlc_va_vaapi_t *p_va, void **pp_hw_ctx, vlc_fourcc_t
         goto error;
     }
 
-    /* Find a supported image chroma */
+    /* Find and create a supported image chroma */
     int i_fmt_count = vaMaxNumImageFormats( p_va->p_display );
     VAImageFormat *p_fmt = calloc( i_fmt_count, sizeof(*p_fmt) );
     if( !p_fmt )
@@ -259,6 +259,21 @@ static int CreateSurfaces( vlc_va_vaapi_t *p_va, void **pp_hw_ctx, vlc_fourcc_t
             p_fmt[i].fourcc == VA_FOURCC( 'I', '4', '2', '0' ) ||
             p_fmt[i].fourcc == VA_FOURCC( 'N', 'V', '1', '2' ) )
         {
+            if( vaCreateImage(  p_va->p_display, &p_fmt[i], i_width, i_height, &p_va->image ) )
+            {
+                p_va->image.image_id = 0;
+                continue;
+            }
+            /* Validate that vaGetImage works with this format */
+            if( vaGetImage( p_va->p_display, pi_surface_id[0],
+                            0, 0, i_width, i_height,
+                            p_va->image.image_id) )
+            {
+                vaDestroyImage( p_va->p_display, p_va->image.image_id );
+                p_va->image.image_id = 0;
+                continue;
+            }
+
             i_chroma = VLC_CODEC_YV12;
             fmt = p_fmt[i];
             break;
@@ -269,12 +284,6 @@ static int CreateSurfaces( vlc_va_vaapi_t *p_va, void **pp_hw_ctx, vlc_fourcc_t
         goto error;
     *pi_chroma = i_chroma;
 
-    /* Create an image for surface extraction */
-    if( vaCreateImage(  p_va->p_display, &fmt, i_width, i_height, &p_va->image ) )
-    {
-        p_va->image.image_id = 0;
-        goto error;
-    }
     CopyInitCache( &p_va->image_cache, i_width );
 
     /* Setup the ffmpeg hardware context */



More information about the vlc-commits mailing list