Commit 84f1839b authored by Laurent Aimar's avatar 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.
parent 70092cf6
...@@ -239,7 +239,7 @@ static int CreateSurfaces( vlc_va_vaapi_t *p_va, void **pp_hw_ctx, vlc_fourcc_t ...@@ -239,7 +239,7 @@ static int CreateSurfaces( vlc_va_vaapi_t *p_va, void **pp_hw_ctx, vlc_fourcc_t
goto error; goto error;
} }
/* Find a supported image chroma */ /* Find and create a supported image chroma */
int i_fmt_count = vaMaxNumImageFormats( p_va->p_display ); int i_fmt_count = vaMaxNumImageFormats( p_va->p_display );
VAImageFormat *p_fmt = calloc( i_fmt_count, sizeof(*p_fmt) ); VAImageFormat *p_fmt = calloc( i_fmt_count, sizeof(*p_fmt) );
if( !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 ...@@ -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( 'I', '4', '2', '0' ) ||
p_fmt[i].fourcc == VA_FOURCC( 'N', 'V', '1', '2' ) ) 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; i_chroma = VLC_CODEC_YV12;
fmt = p_fmt[i]; fmt = p_fmt[i];
break; break;
...@@ -269,12 +284,6 @@ static int CreateSurfaces( vlc_va_vaapi_t *p_va, void **pp_hw_ctx, vlc_fourcc_t ...@@ -269,12 +284,6 @@ static int CreateSurfaces( vlc_va_vaapi_t *p_va, void **pp_hw_ctx, vlc_fourcc_t
goto error; goto error;
*pi_chroma = i_chroma; *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 ); CopyInitCache( &p_va->image_cache, i_width );
/* Setup the ffmpeg hardware context */ /* Setup the ffmpeg hardware context */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment