mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-06 02:32:23 +00:00
vaapidecode: query downstream caps features like GLTextureUploadMeta.
Fix vaapidecode to correctly report caps features downstream, when a custom pipeline is built manually. https://bugzilla.gnome.org/show_bug.cgi?id=719372 Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
This commit is contained in:
parent
cb81acd48c
commit
a674d9eff2
1 changed files with 62 additions and 10 deletions
|
@ -110,10 +110,12 @@ gst_vaapi_decoder_state_changed(GstVaapiDecoder *decoder,
|
||||||
const GstVideoCodecState *codec_state, gpointer user_data)
|
const GstVideoCodecState *codec_state, gpointer user_data)
|
||||||
{
|
{
|
||||||
GstVaapiDecode * const decode = GST_VAAPIDECODE(user_data);
|
GstVaapiDecode * const decode = GST_VAAPIDECODE(user_data);
|
||||||
|
GstVideoDecoder * const vdec = GST_VIDEO_DECODER(decode);
|
||||||
|
|
||||||
g_assert(decode->decoder == decoder);
|
g_assert(decode->decoder == decoder);
|
||||||
|
|
||||||
gst_vaapidecode_update_src_caps(decode, codec_state);
|
gst_vaapidecode_update_src_caps(decode, codec_state);
|
||||||
|
gst_video_decoder_negotiate(vdec);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline gboolean
|
static inline gboolean
|
||||||
|
@ -130,6 +132,14 @@ gst_vaapidecode_update_src_caps(GstVaapiDecode *decode,
|
||||||
GstVideoDecoder * const vdec = GST_VIDEO_DECODER(decode);
|
GstVideoDecoder * const vdec = GST_VIDEO_DECODER(decode);
|
||||||
GstVideoCodecState *state;
|
GstVideoCodecState *state;
|
||||||
GstVideoInfo *vi, vis;
|
GstVideoInfo *vi, vis;
|
||||||
|
#if GST_CHECK_VERSION(1,1,0)
|
||||||
|
GstCapsFeatures *features = NULL;
|
||||||
|
GstVaapiCapsFeature feature;
|
||||||
|
|
||||||
|
feature = gst_vaapi_find_preferred_caps_feature(
|
||||||
|
GST_VIDEO_DECODER_SRC_PAD(vdec),
|
||||||
|
GST_VIDEO_INFO_FORMAT(&ref_state->info));
|
||||||
|
#endif
|
||||||
|
|
||||||
state = gst_video_decoder_set_output_state(vdec,
|
state = gst_video_decoder_set_output_state(vdec,
|
||||||
GST_VIDEO_INFO_FORMAT(&ref_state->info),
|
GST_VIDEO_INFO_FORMAT(&ref_state->info),
|
||||||
|
@ -149,15 +159,32 @@ gst_vaapidecode_update_src_caps(GstVaapiDecode *decode,
|
||||||
|
|
||||||
#if GST_CHECK_VERSION(1,1,0)
|
#if GST_CHECK_VERSION(1,1,0)
|
||||||
vis = *vi;
|
vis = *vi;
|
||||||
if (GST_VIDEO_INFO_FORMAT(vi) == GST_VIDEO_FORMAT_ENCODED) {
|
switch (feature) {
|
||||||
/* XXX: this is a workaround until auto-plugging is fixed when
|
case GST_VAAPI_CAPS_FEATURE_GL_TEXTURE_UPLOAD_META:
|
||||||
format=ENCODED + memory:VASurface caps feature are provided.
|
gst_video_info_set_format(&vis, GST_VIDEO_FORMAT_RGBA,
|
||||||
Meanwhile, providing a random format here works but this is
|
|
||||||
a terribly wrong thing per se. */
|
|
||||||
gst_video_info_set_format(&vis, GST_VIDEO_FORMAT_NV12,
|
|
||||||
GST_VIDEO_INFO_WIDTH(vi), GST_VIDEO_INFO_HEIGHT(vi));
|
GST_VIDEO_INFO_WIDTH(vi), GST_VIDEO_INFO_HEIGHT(vi));
|
||||||
|
features = gst_caps_features_new(
|
||||||
|
GST_CAPS_FEATURE_META_GST_VIDEO_GL_TEXTURE_UPLOAD_META, NULL);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (GST_VIDEO_INFO_FORMAT(vi) == GST_VIDEO_FORMAT_ENCODED) {
|
||||||
|
/* XXX: this is a workaround until auto-plugging is fixed when
|
||||||
|
format=ENCODED + memory:VASurface caps feature are provided.
|
||||||
|
Meanwhile, providing a random format here works but this is
|
||||||
|
a terribly wrong thing per se. */
|
||||||
|
gst_video_info_set_format(&vis, GST_VIDEO_FORMAT_NV12,
|
||||||
|
GST_VIDEO_INFO_WIDTH(vi), GST_VIDEO_INFO_HEIGHT(vi));
|
||||||
|
#if GST_CHECK_VERSION(1,3,0)
|
||||||
|
if (feature == GST_VAAPI_CAPS_FEATURE_VAAPI_SURFACE)
|
||||||
|
features = gst_caps_features_new(
|
||||||
|
GST_CAPS_FEATURE_MEMORY_VAAPI_SURFACE, NULL);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
state->caps = gst_video_info_to_caps(&vis);
|
state->caps = gst_video_info_to_caps(&vis);
|
||||||
|
if (features)
|
||||||
|
gst_caps_set_features(state->caps, 0, features);
|
||||||
#else
|
#else
|
||||||
/* XXX: gst_video_info_to_caps() from GStreamer 0.10 does not
|
/* XXX: gst_video_info_to_caps() from GStreamer 0.10 does not
|
||||||
reconstruct suitable caps for "encoded" video formats */
|
reconstruct suitable caps for "encoded" video formats */
|
||||||
|
@ -461,12 +488,38 @@ gst_vaapidecode_decide_allocation(GstVideoDecoder *vdec, GstQuery *query)
|
||||||
GstVideoInfo vi;
|
GstVideoInfo vi;
|
||||||
guint size, min, max;
|
guint size, min, max;
|
||||||
gboolean need_pool, update_pool;
|
gboolean need_pool, update_pool;
|
||||||
|
gboolean has_video_meta = FALSE;
|
||||||
|
GstVideoCodecState *state;
|
||||||
|
#if GST_CHECK_VERSION(1,1,0) && USE_GLX
|
||||||
|
GstCapsFeatures *features, *features2;
|
||||||
|
#endif
|
||||||
|
|
||||||
gst_query_parse_allocation(query, &caps, &need_pool);
|
gst_query_parse_allocation(query, &caps, &need_pool);
|
||||||
|
|
||||||
if (!caps)
|
if (!caps)
|
||||||
goto error_no_caps;
|
goto error_no_caps;
|
||||||
|
|
||||||
|
state = gst_video_decoder_get_output_state(vdec);
|
||||||
|
|
||||||
|
decode->has_texture_upload_meta = FALSE;
|
||||||
|
has_video_meta = gst_query_find_allocation_meta(query, GST_VIDEO_META_API_TYPE, NULL);
|
||||||
|
#if GST_CHECK_VERSION(1,1,0) && USE_GLX
|
||||||
|
if (has_video_meta)
|
||||||
|
decode->has_texture_upload_meta = gst_query_find_allocation_meta(query,
|
||||||
|
GST_VIDEO_GL_TEXTURE_UPLOAD_META_API_TYPE, NULL);
|
||||||
|
|
||||||
|
features = gst_caps_get_features(state->caps, 0);
|
||||||
|
features2 = gst_caps_features_new(GST_CAPS_FEATURE_META_GST_VIDEO_GL_TEXTURE_UPLOAD_META, NULL);
|
||||||
|
|
||||||
|
/* Update src caps if feature is not handled downstream */
|
||||||
|
if (!decode->has_texture_upload_meta &&
|
||||||
|
gst_caps_features_is_equal(features, features2))
|
||||||
|
gst_vaapidecode_update_src_caps (decode, state);
|
||||||
|
gst_caps_features_free(features2);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
gst_video_codec_state_unref(state);
|
||||||
|
|
||||||
gst_video_info_init(&vi);
|
gst_video_info_init(&vi);
|
||||||
gst_video_info_from_caps(&vi, caps);
|
gst_video_info_from_caps(&vi, caps);
|
||||||
if (GST_VIDEO_INFO_FORMAT(&vi) == GST_VIDEO_FORMAT_ENCODED)
|
if (GST_VIDEO_INFO_FORMAT(&vi) == GST_VIDEO_FORMAT_ENCODED)
|
||||||
|
@ -503,14 +556,11 @@ gst_vaapidecode_decide_allocation(GstVideoDecoder *vdec, GstQuery *query)
|
||||||
gst_buffer_pool_set_config(pool, config);
|
gst_buffer_pool_set_config(pool, config);
|
||||||
}
|
}
|
||||||
|
|
||||||
decode->has_texture_upload_meta = FALSE;
|
if (has_video_meta) {
|
||||||
if (gst_query_find_allocation_meta(query, GST_VIDEO_META_API_TYPE, NULL)) {
|
|
||||||
config = gst_buffer_pool_get_config(pool);
|
config = gst_buffer_pool_get_config(pool);
|
||||||
gst_buffer_pool_config_add_option(config,
|
gst_buffer_pool_config_add_option(config,
|
||||||
GST_BUFFER_POOL_OPTION_VIDEO_META);
|
GST_BUFFER_POOL_OPTION_VIDEO_META);
|
||||||
#if GST_CHECK_VERSION(1,1,0) && USE_GLX
|
#if GST_CHECK_VERSION(1,1,0) && USE_GLX
|
||||||
decode->has_texture_upload_meta = gst_query_find_allocation_meta(query,
|
|
||||||
GST_VIDEO_GL_TEXTURE_UPLOAD_META_API_TYPE, NULL);
|
|
||||||
if (decode->has_texture_upload_meta)
|
if (decode->has_texture_upload_meta)
|
||||||
gst_buffer_pool_config_add_option(config,
|
gst_buffer_pool_config_add_option(config,
|
||||||
GST_BUFFER_POOL_OPTION_VIDEO_GL_TEXTURE_UPLOAD_META);
|
GST_BUFFER_POOL_OPTION_VIDEO_GL_TEXTURE_UPLOAD_META);
|
||||||
|
@ -717,6 +767,8 @@ gst_vaapidecode_set_format(GstVideoDecoder *vdec, GstVideoCodecState *state)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (!gst_vaapidecode_update_src_caps(decode, state))
|
if (!gst_vaapidecode_update_src_caps(decode, state))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
if (!gst_video_decoder_negotiate(vdec))
|
||||||
|
return FALSE;
|
||||||
if (!gst_vaapi_plugin_base_set_caps(plugin, decode->sinkpad_caps,
|
if (!gst_vaapi_plugin_base_set_caps(plugin, decode->sinkpad_caps,
|
||||||
decode->srcpad_caps))
|
decode->srcpad_caps))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
Loading…
Reference in a new issue