ext/vorbis/vorbisdec.c (vorbis_dec_push_forward, vorbis_handle_data_packet):

Original commit message from CVS:
* ext/vorbis/vorbisdec.c (vorbis_dec_push_forward,
vorbis_handle_data_packet):
Correctly set DURATION to generate a timestamp-continuous stream.
One bug left at the end; see
ihttp://bugzilla.gnome.org/show_bug.cgi?id=423086
* tests/check/Makefile.am:
* tests/check/pipelines/vorbisenc.c (GST_START_TEST):
Add a test to check this.  Without the above patch this test fails.
This commit is contained in:
Thomas Vander Stichele 2007-03-26 20:56:35 +00:00
parent 77683331e1
commit ecab77b7e4
4 changed files with 41 additions and 5 deletions

View file

@ -1,3 +1,14 @@
2007-03-26 Thomas Vander Stichele <thomas at apestaart dot org>
* ext/vorbis/vorbisdec.c (vorbis_dec_push_forward,
vorbis_handle_data_packet):
Correctly set DURATION to generate a timestamp-continuous stream.
One bug left at the end; see
ihttp://bugzilla.gnome.org/show_bug.cgi?id=423086
* tests/check/Makefile.am:
* tests/check/pipelines/vorbisenc.c (GST_START_TEST):
Add a test to check this. Without the above patch this test fails.
2007-03-26 Jan Schmidt <thaytan@mad.scientist.com> 2007-03-26 Jan Schmidt <thaytan@mad.scientist.com>
* gst-libs/gst/rtp/Makefile.am: * gst-libs/gst/rtp/Makefile.am:

View file

