androidmedia: Only allow GL output if the decoder has unknown color formats

If GST_AMC_IGNORE_UNKNOWN_COLOR_FORMATS is set to yes, non-GL output
is still allowed.

https://bugzilla.gnome.org/show_bug.cgi?id=731204
This commit is contained in:
Matthieu Bouron 2015-04-20 13:46:58 +02:00 committed by Matthew Waters
parent 43b63f304d
commit 7dbb6681a3
3 changed files with 22 additions and 7 deletions

View file

@ -1567,6 +1567,7 @@ scan_codecs (GstPlugin * plugin)
goto next_codec; goto next_codec;
} }
gst_codec_info->is_encoder = is_encoder; gst_codec_info->is_encoder = is_encoder;
gst_codec_info->gl_output_only = FALSE;
supported_types = supported_types =
(*env)->CallObjectMethod (env, codec_info, get_supported_types_id); (*env)->CallObjectMethod (env, codec_info, get_supported_types_id);
@ -1710,12 +1711,13 @@ scan_codecs (GstPlugin * plugin)
goto next_supported_type; goto next_supported_type;
} }
if (!ignore_unknown_color_formats if (!accepted_color_formats (gst_codec_type, is_encoder)) {
&& !accepted_color_formats (gst_codec_type, is_encoder)) { if (!ignore_unknown_color_formats) {
GST_ERROR ("%s %s has unknown color formats, ignoring", gst_codec_info->gl_output_only = TRUE;
GST_WARNING
("%s %s has unknown color formats, only direct rendering will be supported",
gst_codec_type->mime, is_encoder ? "encoder" : "decoder"); gst_codec_type->mime, is_encoder ? "encoder" : "decoder");
valid_codec = FALSE; }
goto next_supported_type;
} }
} }

View file

@ -53,6 +53,7 @@ struct _GstAmcCodecType {
struct _GstAmcCodecInfo { struct _GstAmcCodecInfo {
gchar *name; gchar *name;
gboolean is_encoder; gboolean is_encoder;
gboolean gl_output_only;
GstAmcCodecType *supported_types; GstAmcCodecType *supported_types;
gint n_supported_types; gint n_supported_types;
}; };

View file

@ -230,7 +230,11 @@ gst_amc_video_dec_base_init (gpointer g_class)
gst_caps_from_string (GST_VIDEO_CAPS_MAKE_WITH_FEATURES gst_caps_from_string (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
(GST_CAPS_FEATURE_MEMORY_GL_MEMORY, "RGBA")); (GST_CAPS_FEATURE_MEMORY_GL_MEMORY, "RGBA"));
if (codec_info->gl_output_only) {
gst_caps_unref (src_caps);
} else {
gst_caps_append (all_src_caps, src_caps); gst_caps_append (all_src_caps, src_caps);
}
/* Add pad templates */ /* Add pad templates */
templ = templ =
@ -1224,6 +1228,7 @@ gst_amc_video_dec_set_format (GstVideoDecoder * decoder,
GstVideoCodecState * state) GstVideoCodecState * state)
{ {
GstAmcVideoDec *self; GstAmcVideoDec *self;
GstAmcVideoDecClass *klass;
GstAmcFormat *format; GstAmcFormat *format;
const gchar *mime; const gchar *mime;
gboolean is_format_change = FALSE; gboolean is_format_change = FALSE;
@ -1235,6 +1240,7 @@ gst_amc_video_dec_set_format (GstVideoDecoder * decoder,
jobject jsurface = NULL; jobject jsurface = NULL;
self = GST_AMC_VIDEO_DEC (decoder); self = GST_AMC_VIDEO_DEC (decoder);
klass = GST_AMC_VIDEO_DEC_GET_CLASS (self);
GST_DEBUG_OBJECT (self, "Setting new caps %" GST_PTR_FORMAT, state->caps); GST_DEBUG_OBJECT (self, "Setting new caps %" GST_PTR_FORMAT, state->caps);
@ -1414,6 +1420,12 @@ gst_amc_video_dec_set_format (GstVideoDecoder * decoder,
GST_INFO_OBJECT (self, "GL output: %s", GST_INFO_OBJECT (self, "GL output: %s",
self->downstream_supports_gl ? "enabled" : "disabled"); self->downstream_supports_gl ? "enabled" : "disabled");
if (klass->codec_info->gl_output_only && !self->downstream_supports_gl) {
GST_ERROR_OBJECT (self,
"Codec only supports GL output but downstream does not");
return FALSE;
}
if (self->downstream_supports_gl && self->surface) { if (self->downstream_supports_gl && self->surface) {
jsurface = self->surface->jobject; jsurface = self->surface->jobject;
} else if (self->downstream_supports_gl && !self->surface) { } else if (self->downstream_supports_gl && !self->surface) {