mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-24 02:31:03 +00:00
gst-libs/gst/cdda/gstcddabasesrc.c: Make buffer durations add up (duration should be next_ts-ts for perfect streams)....
Original commit message from CVS: * gst-libs/gst/cdda/gstcddabasesrc.c: (gst_cdda_base_src_create): Make buffer durations add up (duration should be next_ts-ts for perfect streams). Fixes CD ripping to Ogg/Vorbis with vorbisenc from CVS. * tests/check/libs/cddabasesrc.c: (gst_cd_foo_src_close), (test_buffer_timestamps), (cddabasesrc_suite): Add unit test for the above. * tests/check/Makefile.am: Don't know why cddabasesrc test was in VALGRIND_TO_FIX, remove to see what happens.
This commit is contained in:
parent
e71487073c
commit
75ecc060b1
4 changed files with 89 additions and 14 deletions
15
ChangeLog
15
ChangeLog
|
@ -1,3 +1,18 @@
|
||||||
|
2006-08-17 Tim-Philipp Müller <tim at centricular dot net>
|
||||||
|
|
||||||
|
* gst-libs/gst/cdda/gstcddabasesrc.c: (gst_cdda_base_src_create):
|
||||||
|
Make buffer durations add up (duration should be next_ts-ts for
|
||||||
|
perfect streams). Fixes CD ripping to Ogg/Vorbis with vorbisenc
|
||||||
|
from CVS.
|
||||||
|
|
||||||
|
* tests/check/libs/cddabasesrc.c: (gst_cd_foo_src_close),
|
||||||
|
(test_buffer_timestamps), (cddabasesrc_suite):
|
||||||
|
Add unit test for the above.
|
||||||
|
|
||||||
|
* tests/check/Makefile.am:
|
||||||
|
Don't know why cddabasesrc test was in VALGRIND_TO_FIX, remove
|
||||||
|
to see what happens.
|
||||||
|
|
||||||
2006-08-16 Wim Taymans <wim@fluendo.com>
|
2006-08-16 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
* ext/alsa/gstalsasink.c: (gst_alsasink_set_property),
|
* ext/alsa/gstalsasink.c: (gst_alsasink_set_property),
|
||||||
|
|
|
@ -1496,8 +1496,8 @@ gst_cdda_base_src_create (GstPushSrc * pushsrc, GstBuffer ** buffer)
|
||||||
GstBuffer *buf;
|
GstBuffer *buf;
|
||||||
GstFormat format;
|
GstFormat format;
|
||||||
gboolean eos;
|
gboolean eos;
|
||||||
gint64 position;
|
gint64 position = GST_CLOCK_TIME_NONE;
|
||||||
gint64 duration;
|
gint64 duration = GST_CLOCK_TIME_NONE;
|
||||||
|
|
||||||
g_assert (klass->read_sector != NULL);
|
g_assert (klass->read_sector != NULL);
|
||||||
|
|
||||||
|
@ -1551,13 +1551,21 @@ gst_cdda_base_src_create (GstPushSrc * pushsrc, GstBuffer ** buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
format = GST_FORMAT_TIME;
|
format = GST_FORMAT_TIME;
|
||||||
if (!gst_pad_query_position (GST_BASE_SRC_PAD (src), &format, &position)) {
|
if (gst_pad_query_position (GST_BASE_SRC_PAD (src), &format, &position)) {
|
||||||
position = GST_CLOCK_TIME_NONE;
|
gint64 next_ts = 0;
|
||||||
|
|
||||||
|
++src->cur_sector;
|
||||||
|
if (gst_pad_query_position (GST_BASE_SRC_PAD (src), &format, &next_ts)) {
|
||||||
|
duration = next_ts - position;
|
||||||
|
}
|
||||||
|
--src->cur_sector;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 4 bytes per sample, 44100 samples per second */
|
/* fallback duration: 4 bytes per sample, 44100 samples per second */
|
||||||
duration = gst_util_uint64_scale_int (GST_BUFFER_SIZE (buf) >> 2, GST_SECOND,
|
if (duration == GST_CLOCK_TIME_NONE) {
|
||||||
44100);
|
duration = gst_util_uint64_scale_int (GST_BUFFER_SIZE (buf) >> 2,
|
||||||
|
GST_SECOND, 44100);
|
||||||
|
}
|
||||||
|
|
||||||
GST_BUFFER_TIMESTAMP (buf) = position;
|
GST_BUFFER_TIMESTAMP (buf) = position;
|
||||||
GST_BUFFER_DURATION (buf) = duration;
|
GST_BUFFER_DURATION (buf) = duration;
|
||||||
|
|
|
@ -66,7 +66,6 @@ VALGRIND_TO_FIX = \
|
||||||
elements/alsa \
|
elements/alsa \
|
||||||
elements/audioresample \
|
elements/audioresample \
|
||||||
generic/states \
|
generic/states \
|
||||||
libs/cddabasesrc \
|
|
||||||
libs/video
|
libs/video
|
||||||
|
|
||||||
# these tests don't even pass
|
# these tests don't even pass
|
||||||
|
|
|
@ -20,6 +20,12 @@
|
||||||
* Boston, MA 02111-1307, USA.
|
* Boston, MA 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* TODO:
|
||||||
|
* - test different modes (when seeking to tracks in track mode, buffer
|
||||||
|
* timestamps should start from 0, when seeking to tracks in disc mode,
|
||||||
|
* buffer timestamps should increment, etc.)
|
||||||
|
*/
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -27,6 +33,7 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <gst/check/gstcheck.h>
|
#include <gst/check/gstcheck.h>
|
||||||
|
#include <gst/check/gstbufferstraw.h>
|
||||||
|
|
||||||
#include <gst/cdda/gstcddabasesrc.h>
|
#include <gst/cdda/gstcddabasesrc.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -250,8 +257,6 @@ gst_cd_foo_src_close (GstCddaBaseSrc * cddabasesrc)
|
||||||
g_assert (g_str_equal (cddabasesrc->mb_discid,
|
g_assert (g_str_equal (cddabasesrc->mb_discid,
|
||||||
src->cur_test->musicbrainz_discid));
|
src->cur_test->musicbrainz_discid));
|
||||||
}
|
}
|
||||||
|
|
||||||
++src->cur_disc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstBuffer *
|
static GstBuffer *
|
||||||
|
@ -280,9 +285,9 @@ GST_PLUGIN_DEFINE_STATIC (GST_VERSION_MAJOR,
|
||||||
GST_VERSION_MINOR,
|
GST_VERSION_MINOR,
|
||||||
"cdfoosrc",
|
"cdfoosrc",
|
||||||
"Read audio from CD",
|
"Read audio from CD",
|
||||||
plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
|
plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);
|
||||||
|
|
||||||
GST_START_TEST (test_discid_calculations)
|
GST_START_TEST (test_discid_calculations)
|
||||||
{
|
{
|
||||||
GstElement *foosrc;
|
GstElement *foosrc;
|
||||||
gint i;
|
gint i;
|
||||||
|
@ -290,7 +295,8 @@ GST_PLUGIN_DEFINE_STATIC (GST_VERSION_MAJOR,
|
||||||
foosrc = gst_element_factory_make ("cdfoosrc", "cdfoosrc");
|
foosrc = gst_element_factory_make ("cdfoosrc", "cdfoosrc");
|
||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (test_discs); ++i) {
|
for (i = 0; i < G_N_ELEMENTS (test_discs); ++i) {
|
||||||
/* g_print ("Testing test disc layout %u ...\n", i); */
|
GST_LOG ("Testing disc layout %u ...\n", i);
|
||||||
|
GST_CD_FOO_SRC (foosrc)->cur_disc = i;
|
||||||
gst_element_set_state (foosrc, GST_STATE_PLAYING);
|
gst_element_set_state (foosrc, GST_STATE_PLAYING);
|
||||||
gst_element_get_state (foosrc, NULL, NULL, -1);
|
gst_element_get_state (foosrc, NULL, NULL, -1);
|
||||||
gst_element_set_state (foosrc, GST_STATE_NULL);
|
gst_element_set_state (foosrc, GST_STATE_NULL);
|
||||||
|
@ -301,7 +307,53 @@ GST_PLUGIN_DEFINE_STATIC (GST_VERSION_MAJOR,
|
||||||
|
|
||||||
GST_END_TEST;
|
GST_END_TEST;
|
||||||
|
|
||||||
Suite *
|
GST_START_TEST (test_buffer_timestamps)
|
||||||
|
{
|
||||||
|
GstElement *foosrc, *pipeline, *fakesink;
|
||||||
|
GstClockTime prev_ts, prev_duration, ts;
|
||||||
|
GstPad *sinkpad;
|
||||||
|
gint i;
|
||||||
|
|
||||||
|
pipeline = gst_pipeline_new ("pipeline");
|
||||||
|
foosrc = gst_element_factory_make ("cdfoosrc", "cdfoosrc");
|
||||||
|
fakesink = gst_element_factory_make ("fakesink", "fakesink");
|
||||||
|
gst_bin_add_many (GST_BIN (pipeline), foosrc, fakesink, NULL);
|
||||||
|
fail_unless (gst_element_link (foosrc, fakesink));
|
||||||
|
sinkpad = gst_element_get_pad (fakesink, "sink");
|
||||||
|
|
||||||
|
GST_CD_FOO_SRC (foosrc)->cur_disc = 0;
|
||||||
|
|
||||||
|
gst_buffer_straw_start_pipeline (pipeline, sinkpad);
|
||||||
|
|
||||||
|
for (i = 0; i < 100; ++i) {
|
||||||
|
GstBuffer *buf;
|
||||||
|
|
||||||
|
buf = gst_buffer_straw_get_buffer (pipeline, sinkpad);
|
||||||
|
GST_LOG ("buffer, ts=%" GST_TIME_FORMAT ", dur=%" GST_TIME_FORMAT,
|
||||||
|
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
|
||||||
|
GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
|
||||||
|
ts = GST_BUFFER_TIMESTAMP (buf);
|
||||||
|
fail_unless (GST_CLOCK_TIME_IS_VALID (ts));
|
||||||
|
fail_unless (GST_BUFFER_DURATION_IS_VALID (buf));
|
||||||
|
if (i > 0) {
|
||||||
|
fail_unless (GST_CLOCK_TIME_IS_VALID (prev_ts));
|
||||||
|
fail_unless (GST_CLOCK_TIME_IS_VALID (prev_duration));
|
||||||
|
fail_unless ((prev_ts + prev_duration) == ts);
|
||||||
|
}
|
||||||
|
prev_ts = ts;
|
||||||
|
prev_duration = GST_BUFFER_DURATION (buf);
|
||||||
|
gst_buffer_unref (buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
gst_buffer_straw_stop_pipeline (pipeline, sinkpad);
|
||||||
|
|
||||||
|
gst_object_unref (pipeline);
|
||||||
|
gst_object_unref (sinkpad);
|
||||||
|
}
|
||||||
|
|
||||||
|
GST_END_TEST;
|
||||||
|
|
||||||
|
static Suite *
|
||||||
cddabasesrc_suite (void)
|
cddabasesrc_suite (void)
|
||||||
{
|
{
|
||||||
Suite *s = suite_create ("cddabasesrc");
|
Suite *s = suite_create ("cddabasesrc");
|
||||||
|
@ -309,6 +361,7 @@ cddabasesrc_suite (void)
|
||||||
|
|
||||||
suite_add_tcase (s, tc_chain);
|
suite_add_tcase (s, tc_chain);
|
||||||
tcase_add_test (tc_chain, test_discid_calculations);
|
tcase_add_test (tc_chain, test_discid_calculations);
|
||||||
|
tcase_add_test (tc_chain, test_buffer_timestamps);
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue