+
+#ifdef HAVE_AVCODEC_VAAPI
+static enum PixelFormat ffmpeg_GetFormat( AVCodecContext *p_codec,
+ const enum PixelFormat *pi_fmt )
+{
+ decoder_t *p_dec = p_codec->opaque;
+ decoder_sys_t *p_sys = p_dec->p_sys;
+
+ if( p_sys->p_va )
+ {
+ VaDelete( p_sys->p_va );
+ p_sys->p_va = NULL;
+ }
+
+ /* Try too look for a supported hw acceleration */
+ for( int i = 0; pi_fmt[i] != PIX_FMT_NONE; i++ )
+ {
+ static const char *ppsz_name[PIX_FMT_NB] = {
+ [PIX_FMT_VDPAU_H264] = "PIX_FMT_VDPAU_H264",
+ [PIX_FMT_VAAPI_IDCT] = "PIX_FMT_VAAPI_IDCT",
+ [PIX_FMT_VAAPI_VLD] = "PIX_FMT_VAAPI_VLD",
+ [PIX_FMT_VAAPI_MOCO] = "PIX_FMT_VAAPI_MOCO",
+ [PIX_FMT_YUYV422] = "PIX_FMT_YUYV422",
+ [PIX_FMT_YUV420P] = "PIX_FMT_YUV420P",
+ };
+ msg_Dbg( p_dec, "Available decoder output format %d (%s)", pi_fmt[i], ppsz_name[pi_fmt[i]] ?: "Unknown" );
+
+ /* Only VLD supported */
+ if( pi_fmt[i] == PIX_FMT_VAAPI_VLD )
+ {
+ msg_Dbg( p_dec, "Trying VA API" );
+ p_sys->p_va = VaNew( p_sys->i_codec_id );
+ if( p_sys->p_va )
+ {
+ /* FIXME this will disabled direct rendering
+ * even if a new pixel format is renegociated
+ *
+ * FIXME Try to call VaSetup when possible
+ * to detect errors when possible (later is too late) */
+ p_sys->b_direct_rendering = false;
+ p_sys->p_context->draw_horiz_band = NULL;
+ return pi_fmt[i];
+ }
+ msg_Warn( p_dec, "Failed to open VA API" );
+ }
+ }
+
+ /* Fallback to default behaviour */
+ return avcodec_default_get_format( p_codec, pi_fmt );
+}
+#endif
+