summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Penquerc'h <vincent.penquerch@collabora.co.uk>2013-07-01 10:39:02 +0100
committerVincent Penquerc'h <vincent.penquerch@collabora.co.uk>2013-07-01 10:51:40 +0100
commit065f1603b0f1d2adc8477bf1f3ebe2b154885d89 (patch)
treef1b3c9efadb6348c03db25bfc697887d45055003
parenta00f4f239abcf6b21c40289d0a4f0967be0c2237 (diff)
pbutils: allow describing unfixed caps if they share the same media type
Caps description and missing plugin code does not really need caps to be fixed, and indeed they may not be if giving encodebin unfixed caps that correspond to an unknown encoder or muxer. So we relax the check, and allow unfixed caps if all the structures refer to the same media type.
-rw-r--r--gst-libs/gst/pbutils/descriptions.c6
-rw-r--r--gst-libs/gst/pbutils/missing-plugins.c21
-rw-r--r--gst-libs/gst/pbutils/pbutils-private.h1
3 files changed, 24 insertions, 4 deletions
diff --git a/gst-libs/gst/pbutils/descriptions.c b/gst-libs/gst/pbutils/descriptions.c
index ac27e7dfc..9591f5906 100644
--- a/gst-libs/gst/pbutils/descriptions.c
+++ b/gst-libs/gst/pbutils/descriptions.c
@@ -839,7 +839,7 @@ gst_pb_utils_get_decoder_description (const GstCaps * caps)
tmp = copy_and_clean_caps (caps);
- g_return_val_if_fail (gst_caps_is_fixed (tmp), NULL);
+ g_return_val_if_fail (has_single_media_type (tmp), NULL);
/* special-case RTP caps */
if (caps_are_rtp_caps (tmp, "video", &str)) {
@@ -890,7 +890,7 @@ gst_pb_utils_get_encoder_description (const GstCaps * caps)
g_return_val_if_fail (caps != NULL, NULL);
g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
tmp = copy_and_clean_caps (caps);
- g_return_val_if_fail (gst_caps_is_fixed (tmp), NULL);
+ g_return_val_if_fail (has_single_media_type (tmp), NULL);
/* special-case RTP caps */
if (caps_are_rtp_caps (tmp, "video", &str)) {
@@ -1021,7 +1021,7 @@ gst_pb_utils_get_codec_description (const GstCaps * caps)
g_return_val_if_fail (caps != NULL, NULL);
g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
tmp = copy_and_clean_caps (caps);
- g_return_val_if_fail (gst_caps_is_fixed (tmp), NULL);
+ g_return_val_if_fail (has_single_media_type (tmp), NULL);
info = find_format_info (tmp);
diff --git a/gst-libs/gst/pbutils/missing-plugins.c b/gst-libs/gst/pbutils/missing-plugins.c
index 7d7f2f4f9..6ff16d5fb 100644
--- a/gst-libs/gst/pbutils/missing-plugins.c
+++ b/gst-libs/gst/pbutils/missing-plugins.c
@@ -156,6 +156,25 @@ copy_and_clean_caps (const GstCaps * caps)
return ret;
}
+gboolean
+has_single_media_type (const GstCaps * caps)
+{
+ guint n, ns;
+ const char *name0, *namen;
+
+ g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
+
+ name0 = gst_structure_get_name (gst_caps_get_structure (caps, 0));
+ ns = gst_caps_get_size (caps);
+ for (n = 1; n < ns; ++n) {
+ namen = gst_structure_get_name (gst_caps_get_structure (caps, n));
+ if (strcmp (name0, namen)) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
/**
* gst_missing_uri_source_message_new:
* @element: the #GstElement posting the message
@@ -319,7 +338,7 @@ gst_missing_encoder_message_new (GstElement * element,
g_return_val_if_fail (GST_IS_CAPS (encode_caps), NULL);
g_return_val_if_fail (!gst_caps_is_any (encode_caps), NULL);
g_return_val_if_fail (!gst_caps_is_empty (encode_caps), NULL);
- g_return_val_if_fail (gst_caps_is_fixed (encode_caps), NULL);
+ g_return_val_if_fail (has_single_media_type (encode_caps), NULL);
description = gst_pb_utils_get_encoder_description (encode_caps);
caps = copy_and_clean_caps (encode_caps);
diff --git a/gst-libs/gst/pbutils/pbutils-private.h b/gst-libs/gst/pbutils/pbutils-private.h
index 82fd22c89..bb475a337 100644
--- a/gst-libs/gst/pbutils/pbutils-private.h
+++ b/gst-libs/gst/pbutils/pbutils-private.h
@@ -107,3 +107,4 @@ struct _GstDiscovererInfo {
/* missing-plugins.c */
GstCaps *copy_and_clean_caps (const GstCaps * caps);
+gboolean has_single_media_type (const GstCaps * caps);