Commit 90485043 authored by Laurent Aimar's avatar Laurent Aimar Committed by Rémi Duraffort

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.
(cherry picked from commit 84f1839b2318ac0963bc37d43b078d5992e9e8db)
Signed-off-by: default avatarRémi Duraffort <ivoire@videolan.org>
parent c1322a08
...@@ -236,7 +236,7 @@ static int CreateSurfaces( vlc_va_vaapi_t *p_va, void **pp_hw_ctx, vlc_fourcc_t ...@@ -236,7 +236,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 )
...@@ -256,6 +256,21 @@ static int CreateSurfaces( vlc_va_vaapi_t *p_va, void **pp_hw_ctx, vlc_fourcc_t ...@@ -256,6 +256,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;
...@@ -266,12 +281,6 @@ static int CreateSurfaces( vlc_va_vaapi_t *p_va, void **pp_hw_ctx, vlc_fourcc_t ...@@ -266,12 +281,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