X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcodec%2Favcodec%2Fvaapi.c;h=4bcd898ee4989d4449b72a05163f60c15b1711b4;hb=7b27f950b0fe4c76acbea58ea183a486bdc7da2e;hp=de793acaa12662605f56423a6f498357ce0b5d7f;hpb=7c93516a555e29c51f0a191b0c64daf65b029583;p=vlc diff --git a/modules/codec/avcodec/vaapi.c b/modules/codec/avcodec/vaapi.c index de793acaa1..4bcd898ee4 100644 --- a/modules/codec/avcodec/vaapi.c +++ b/modules/codec/avcodec/vaapi.c @@ -176,7 +176,7 @@ error: static void DestroySurfaces( vlc_va_vaapi_t *p_va ) { - if( p_va->image.image_id ) + if( p_va->image.image_id != VA_INVALID_SURFACE ) { CopyCleanCache( &p_va->image_cache ); vaDestroyImage( p_va->p_display, p_va->image.image_id ); @@ -195,7 +195,7 @@ static void DestroySurfaces( vlc_va_vaapi_t *p_va ) free( p_va->p_surface ); /* */ - p_va->image.image_id = 0; + p_va->image.image_id = VA_INVALID_SURFACE; p_va->i_context_id = 0; p_va->p_surface = NULL; p_va->i_surface_width = 0; @@ -210,6 +210,7 @@ static int CreateSurfaces( vlc_va_vaapi_t *p_va, void **pp_hw_ctx, vlc_fourcc_t p_va->p_surface = calloc( p_va->i_surface_count, sizeof(*p_va->p_surface) ); if( !p_va->p_surface ) return VLC_EGENERIC; + p_va->image.image_id = VA_INVALID_SURFACE; /* Create surfaces */ VASurfaceID pi_surface_id[p_va->i_surface_count]; @@ -239,7 +240,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 +260,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 = VA_INVALID_SURFACE; + 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 = VA_INVALID_SURFACE; + continue; + } + i_chroma = VLC_CODEC_YV12; fmt = p_fmt[i]; break; @@ -269,12 +285,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 */ @@ -464,7 +474,12 @@ static void Delete( vlc_va_t *p_external ) /* */ vlc_va_t *vlc_va_NewVaapi( int i_codec_id ) { - if( !XInitThreads() ) + bool fail; + + vlc_global_lock( VLC_XLIB_MUTEX ); + fail = !XInitThreads(); + vlc_global_unlock( VLC_XLIB_MUTEX ); + if( unlikely(fail) ) return NULL; vlc_va_vaapi_t *p_va = calloc( 1, sizeof(*p_va) );