@ -867,11 +867,15 @@ vorbis_dec_push_forward (GstVorbisDec * dec, GstBuffer * buf)
} else { } else {
if (G_UNLIKELY (dec->queued)) { if (G_UNLIKELY (dec->queued)) {
gint64 size; gint64 size;
GstClockTime ts;
GList *walk; GList *walk;
GST_DEBUG_OBJECT (dec, "first buffer with offset %lld", outoffset); GST_DEBUG_OBJECT (dec, "first buffer with offset %lld", outoffset);
ts = gst_util_uint64_scale_int (outoffset, GST_SECOND, dec->vi.rate);
size = g_list_length (dec->queued); size = g_list_length (dec->queued);
/* we walk the queued up list in reverse, and set the buffer fields
* calculating backwards */
for (walk = g_list_last (dec->queued); walk; for (walk = g_list_last (dec->queued); walk;
walk = g_list_previous (walk)) { walk = g_list_previous (walk)) {
GstBuffer *buffer = GST_BUFFER (walk->data); GstBuffer *buffer = GST_BUFFER (walk->data);
@ -882,8 +886,14 @@ vorbis_dec_push_forward (GstVorbisDec * dec, GstBuffer * buf)
GST_BUFFER_OFFSET (buffer) = outoffset; GST_BUFFER_OFFSET (buffer) = outoffset;
GST_BUFFER_TIMESTAMP (buffer) = GST_BUFFER_TIMESTAMP (buffer) =
gst_util_uint64_scale_int (outoffset, GST_SECOND, dec->vi.rate); gst_util_uint64_scale_int (outoffset, GST_SECOND, dec->vi.rate);
GST_BUFFER_DURATION (buffer) = GST_CLOCK_DIFF (GST_BUFFER_TIMESTAMP
(buffer), ts);
ts = GST_BUFFER_TIMESTAMP (buffer);
GST_DEBUG_OBJECT (dec, "patch buffer %" G_GUINT64_FORMAT GST_DEBUG_OBJECT (dec, "patch buffer %" G_GUINT64_FORMAT
" offset %" G_GUINT64_FORMAT, size, outoffset); ", offset %" G_GUINT64_FORMAT ", timestamp %" GST_TIME_FORMAT
", duration %" GST_TIME_FORMAT, size, outoffset,
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)),
GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)));
size--; size--;
} }
for (walk = dec->queued; walk; walk = g_list_next (walk)) { for (walk = dec->queued; walk; walk = g_list_next (walk)) {
@ -970,6 +980,7 @@ vorbis_handle_data_packet (GstVorbisDec * vd, ogg_packet * packet)
if ((sample_count = vorbis_synthesis_pcmout (&vd->vd, NULL)) == 0) if ((sample_count = vorbis_synthesis_pcmout (&vd->vd, NULL)) == 0)
goto done; goto done;
GST_LOG_OBJECT (vd, "%d samples ready for reading", sample_count);
size = sample_count * vd->vi.channels * sizeof (float); size = sample_count * vd->vi.channels * sizeof (float);
/* alloc buffer for it */ /* alloc buffer for it */
@ -996,7 +1007,7 @@ vorbis_handle_data_packet (GstVorbisDec * vd, ogg_packet * packet)
vd->granulepos = packet->granulepos - sample_count; vd->granulepos = packet->granulepos - sample_count;
if (vd->cur_timestamp != GST_CLOCK_TIME_NONE) { if (vd->cur_timestamp != GST_CLOCK_TIME_NONE) {
/* we have incomming timestamps */ /* we have incoming timestamps */
timestamp = vd->cur_timestamp; timestamp = vd->cur_timestamp;
GST_DEBUG_OBJECT (vd, GST_DEBUG_OBJECT (vd,
"cur_timestamp: %" GST_TIME_FORMAT " + %" GST_TIME_FORMAT " = %" "cur_timestamp: %" GST_TIME_FORMAT " + %" GST_TIME_FORMAT " = %"
@ -1008,12 +1019,20 @@ vorbis_handle_data_packet (GstVorbisDec * vd, ogg_packet * packet)
vd->vi.rate); vd->vi.rate);
GST_BUFFER_OFFSET_END (out) = GST_BUFFER_OFFSET (out) + sample_count; GST_BUFFER_OFFSET_END (out) = GST_BUFFER_OFFSET (out) + sample_count;
} else { } else {
/* we have incomming granulepos */ /* we have incoming granulepos */
GST_BUFFER_OFFSET (out) = vd->granulepos; GST_BUFFER_OFFSET (out) = vd->granulepos;
if (vd->granulepos != -1) { if (vd->granulepos != -1) {
GST_DEBUG_OBJECT (vd, "granulepos: %" G_GINT64_FORMAT, vd->granulepos);
GST_BUFFER_OFFSET_END (out) = vd->granulepos + sample_count; GST_BUFFER_OFFSET_END (out) = vd->granulepos + sample_count;
timestamp = timestamp =
gst_util_uint64_scale_int (vd->granulepos, GST_SECOND, vd->vi.rate); gst_util_uint64_scale_int (vd->granulepos, GST_SECOND, vd->vi.rate);
GST_DEBUG_OBJECT (vd, "corresponding timestamp %" GST_TIME_FORMAT,
GST_TIME_ARGS (timestamp));
/* calculate a nano-second accurate duration */
GST_BUFFER_DURATION (out) = GST_CLOCK_DIFF (timestamp,
(vd->granulepos + sample_count) * GST_SECOND / vd->vi.rate);
GST_DEBUG_OBJECT (vd, "set duration %" GST_TIME_FORMAT,
GST_TIME_ARGS (GST_BUFFER_DURATION (out)));
} else { } else {
timestamp = -1; timestamp = -1;
} }

View file

@ -44,7 +44,8 @@ check_pango =
endif endif
if USE_VORBIS if USE_VORBIS
check_vorbis = elements/vorbisdec pipelines/vorbisenc elements/vorbistag check_vorbis = elements/vorbisdec pipelines/vorbisenc pipelines/vorbisdec \
elements/vorbistag
else else
check_vorbis = check_vorbis =
endif endif
@ -217,6 +218,11 @@ libs_video_LDADD = \
$(GST_BASE_LIBS) \ $(GST_BASE_LIBS) \
$(LDADD) $(LDADD)
# this seemingly useless CFLAGS line is here only to avoid
# vorbisdec.$(OBJEXT) by triggering creation of pipelines_vorbisdec.$(OBJEXT)
# instead
pipelines_vorbisdec_CFLAGS = $(AM_CFLAGS)
pipelines_oggmux_LDADD = $(LDADD) $(OGG_LIBS) pipelines_oggmux_LDADD = $(LDADD) $(OGG_LIBS)
pipelines_oggmux_CFLAGS = $(AM_CFLAGS) $(OGG_CFLAGS) pipelines_oggmux_CFLAGS = $(AM_CFLAGS) $(OGG_CFLAGS)

View file

@ -187,7 +187,7 @@ GST_START_TEST (test_timestamps)
GError *error = NULL; GError *error = NULL;
pipe_str = g_strdup_printf ("audiotestsrc" pipe_str = g_strdup_printf ("audiotestsrc"
" ! audio/x-raw-int,rate=44100" " ! audioconvert ! vorbisenc ! fakesink"); " ! audio/x-raw-int,rate=44100 ! audioconvert ! vorbisenc ! 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",