mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-11 09:55:36 +00:00
audioparsers: use ACCEPT_INTERSECT flag
The parser can accept input that is not completely specified. Use the
ACCEPT_INTERSECT flag on the sinkpad to tweak the acceptcaps function to
check for intersection only. This allows us to proxy downstream
constraints while still allowing non-subset caps as input.
We can then also remove the appended template caps workaround.
Make a unit-test to check the new feature.
This reverts commit 26040ee38c
Fixes https://bugzilla.gnome.org/show_bug.cgi?id=705024
This commit is contained in:
parent
e3f393f7e6
commit
e0a5c07e8d
9 changed files with 56 additions and 50 deletions
|
@ -143,6 +143,7 @@ static void
|
||||||
gst_aac_parse_init (GstAacParse * aacparse)
|
gst_aac_parse_init (GstAacParse * aacparse)
|
||||||
{
|
{
|
||||||
GST_DEBUG ("initialized");
|
GST_DEBUG ("initialized");
|
||||||
|
GST_PAD_SET_ACCEPT_INTERSECT (GST_BASE_PARSE_SINK_PAD (aacparse));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1391,13 +1392,6 @@ gst_aac_parse_sink_getcaps (GstBaseParse * parse, GstCaps * filter)
|
||||||
|
|
||||||
res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
|
res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
|
||||||
gst_caps_unref (peercaps);
|
gst_caps_unref (peercaps);
|
||||||
res = gst_caps_make_writable (res);
|
|
||||||
|
|
||||||
/* 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 {
|
} else {
|
||||||
res = templ;
|
res = templ;
|
||||||
}
|
}
|
||||||
|
|
|
@ -218,6 +218,7 @@ gst_ac3_parse_init (GstAc3Parse * ac3parse)
|
||||||
gst_ac3_parse_reset (ac3parse);
|
gst_ac3_parse_reset (ac3parse);
|
||||||
ac3parse->baseparse_chainfunc =
|
ac3parse->baseparse_chainfunc =
|
||||||
GST_BASE_PARSE_SINK_PAD (GST_BASE_PARSE (ac3parse))->chainfunc;
|
GST_BASE_PARSE_SINK_PAD (GST_BASE_PARSE (ac3parse))->chainfunc;
|
||||||
|
GST_PAD_SET_ACCEPT_INTERSECT (GST_BASE_PARSE_SINK_PAD (ac3parse));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -837,13 +838,6 @@ gst_ac3_parse_get_sink_caps (GstBaseParse * parse, GstCaps * filter)
|
||||||
|
|
||||||
res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
|
res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
|
||||||
gst_caps_unref (peercaps);
|
gst_caps_unref (peercaps);
|
||||||
res = gst_caps_make_writable (res);
|
|
||||||
|
|
||||||
/* 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 {
|
} else {
|
||||||
res = templ;
|
res = templ;
|
||||||
}
|
}
|
||||||
|
|
|
@ -128,7 +128,7 @@ gst_amr_parse_init (GstAmrParse * amrparse)
|
||||||
/* init rest */
|
/* init rest */
|
||||||
gst_base_parse_set_min_frame_size (GST_BASE_PARSE (amrparse), 62);
|
gst_base_parse_set_min_frame_size (GST_BASE_PARSE (amrparse), 62);
|
||||||
GST_DEBUG ("initialized");
|
GST_DEBUG ("initialized");
|
||||||
|
GST_PAD_SET_ACCEPT_INTERSECT (GST_BASE_PARSE_SINK_PAD (amrparse));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -132,6 +132,8 @@ gst_dca_parse_init (GstDcaParse * dcaparse)
|
||||||
gst_dca_parse_reset (dcaparse);
|
gst_dca_parse_reset (dcaparse);
|
||||||
dcaparse->baseparse_chainfunc =
|
dcaparse->baseparse_chainfunc =
|
||||||
GST_BASE_PARSE_SINK_PAD (GST_BASE_PARSE (dcaparse))->chainfunc;
|
GST_BASE_PARSE_SINK_PAD (GST_BASE_PARSE (dcaparse))->chainfunc;
|
||||||
|
|
||||||
|
GST_PAD_SET_ACCEPT_INTERSECT (GST_BASE_PARSE_SINK_PAD (dcaparse));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -510,13 +512,6 @@ gst_dca_parse_get_sink_caps (GstBaseParse * parse, GstCaps * filter)
|
||||||
|
|
||||||
res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
|
res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
|
||||||
gst_caps_unref (peercaps);
|
gst_caps_unref (peercaps);
|
||||||
res = gst_caps_make_writable (res);
|
|
||||||
|
|
||||||
/* 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 {
|
} else {
|
||||||
res = templ;
|
res = templ;
|
||||||
}
|
}
|
||||||
|
|
|
@ -258,6 +258,7 @@ static void
|
||||||
gst_flac_parse_init (GstFlacParse * flacparse)
|
gst_flac_parse_init (GstFlacParse * flacparse)
|
||||||
{
|
{
|
||||||
flacparse->check_frame_checksums = DEFAULT_CHECK_FRAME_CHECKSUMS;
|
flacparse->check_frame_checksums = DEFAULT_CHECK_FRAME_CHECKSUMS;
|
||||||
|
GST_PAD_SET_ACCEPT_INTERSECT (GST_BASE_PARSE_SINK_PAD (flacparse));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1829,13 +1830,6 @@ gst_flac_parse_get_sink_caps (GstBaseParse * parse, GstCaps * filter)
|
||||||
|
|
||||||
res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
|
res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
|
||||||
gst_caps_unref (peercaps);
|
gst_caps_unref (peercaps);
|
||||||
res = gst_caps_make_writable (res);
|
|
||||||
|
|
||||||
/* 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 {
|
} else {
|
||||||
res = templ;
|
res = templ;
|
||||||
}
|
}
|
||||||
|
|
|
@ -225,6 +225,7 @@ static void
|
||||||
gst_mpeg_audio_parse_init (GstMpegAudioParse * mp3parse)
|
gst_mpeg_audio_parse_init (GstMpegAudioParse * mp3parse)
|
||||||
{
|
{
|
||||||
gst_mpeg_audio_parse_reset (mp3parse);
|
gst_mpeg_audio_parse_reset (mp3parse);
|
||||||
|
GST_PAD_SET_ACCEPT_INTERSECT (GST_BASE_PARSE_SINK_PAD (mp3parse));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1434,13 +1435,6 @@ gst_mpeg_audio_parse_get_sink_caps (GstBaseParse * parse, GstCaps * filter)
|
||||||
|
|
||||||
res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
|
res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
|
||||||
gst_caps_unref (peercaps);
|
gst_caps_unref (peercaps);
|
||||||
res = gst_caps_make_writable (res);
|
|
||||||
|
|
||||||
/* 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 {
|
} else {
|
||||||
res = templ;
|
res = templ;
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,6 +121,7 @@ static void
|
||||||
gst_sbc_parse_init (GstSbcParse * sbcparse)
|
gst_sbc_parse_init (GstSbcParse * sbcparse)
|
||||||
{
|
{
|
||||||
gst_sbc_parse_reset (sbcparse);
|
gst_sbc_parse_reset (sbcparse);
|
||||||
|
GST_PAD_SET_ACCEPT_INTERSECT (GST_BASE_PARSE_SINK_PAD (sbcparse));
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -335,13 +336,6 @@ gst_sbc_parse_get_sink_caps (GstBaseParse * parse, GstCaps * filter)
|
||||||
|
|
||||||
res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
|
res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
|
||||||
gst_caps_unref (peercaps);
|
gst_caps_unref (peercaps);
|
||||||
res = gst_caps_make_writable (res);
|
|
||||||
|
|
||||||
/* 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 {
|
} else {
|
||||||
res = templ;
|
res = templ;
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,6 +117,7 @@ static void
|
||||||
gst_wavpack_parse_init (GstWavpackParse * wvparse)
|
gst_wavpack_parse_init (GstWavpackParse * wvparse)
|
||||||
{
|
{
|
||||||
gst_wavpack_parse_reset (wvparse);
|
gst_wavpack_parse_reset (wvparse);
|
||||||
|
GST_PAD_SET_ACCEPT_INTERSECT (GST_BASE_PARSE_SINK_PAD (wvparse));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -644,13 +645,6 @@ gst_wavpack_parse_get_sink_caps (GstBaseParse * parse, GstCaps * filter)
|
||||||
|
|
||||||
res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
|
res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
|
||||||
gst_caps_unref (peercaps);
|
gst_caps_unref (peercaps);
|
||||||
res = gst_caps_make_writable (res);
|
|
||||||
|
|
||||||
/* 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 {
|
} else {
|
||||||
res = templ;
|
res = templ;
|
||||||
}
|
}
|
||||||
|
|
|
@ -185,6 +185,50 @@ GST_START_TEST (test_parse_handle_codec_data)
|
||||||
|
|
||||||
GST_END_TEST;
|
GST_END_TEST;
|
||||||
|
|
||||||
|
GST_START_TEST (test_parse_proxy_constraints)
|
||||||
|
{
|
||||||
|
GstCaps *caps;
|
||||||
|
GstElement *parse, *filter;
|
||||||
|
GstPad *sinkpad;
|
||||||
|
GstStructure *s;
|
||||||
|
|
||||||
|
parse = gst_element_factory_make ("aacparse", NULL);
|
||||||
|
filter = gst_element_factory_make ("capsfilter", NULL);
|
||||||
|
|
||||||
|
/* constraint on rate and version */
|
||||||
|
caps = gst_caps_from_string ("audio/mpeg,mpegversion=2,rate=44100");
|
||||||
|
g_object_set (filter, "caps", caps, NULL);
|
||||||
|
gst_caps_unref (caps);
|
||||||
|
|
||||||
|
gst_element_link (parse, filter);
|
||||||
|
|
||||||
|
sinkpad = gst_element_get_static_pad (parse, "sink");
|
||||||
|
caps = gst_pad_query_caps (sinkpad, NULL);
|
||||||
|
GST_LOG ("caps %" GST_PTR_FORMAT, caps);
|
||||||
|
|
||||||
|
fail_unless (gst_caps_get_size (caps) == 1);
|
||||||
|
|
||||||
|
/* getcaps should proxy the rate constraint */
|
||||||
|
s = gst_caps_get_structure (caps, 0);
|
||||||
|
fail_unless (gst_structure_has_name (s, "audio/mpeg"));
|
||||||
|
fail_unless_structure_field_int_equals (s, "rate", 44100);
|
||||||
|
gst_caps_unref (caps);
|
||||||
|
|
||||||
|
/* should accept without the constraint */
|
||||||
|
caps = gst_caps_from_string ("audio/mpeg,mpegversion=2");
|
||||||
|
fail_unless (gst_pad_query_accept_caps (sinkpad, caps));
|
||||||
|
gst_caps_unref (caps);
|
||||||
|
|
||||||
|
/* should not accept with conflicting version */
|
||||||
|
caps = gst_caps_from_string ("audio/mpeg,mpegversion=4");
|
||||||
|
fail_if (gst_pad_query_accept_caps (sinkpad, caps));
|
||||||
|
gst_caps_unref (caps);
|
||||||
|
|
||||||
|
gst_object_unref (sinkpad);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
GST_END_TEST;
|
||||||
|
|
||||||
static Suite *
|
static Suite *
|
||||||
aacparse_suite (void)
|
aacparse_suite (void)
|
||||||
|
@ -207,6 +251,9 @@ aacparse_suite (void)
|
||||||
/* Other tests */
|
/* Other tests */
|
||||||
tcase_add_test (tc_chain, test_parse_handle_codec_data);
|
tcase_add_test (tc_chain, test_parse_handle_codec_data);
|
||||||
|
|
||||||
|
/* caps tests */
|
||||||
|
tcase_add_test (tc_chain, test_parse_proxy_constraints);
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue