mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 03:35:21 +00:00
videoparsers: Fix GstBaseParse::get_sink_caps() implementations
They should take the filter caps into account and always return the template caps appended to the actual caps. Otherwise the parsers stop to accept unparsed streams where upstream does not know about width, height, etc. Fixes bug #677401.
This commit is contained in:
parent
9f7e70f754
commit
7c6093357b
5 changed files with 80 additions and 39 deletions
|
@ -351,10 +351,12 @@ gst_dirac_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
|
|||
static GstCaps *
|
||||
gst_dirac_parse_get_sink_caps (GstBaseParse * parse, GstCaps * filter)
|
||||
{
|
||||
GstCaps *peercaps;
|
||||
GstCaps *peercaps, *templ;
|
||||
GstCaps *res;
|
||||
|
||||
templ = gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD (parse));
|
||||
peercaps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (parse));
|
||||
|
||||
if (peercaps) {
|
||||
guint i, n;
|
||||
|
||||
|
@ -366,15 +368,25 @@ gst_dirac_parse_get_sink_caps (GstBaseParse * parse, GstCaps * filter)
|
|||
gst_structure_remove_field (s, "parsed");
|
||||
}
|
||||
|
||||
res =
|
||||
gst_caps_intersect_full (peercaps,
|
||||
gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD (parse)),
|
||||
GST_CAPS_INTERSECT_FIRST);
|
||||
res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
|
||||
gst_caps_unref (peercaps);
|
||||
|
||||
/* Append the template caps because we still want to accept
|
||||
* caps without any fields in the case upstream does not
|
||||
* know anything.
|
||||
*/
|
||||
gst_caps_append (res, templ);
|
||||
} else {
|
||||
res =
|
||||
gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD
|
||||
(parse)));
|
||||
res = templ;
|
||||
}
|
||||
|
||||
if (filter) {
|
||||
GstCaps *intersection;
|
||||
|
||||
intersection =
|
||||
gst_caps_intersect_full (filter, res, GST_CAPS_INTERSECT_FIRST);
|
||||
gst_caps_unref (res);
|
||||
res = intersection;
|
||||
}
|
||||
|
||||
return res;
|
||||
|
|
|
@ -352,10 +352,12 @@ more:
|
|||
static GstCaps *
|
||||
gst_h263_parse_get_sink_caps (GstBaseParse * parse, GstCaps * filter)
|
||||
{
|
||||
GstCaps *peercaps;
|
||||
GstCaps *peercaps, *templ;
|
||||
GstCaps *res;
|
||||
|
||||
templ = gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD (parse));
|
||||
peercaps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (parse));
|
||||
|
||||
if (peercaps) {
|
||||
guint i, n;
|
||||
|
||||
|
@ -367,15 +369,25 @@ gst_h263_parse_get_sink_caps (GstBaseParse * parse, GstCaps * filter)
|
|||
gst_structure_remove_field (s, "parsed");
|
||||
}
|
||||
|
||||
res =
|
||||
gst_caps_intersect_full (peercaps,
|
||||
gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD (parse)),
|
||||
GST_CAPS_INTERSECT_FIRST);
|
||||
res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
|
||||
gst_caps_unref (peercaps);
|
||||
|
||||
/* Append the template caps because we still want to accept
|
||||
* caps without any fields in the case upstream does not
|
||||
* know anything.
|
||||
*/
|
||||
gst_caps_append (res, templ);
|
||||
} else {
|
||||
res =
|
||||
gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD
|
||||
(parse)));
|
||||
res = templ;
|
||||
}
|
||||
|
||||
if (filter) {
|
||||
GstCaps *intersection;
|
||||
|
||||
intersection =
|
||||
gst_caps_intersect_full (filter, res, GST_CAPS_INTERSECT_FIRST);
|
||||
gst_caps_unref (res);
|
||||
res = intersection;
|
||||
}
|
||||
|
||||
return res;
|
||||
|
|
|
@ -1821,11 +1821,10 @@ refuse_caps:
|
|||
static GstCaps *
|
||||
gst_h264_parse_get_caps (GstBaseParse * parse, GstCaps * filter)
|
||||
{
|
||||
GstCaps *peercaps, *template_caps;
|
||||
GstCaps *peercaps, *templ;
|
||||
GstCaps *res;
|
||||
|
||||
template_caps =
|
||||
gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD (parse));
|
||||
templ = gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD (parse));
|
||||
peercaps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (parse));
|
||||
if (peercaps) {
|
||||
guint i, n;
|
||||
|
@ -1839,12 +1838,16 @@ gst_h264_parse_get_caps (GstBaseParse * parse, GstCaps * filter)
|
|||
gst_structure_remove_field (s, "parsed");
|
||||
}
|
||||
|
||||
res = gst_caps_intersect_full (peercaps, template_caps,
|
||||
GST_CAPS_INTERSECT_FIRST);
|
||||
res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
|
||||
gst_caps_unref (peercaps);
|
||||
gst_caps_unref (template_caps);
|
||||
|
||||
/* Append the template caps because we still want to accept
|
||||
* caps without any fields in the case upstream does not
|
||||
* know anything.
|
||||
*/
|
||||
gst_caps_append (res, templ);
|
||||
} else {
|
||||
res = template_caps;
|
||||
res = templ;
|
||||
}
|
||||
|
||||
if (filter) {
|
||||
|
|
|
@ -767,10 +767,12 @@ gst_mpeg4vparse_set_caps (GstBaseParse * parse, GstCaps * caps)
|
|||
static GstCaps *
|
||||
gst_mpeg4vparse_get_caps (GstBaseParse * parse, GstCaps * filter)
|
||||
{
|
||||
GstCaps *peercaps;
|
||||
GstCaps *peercaps, *templ;
|
||||
GstCaps *res;
|
||||
|
||||
templ = gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD (parse));
|
||||
peercaps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (parse));
|
||||
|
||||
if (peercaps) {
|
||||
guint i, n;
|
||||
|
||||
|
@ -783,15 +785,16 @@ gst_mpeg4vparse_get_caps (GstBaseParse * parse, GstCaps * filter)
|
|||
gst_structure_remove_field (s, "parsed");
|
||||
}
|
||||
|
||||
res =
|
||||
gst_caps_intersect_full (peercaps,
|
||||
gst_pad_get_pad_template_caps (GST_BASE_PARSE_SRC_PAD (parse)),
|
||||
GST_CAPS_INTERSECT_FIRST);
|
||||
res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
|
||||
gst_caps_unref (peercaps);
|
||||
|
||||
/* Append the template caps because we still want to accept
|
||||
* caps without any fields in the case upstream does not
|
||||
* know anything.
|
||||
*/
|
||||
gst_caps_append (res, templ);
|
||||
} else {
|
||||
res =
|
||||
gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD
|
||||
(parse)));
|
||||
res = templ;
|
||||
}
|
||||
|
||||
if (filter) {
|
||||
|
|
|
@ -824,9 +824,10 @@ gst_mpegv_parse_set_caps (GstBaseParse * parse, GstCaps * caps)
|
|||
static GstCaps *
|
||||
gst_mpegv_parse_get_caps (GstBaseParse * parse, GstCaps * filter)
|
||||
{
|
||||
GstCaps *peercaps;
|
||||
GstCaps *peercaps, *templ;
|
||||
GstCaps *res;
|
||||
|
||||
templ = gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD (parse));
|
||||
peercaps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (parse));
|
||||
if (peercaps) {
|
||||
guint i, n;
|
||||
|
@ -839,15 +840,25 @@ gst_mpegv_parse_get_caps (GstBaseParse * parse, GstCaps * filter)
|
|||
gst_structure_remove_field (s, "parsed");
|
||||
}
|
||||
|
||||
res =
|
||||
gst_caps_intersect_full (peercaps,
|
||||
gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD (parse)),
|
||||
GST_CAPS_INTERSECT_FIRST);
|
||||
res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
|
||||
gst_caps_unref (peercaps);
|
||||
|
||||
/* Append the template caps because we still want to accept
|
||||
* caps without any fields in the case upstream does not
|
||||
* know anything.
|
||||
*/
|
||||
gst_caps_append (res, templ);
|
||||
} else {
|
||||
res =
|
||||
gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD
|
||||
(parse)));
|
||||
res = templ;
|
||||
}
|
||||
|
||||
if (filter) {
|
||||
GstCaps *intersection;
|
||||
|
||||
intersection =
|
||||
gst_caps_intersect_full (filter, res, GST_CAPS_INTERSECT_FIRST);
|
||||
gst_caps_unref (res);
|
||||
res = intersection;
|
||||
}
|
||||
|
||||
return res;
|
||||
|
|
Loading…
Reference in a new issue