Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Sebastian Dröge
gst-plugins-base
Commits
917ea30a
Commit
917ea30a
authored
Aug 14, 2015
by
Tim-Philipp Müller
🐠
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
tests: audiodecoder: add unit test for tag handling
https://bugzilla.gnome.org/show_bug.cgi?id=679768
parent
5ccc8432
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
226 additions
and
0 deletions
+226
-0
tests/check/libs/audiodecoder.c
tests/check/libs/audiodecoder.c
+226
-0
No files found.
tests/check/libs/audiodecoder.c
View file @
917ea30a
...
...
@@ -938,6 +938,231 @@ GST_START_TEST (audiodecoder_query_caps_with_custom_getcaps)
GST_END_TEST
;
static
GstTagList
*
pad_get_sticky_tags
(
GstPad
*
pad
,
GstTagScope
scope
)
{
GstTagList
*
tags
=
NULL
;
GstEvent
*
event
;
guint
i
=
0
;
do
{
event
=
gst_pad_get_sticky_event
(
pad
,
GST_EVENT_TAG
,
i
++
);
if
(
event
==
NULL
)
break
;
gst_event_parse_tag
(
event
,
&
tags
);
if
(
scope
==
gst_tag_list_get_scope
(
tags
))
tags
=
gst_tag_list_ref
(
tags
);
else
tags
=
NULL
;
gst_event_unref
(
event
);
}
while
(
tags
==
NULL
);
return
tags
;
}
#define tag_list_peek_string(list,tag,p_s) \
gst_tag_list_peek_string_index(list,tag,0,p_s)
/* Check tag transformations and updates */
GST_START_TEST
(
audiodecoder_tag_handling
)
{
GstTagList
*
global_tags
;
GstTagList
*
tags
;
GstSegment
segment
;
const
gchar
*
s
=
NULL
;
guint
u
=
0
;
setup_audiodecodertester
(
NULL
,
NULL
);
gst_pad_set_active
(
mysrcpad
,
TRUE
);
gst_element_set_state
(
dec
,
GST_STATE_PLAYING
);
gst_pad_set_active
(
mysinkpad
,
TRUE
);
send_startup_events
();
/* push a new segment */
gst_segment_init
(
&
segment
,
GST_FORMAT_TIME
);
fail_unless
(
gst_pad_push_event
(
mysrcpad
,
gst_event_new_segment
(
&
segment
)));
/* =======================================================================
* SCENARIO 0: global tags passthrough; check upstream/decoder tag merging
* ======================================================================= */
/* push some global tags (these should be passed through and not messed with) */
global_tags
=
gst_tag_list_new
(
GST_TAG_TITLE
,
"Global"
,
NULL
);
gst_tag_list_set_scope
(
global_tags
,
GST_TAG_SCOPE_GLOBAL
);
fail_unless
(
gst_pad_push_event
(
mysrcpad
,
gst_event_new_tag
(
gst_tag_list_ref
(
global_tags
))));
/* create some (upstream) stream tags */
tags
=
gst_tag_list_new
(
GST_TAG_AUDIO_CODEC
,
"Upstream Codec"
,
GST_TAG_DESCRIPTION
,
"Upstream Description"
,
NULL
);
gst_tag_list_set_scope
(
tags
,
GST_TAG_SCOPE_STREAM
);
fail_unless
(
gst_pad_push_event
(
mysrcpad
,
gst_event_new_tag
(
tags
)));
tags
=
NULL
;
/* decoder tags: override/add AUDIO_CODEC, BITRATE and MAXIMUM_BITRATE */
{
GstTagList
*
decoder_tags
;
decoder_tags
=
gst_tag_list_new
(
GST_TAG_AUDIO_CODEC
,
"Decoder Codec"
,
GST_TAG_BITRATE
,
250000
,
GST_TAG_MAXIMUM_BITRATE
,
255000
,
NULL
);
gst_audio_decoder_merge_tags
(
GST_AUDIO_DECODER
(
dec
),
decoder_tags
,
GST_TAG_MERGE_REPLACE
);
gst_tag_list_unref
(
decoder_tags
);
}
/* push buffer (this will call gst_audio_decoder_merge_tags with the above) */
fail_unless
(
gst_pad_push
(
mysrcpad
,
create_test_buffer
(
0
))
==
GST_FLOW_OK
);
gst_buffer_unref
(
buffers
->
data
);
buffers
=
g_list_delete_link
(
buffers
,
buffers
);
/* check global tags: should not have been tampered with */
tags
=
pad_get_sticky_tags
(
mysinkpad
,
GST_TAG_SCOPE_GLOBAL
);
fail_unless
(
tags
!=
NULL
);
GST_INFO
(
"global tags: %"
GST_PTR_FORMAT
,
tags
);
fail_unless
(
gst_tag_list_is_equal
(
tags
,
global_tags
));
/* check merged stream tags */
tags
=
pad_get_sticky_tags
(
mysinkpad
,
GST_TAG_SCOPE_STREAM
);
fail_unless
(
tags
!=
NULL
);
GST_INFO
(
"stream tags: %"
GST_PTR_FORMAT
,
tags
);
/* upstream audio codec should've been replaced with audiodecoder one */
fail_unless
(
tag_list_peek_string
(
tags
,
GST_TAG_AUDIO_CODEC
,
&
s
));
fail_unless_equals_string
(
s
,
"Decoder Codec"
);
/* no upstream bitrate, so audiodecoder one should've been added */
fail_unless
(
gst_tag_list_get_uint
(
tags
,
GST_TAG_BITRATE
,
&
u
));
fail_unless_equals_int
(
u
,
250000
);
/* no upstream maximum-bitrate, so audiodecoder one should've been added */
fail_unless
(
gst_tag_list_get_uint
(
tags
,
GST_TAG_MAXIMUM_BITRATE
,
&
u
));
fail_unless_equals_int
(
u
,
255000
);
fail_unless
(
gst_tag_list_get_tag_size
(
tags
,
GST_TAG_AUDIO_CODEC
)
==
1
);
fail_unless
(
gst_tag_list_get_tag_size
(
tags
,
GST_TAG_BITRATE
)
==
1
);
fail_unless
(
gst_tag_list_get_tag_size
(
tags
,
GST_TAG_MAXIMUM_BITRATE
)
==
1
);
/* upstream description should've been maintained */
fail_unless
(
gst_tag_list_get_tag_size
(
tags
,
GST_TAG_DESCRIPTION
)
==
1
);
/* and that should be all: AUDIO_CODEC, DESCRIPTION, BITRATE, MAX BITRATE */
fail_unless_equals_int
(
gst_tag_list_n_tags
(
tags
),
4
);
gst_tag_list_unref
(
tags
);
s
=
NULL
;
/* ===================================================================
* SCENARIO 1: upstream sends updated tags, decoder tags stay the same
* =================================================================== */
/* push same upstream stream tags again */
tags
=
gst_tag_list_new
(
GST_TAG_AUDIO_CODEC
,
"Upstream Codec"
,
GST_TAG_DESCRIPTION
,
"Upstream Description"
,
NULL
);
fail_unless
(
gst_pad_push_event
(
mysrcpad
,
gst_event_new_tag
(
tags
)));
tags
=
NULL
;
/* decoder tags are still:
* audio-codec = "Decoder Codec", bitrate=250000, maximum-bitrate=255000 */
/* check possibly updated merged stream tags, should be same as before */
tags
=
pad_get_sticky_tags
(
mysinkpad
,
GST_TAG_SCOPE_STREAM
);
fail_unless
(
tags
!=
NULL
);
GST_INFO
(
"stream tags: %"
GST_PTR_FORMAT
,
tags
);
/* upstream audio codec still be the one merge-replaced by the subclass */
fail_unless
(
tag_list_peek_string
(
tags
,
GST_TAG_AUDIO_CODEC
,
&
s
));
fail_unless_equals_string
(
s
,
"Decoder Codec"
);
/* no upstream bitrate, so audiodecoder one should've been added */
fail_unless
(
gst_tag_list_get_uint
(
tags
,
GST_TAG_BITRATE
,
&
u
));
fail_unless_equals_int
(
u
,
250000
);
fail_unless
(
gst_tag_list_get_tag_size
(
tags
,
GST_TAG_AUDIO_CODEC
)
==
1
);
fail_unless
(
gst_tag_list_get_tag_size
(
tags
,
GST_TAG_BITRATE
)
==
1
);
fail_unless
(
gst_tag_list_get_tag_size
(
tags
,
GST_TAG_MAXIMUM_BITRATE
)
==
1
);
/* upstream description should've been maintained */
fail_unless
(
gst_tag_list_get_tag_size
(
tags
,
GST_TAG_DESCRIPTION
)
==
1
);
/* and that should be all: AUDIO_CODEC, DESCRIPTION, BITRATE, MAX BITRATE */
fail_unless_equals_int
(
gst_tag_list_n_tags
(
tags
),
4
);
gst_tag_list_unref
(
tags
);
s
=
NULL
;
/* =============================================================
* SCENARIO 2: decoder updates tags, upstream tags stay the same
* ============================================================= */
/* new decoder tags: override AUDIO_CODEC, update/add BITRATE,
* no MAXIMUM_BITRATE this time (which means it should not appear
* any longer in the output tags now) (bitrate is a different value now) */
{
GstTagList
*
decoder_tags
;
decoder_tags
=
gst_tag_list_new
(
GST_TAG_AUDIO_CODEC
,
"Decoder Codec"
,
GST_TAG_BITRATE
,
275000
,
NULL
);
gst_audio_decoder_merge_tags
(
GST_AUDIO_DECODER
(
dec
),
decoder_tags
,
GST_TAG_MERGE_REPLACE
);
gst_tag_list_unref
(
decoder_tags
);
}
/* push another buffer to make decoder update tags */
fail_unless
(
gst_pad_push
(
mysrcpad
,
create_test_buffer
(
2
))
==
GST_FLOW_OK
);
gst_buffer_unref
(
buffers
->
data
);
buffers
=
g_list_delete_link
(
buffers
,
buffers
);
/* check updated merged stream tags, the decoder bits should be different */
tags
=
pad_get_sticky_tags
(
mysinkpad
,
GST_TAG_SCOPE_STREAM
);
fail_unless
(
tags
!=
NULL
);
GST_INFO
(
"stream tags: %"
GST_PTR_FORMAT
,
tags
);
/* upstream audio codec still replaced by the subclass's (wasn't updated) */
fail_unless
(
tag_list_peek_string
(
tags
,
GST_TAG_AUDIO_CODEC
,
&
s
));
fail_unless_equals_string
(
s
,
"Decoder Codec"
);
/* no upstream bitrate, so audiodecoder one should've been added, was updated */
fail_unless
(
gst_tag_list_get_uint
(
tags
,
GST_TAG_BITRATE
,
&
u
));
fail_unless_equals_int
(
u
,
275000
);
/* no upstream maximum-bitrate, and audiodecoder removed it now */
fail_unless
(
!
gst_tag_list_get_uint
(
tags
,
GST_TAG_MAXIMUM_BITRATE
,
&
u
));
fail_unless
(
gst_tag_list_get_tag_size
(
tags
,
GST_TAG_AUDIO_CODEC
)
==
1
);
fail_unless
(
gst_tag_list_get_tag_size
(
tags
,
GST_TAG_BITRATE
)
==
1
);
/* upstream description should've been maintained */
fail_unless
(
gst_tag_list_get_tag_size
(
tags
,
GST_TAG_DESCRIPTION
)
==
1
);
/* and that should be all, just AUDIO_CODEC, DESCRIPTION, BITRATE */
fail_unless_equals_int
(
gst_tag_list_n_tags
(
tags
),
3
);
gst_tag_list_unref
(
tags
);
s
=
NULL
;
/* =================================================================
* SCENARIO 3: stream-start event should clear upstream tags
* ================================================================= */
/* also tests if the stream-start event clears the upstream tags */
fail_unless
(
gst_pad_push_event
(
mysrcpad
,
gst_event_new_stream_start
(
"x"
)));
/* push another buffer to make decoder update tags */
fail_unless
(
gst_pad_push
(
mysrcpad
,
create_test_buffer
(
3
))
==
GST_FLOW_OK
);
gst_buffer_unref
(
buffers
->
data
);
buffers
=
g_list_delete_link
(
buffers
,
buffers
);
/* check updated merged stream tags, should be just decoder tags now */
tags
=
pad_get_sticky_tags
(
mysinkpad
,
GST_TAG_SCOPE_STREAM
);
fail_unless
(
tags
!=
NULL
);
GST_INFO
(
"stream tags: %"
GST_PTR_FORMAT
,
tags
);
fail_unless
(
tag_list_peek_string
(
tags
,
GST_TAG_AUDIO_CODEC
,
&
s
));
fail_unless_equals_string
(
s
,
"Decoder Codec"
);
fail_unless
(
gst_tag_list_get_uint
(
tags
,
GST_TAG_BITRATE
,
&
u
));
fail_unless_equals_int
(
u
,
275000
);
/* no upstream maximum-bitrate, and audiodecoder removed it now */
fail_unless
(
!
gst_tag_list_get_uint
(
tags
,
GST_TAG_MAXIMUM_BITRATE
,
&
u
));
fail_unless
(
gst_tag_list_get_tag_size
(
tags
,
GST_TAG_AUDIO_CODEC
)
==
1
);
fail_unless
(
gst_tag_list_get_tag_size
(
tags
,
GST_TAG_BITRATE
)
==
1
);
/* no more description tag since no more upstream tags */
fail_unless
(
gst_tag_list_get_tag_size
(
tags
,
GST_TAG_DESCRIPTION
)
==
0
);
/* and that should be all, just AUDIO_CODEC, BITRATE */
fail_unless_equals_int
(
gst_tag_list_n_tags
(
tags
),
2
);
gst_tag_list_unref
(
tags
);
s
=
NULL
;
/* clean up */
fail_unless
(
gst_pad_push_event
(
mysrcpad
,
gst_event_new_eos
()));
fail_unless
(
buffers
==
NULL
);
cleanup_audiodecodertest
();
gst_tag_list_unref
(
global_tags
);
}
GST_END_TEST
;
static
Suite
*
gst_audiodecoder_suite
(
void
)
...
...
@@ -956,6 +1181,7 @@ gst_audiodecoder_suite (void)
tcase_add_test
(
tc
,
audiodecoder_first_data_is_gap
);
tcase_add_test
(
tc
,
audiodecoder_buffer_after_segment
);
tcase_add_test
(
tc
,
audiodecoder_output_too_many_frames
);
tcase_add_test
(
tc
,
audiodecoder_tag_handling
);
tcase_add_test
(
tc
,
audiodecoder_query_caps_with_fixed_caps_peer
);
tcase_add_test
(
tc
,
audiodecoder_query_caps_with_range_caps_peer
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment