mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
Merge remote-tracking branch 'origin/master' into 0.11
Conflicts: tests/check/pipelines/vorbisdec.c tests/check/pipelines/vorbisenc.c
This commit is contained in:
commit
303dbaf84b
5 changed files with 43 additions and 75 deletions
|
@ -580,7 +580,7 @@ gst_audio_decoder_setup (GstAudioDecoder * dec)
|
||||||
gst_query_unref (query);
|
gst_query_unref (query);
|
||||||
|
|
||||||
/* normalize to bool */
|
/* normalize to bool */
|
||||||
dec->priv->agg = ! !res;
|
dec->priv->agg = !!res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* mini aggregator combining output buffers into fewer larger ones,
|
/* mini aggregator combining output buffers into fewer larger ones,
|
||||||
|
@ -816,17 +816,18 @@ gst_audio_decoder_finish_frame (GstAudioDecoder * dec, GstBuffer * buf,
|
||||||
|
|
||||||
g_assert (GST_CLOCK_TIME_IS_VALID (priv->base_ts));
|
g_assert (GST_CLOCK_TIME_IS_VALID (priv->base_ts));
|
||||||
next_ts = priv->base_ts +
|
next_ts = priv->base_ts +
|
||||||
gst_util_uint64_scale (samples, GST_SECOND, ctx->info.rate);
|
gst_util_uint64_scale (priv->samples, GST_SECOND, ctx->info.rate);
|
||||||
GST_LOG_OBJECT (dec, "buffer is %d samples past base_ts %" GST_TIME_FORMAT
|
GST_LOG_OBJECT (dec,
|
||||||
", expected ts %" GST_TIME_FORMAT, samples,
|
"buffer is %" G_GUINT64_FORMAT " samples past base_ts %"
|
||||||
|
GST_TIME_FORMAT ", expected ts %" GST_TIME_FORMAT, priv->samples,
|
||||||
GST_TIME_ARGS (priv->base_ts), GST_TIME_ARGS (next_ts));
|
GST_TIME_ARGS (priv->base_ts), GST_TIME_ARGS (next_ts));
|
||||||
diff = GST_CLOCK_DIFF (next_ts, ts);
|
diff = GST_CLOCK_DIFF (next_ts, ts);
|
||||||
GST_LOG_OBJECT (dec, "ts diff %d ms", (gint) (diff / GST_MSECOND));
|
GST_LOG_OBJECT (dec, "ts diff %d ms", (gint) (diff / GST_MSECOND));
|
||||||
/* if within tolerance,
|
/* if within tolerance,
|
||||||
* discard buffer ts and carry on producing perfect stream,
|
* discard buffer ts and carry on producing perfect stream,
|
||||||
* otherwise resync to ts */
|
* otherwise resync to ts */
|
||||||
if (G_UNLIKELY (diff < -dec->priv->tolerance ||
|
if (G_UNLIKELY (diff < (gint64) - dec->priv->tolerance ||
|
||||||
diff > dec->priv->tolerance)) {
|
diff > (gint64) dec->priv->tolerance)) {
|
||||||
GST_DEBUG_OBJECT (dec, "base_ts resync");
|
GST_DEBUG_OBJECT (dec, "base_ts resync");
|
||||||
priv->base_ts = ts;
|
priv->base_ts = ts;
|
||||||
priv->samples = 0;
|
priv->samples = 0;
|
||||||
|
@ -1088,7 +1089,14 @@ gst_audio_decoder_flush (GstAudioDecoder * dec, gboolean hard)
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_audio_decoder_chain_forward (GstAudioDecoder * dec, GstBuffer * buffer)
|
gst_audio_decoder_chain_forward (GstAudioDecoder * dec, GstBuffer * buffer)
|
||||||
{
|
{
|
||||||
GstFlowReturn ret;
|
GstFlowReturn ret = GST_FLOW_OK;
|
||||||
|
|
||||||
|
/* discard silly case, though maybe ts may be of value ?? */
|
||||||
|
if (G_UNLIKELY (GST_BUFFER_SIZE (buffer) == 0)) {
|
||||||
|
GST_DEBUG_OBJECT (dec, "discarding empty buffer");
|
||||||
|
gst_buffer_unref (buffer);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
/* grab buffer */
|
/* grab buffer */
|
||||||
gst_adapter_push (dec->priv->adapter, buffer);
|
gst_adapter_push (dec->priv->adapter, buffer);
|
||||||
|
@ -1099,6 +1107,7 @@ gst_audio_decoder_chain_forward (GstAudioDecoder * dec, GstBuffer * buffer)
|
||||||
/* hand to subclass */
|
/* hand to subclass */
|
||||||
ret = gst_audio_decoder_push_buffers (dec, FALSE);
|
ret = gst_audio_decoder_push_buffers (dec, FALSE);
|
||||||
|
|
||||||
|
exit:
|
||||||
GST_LOG_OBJECT (dec, "chain-done");
|
GST_LOG_OBJECT (dec, "chain-done");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -963,10 +963,12 @@ gst_audio_encoder_chain (GstPad * pad, GstBuffer * buffer)
|
||||||
gst_audio_encoder_drain (enc);
|
gst_audio_encoder_drain (enc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* now re-sync ts */
|
if (discont) {
|
||||||
priv->base_ts += diff;
|
/* now re-sync ts */
|
||||||
gst_audio_encoder_set_base_gp (enc);
|
priv->base_ts += diff;
|
||||||
priv->discont |= discont;
|
gst_audio_encoder_set_base_gp (enc);
|
||||||
|
priv->discont |= discont;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_adapter_push (enc->priv->adapter, buffer);
|
gst_adapter_push (enc->priv->adapter, buffer);
|
||||||
|
|
|
@ -94,42 +94,6 @@ cleanup_vorbisdec (GstElement * vorbisdec)
|
||||||
gst_check_teardown_element (vorbisdec);
|
gst_check_teardown_element (vorbisdec);
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_START_TEST (test_empty_identification_header)
|
|
||||||
{
|
|
||||||
GstElement *vorbisdec;
|
|
||||||
GstBuffer *inbuffer;
|
|
||||||
GstBus *bus;
|
|
||||||
GstMessage *message;
|
|
||||||
|
|
||||||
vorbisdec = setup_vorbisdec ();
|
|
||||||
bus = gst_bus_new ();
|
|
||||||
|
|
||||||
fail_unless (gst_element_set_state (vorbisdec,
|
|
||||||
GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
|
|
||||||
"could not set to playing");
|
|
||||||
|
|
||||||
inbuffer = gst_buffer_new_and_alloc (0);
|
|
||||||
ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
|
|
||||||
|
|
||||||
/* set a bus here so we avoid getting state change messages */
|
|
||||||
gst_element_set_bus (vorbisdec, bus);
|
|
||||||
|
|
||||||
fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_ERROR);
|
|
||||||
/* ... but it ends up being collected on the global buffer list */
|
|
||||||
fail_unless_equals_int (g_list_length (buffers), 0);
|
|
||||||
|
|
||||||
fail_if ((message = gst_bus_pop (bus)) == NULL);
|
|
||||||
fail_unless_message_error (message, STREAM, DECODE);
|
|
||||||
gst_message_unref (message);
|
|
||||||
gst_element_set_bus (vorbisdec, NULL);
|
|
||||||
|
|
||||||
/* cleanup */
|
|
||||||
gst_object_unref (GST_OBJECT (bus));
|
|
||||||
cleanup_vorbisdec (vorbisdec);
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_END_TEST;
|
|
||||||
|
|
||||||
/* FIXME: also tests comment header */
|
/* FIXME: also tests comment header */
|
||||||
GST_START_TEST (test_identification_header)
|
GST_START_TEST (test_identification_header)
|
||||||
{
|
{
|
||||||
|
@ -329,7 +293,6 @@ vorbisdec_suite (void)
|
||||||
TCase *tc_chain = tcase_create ("general");
|
TCase *tc_chain = tcase_create ("general");
|
||||||
|
|
||||||
suite_add_tcase (s, tc_chain);
|
suite_add_tcase (s, tc_chain);
|
||||||
tcase_add_test (tc_chain, test_empty_identification_header);
|
|
||||||
tcase_add_test (tc_chain, test_identification_header);
|
tcase_add_test (tc_chain, test_identification_header);
|
||||||
tcase_add_test (tc_chain, test_empty_vorbis_packet);
|
tcase_add_test (tc_chain, test_empty_vorbis_packet);
|
||||||
|
|
||||||
|
|
|
@ -54,8 +54,11 @@ GST_START_TEST (test_timestamps)
|
||||||
GstBus *bus;
|
GstBus *bus;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
|
||||||
|
/* allowing some tolerance permits audiodecoder to come up with
|
||||||
|
* perfect timestamps rather than sticking to upstream ts */
|
||||||
pipe_str = g_strdup_printf ("audiotestsrc num-buffers=100"
|
pipe_str = g_strdup_printf ("audiotestsrc num-buffers=100"
|
||||||
" ! audio/x-raw,rate=44100 ! audioconvert ! vorbisenc ! vorbisdec"
|
" ! audio/x-raw,rate=44100 ! audioconvert ! vorbisenc "
|
||||||
|
" ! vorbisdec tolerance=10000000 "
|
||||||
" ! identity check-imperfect-timestamp=TRUE ! fakesink");
|
" ! identity check-imperfect-timestamp=TRUE ! fakesink");
|
||||||
|
|
||||||
pipeline = gst_parse_launch (pipe_str, &error);
|
pipeline = gst_parse_launch (pipe_str, &error);
|
||||||
|
|
|
@ -267,7 +267,7 @@ drop_second_data_buffer (GstPad * droppad, GstProbeType type,
|
||||||
{
|
{
|
||||||
GstProbeReturn res = GST_PROBE_OK;
|
GstProbeReturn res = GST_PROBE_OK;
|
||||||
|
|
||||||
if (GST_BUFFER_OFFSET (buffer) == 1024)
|
if (GST_BUFFER_OFFSET (buffer) == 4096)
|
||||||
res = GST_PROBE_DROP;
|
res = GST_PROBE_DROP;
|
||||||
|
|
||||||
GST_DEBUG ("dropping %d", res);
|
GST_DEBUG ("dropping %d", res);
|
||||||
|
@ -284,8 +284,10 @@ GST_START_TEST (test_discontinuity)
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
guint drop_id;
|
guint drop_id;
|
||||||
|
|
||||||
|
/* make audioencoder act sufficiently pedantic */
|
||||||
pipe_str = g_strdup_printf ("audiotestsrc samplesperbuffer=1024"
|
pipe_str = g_strdup_printf ("audiotestsrc samplesperbuffer=1024"
|
||||||
" ! audio/x-raw,rate=44100" " ! audioconvert ! vorbisenc ! fakesink");
|
" ! audio/x-raw,rate=44100" " ! audioconvert "
|
||||||
|
" ! vorbisenc tolerance=10000000 ! fakesink");
|
||||||
|
|
||||||
bin = gst_parse_launch (pipe_str, &error);
|
bin = gst_parse_launch (pipe_str, &error);
|
||||||
fail_unless (bin != NULL, "Error parsing pipeline: %s",
|
fail_unless (bin != NULL, "Error parsing pipeline: %s",
|
||||||
|
@ -338,38 +340,27 @@ GST_START_TEST (test_discontinuity)
|
||||||
check_buffer_granulepos (buffer, 0);
|
check_buffer_granulepos (buffer, 0);
|
||||||
gst_buffer_unref (buffer);
|
gst_buffer_unref (buffer);
|
||||||
|
|
||||||
/* two phases: continuous granulepos values up to 1024, then a first
|
|
||||||
discontinuous granulepos whose granulepos corresponds to a gap ending at
|
|
||||||
2048. */
|
|
||||||
{
|
{
|
||||||
GstClockTime next_timestamp = 0;
|
GstClockTime next_timestamp = 0;
|
||||||
gint64 last_granulepos = 0;
|
gint64 last_granulepos = 0, granulepos;
|
||||||
|
gint i;
|
||||||
|
|
||||||
while (last_granulepos < 1024) {
|
for (i = 0; i < 10; i++) {
|
||||||
buffer = gst_buffer_straw_get_buffer (bin, pad);
|
buffer = gst_buffer_straw_get_buffer (bin, pad);
|
||||||
last_granulepos = GST_BUFFER_OFFSET_END (buffer);
|
granulepos = GST_BUFFER_OFFSET_END (buffer);
|
||||||
|
/* discont is either at start, or following gap */
|
||||||
|
if (GST_BUFFER_IS_DISCONT (buffer)) {
|
||||||
|
if (next_timestamp) {
|
||||||
|
fail_unless (granulepos - last_granulepos > 1024,
|
||||||
|
"expected discont of at least 1024 samples");
|
||||||
|
next_timestamp = GST_BUFFER_TIMESTAMP (buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
check_buffer_timestamp (buffer, next_timestamp);
|
check_buffer_timestamp (buffer, next_timestamp);
|
||||||
fail_if (GST_BUFFER_IS_DISCONT (buffer), "expected continuous buffer");
|
|
||||||
next_timestamp += GST_BUFFER_DURATION (buffer);
|
next_timestamp += GST_BUFFER_DURATION (buffer);
|
||||||
|
last_granulepos = granulepos;
|
||||||
gst_buffer_unref (buffer);
|
gst_buffer_unref (buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
fail_unless (last_granulepos == 1024,
|
|
||||||
"unexpected granulepos: %" G_GUINT64_FORMAT, last_granulepos);
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
buffer = gst_buffer_straw_get_buffer (bin, pad);
|
|
||||||
/* The first buffer after the discontinuity will produce zero output
|
|
||||||
* samples (because of the overlap/add), so it won't increment the
|
|
||||||
* granulepos, which should be 2048 after the discontinuity.
|
|
||||||
*/
|
|
||||||
fail_unless (GST_BUFFER_IS_DISCONT (buffer),
|
|
||||||
"expected discontinuous buffer");
|
|
||||||
fail_unless (GST_BUFFER_OFFSET_END (buffer) == 2048,
|
|
||||||
"expected granulepos after gap: %" G_GUINT64_FORMAT,
|
|
||||||
GST_BUFFER_OFFSET_END (buffer));
|
|
||||||
gst_buffer_unref (buffer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_buffer_straw_stop_pipeline (bin, pad);
|
gst_buffer_straw_stop_pipeline (bin, pad);
|
||||||
|
|
Loading…
Reference in a new issue