mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
gst/subparse/gstsubparse.*: Remove spurious 1000 subtrahend when calculating the timestamp from the frame number and ...
Original commit message from CVS: * gst/subparse/gstsubparse.c: (parse_mdvdsub): * gst/subparse/gstsubparse.h: Remove spurious 1000 subtrahend when calculating the timestamp from the frame number and the frame rate . Also, use the frames/second value specified in the first line of the file, if one is specified there. Should fix #357503. * tests/check/elements/subparse.c: (do_test), (test_tmplayer_do_test), (test_microdvd_do_test), (GST_START_TEST), (subparse_suite): Add some basic unit tests for the microdvd subtitle format.
This commit is contained in:
parent
71b8a1f392
commit
9052dc4681
5 changed files with 83 additions and 13 deletions
14
ChangeLog
14
ChangeLog
|
@ -1,3 +1,17 @@
|
||||||
|
2007-01-08 Tim-Philipp Müller <tim at centricular dot net>
|
||||||
|
|
||||||
|
* gst/subparse/gstsubparse.c: (parse_mdvdsub):
|
||||||
|
* gst/subparse/gstsubparse.h:
|
||||||
|
Remove spurious 1000 subtrahend when calculating the timestamp from
|
||||||
|
the frame number and the frame rate . Also, use the frames/second
|
||||||
|
value specified in the first line of the file, if one is specified
|
||||||
|
there. Should fix #357503.
|
||||||
|
|
||||||
|
* tests/check/elements/subparse.c: (do_test),
|
||||||
|
(test_tmplayer_do_test), (test_microdvd_do_test), (GST_START_TEST),
|
||||||
|
(subparse_suite):
|
||||||
|
Add some basic unit tests for the microdvd subtitle format.
|
||||||
|
|
||||||
2007-01-07 Julien MOUTTE <julien@moutte.net>
|
2007-01-07 Julien MOUTTE <julien@moutte.net>
|
||||||
|
|
||||||
* sys/xvimage/xvimagesink.c: (gst_xvimage_buffer_destroy),
|
* sys/xvimage/xvimagesink.c: (gst_xvimage_buffer_destroy),
|
||||||
|
|
2
common
2
common
|
@ -1 +1 @@
|
||||||
Subproject commit 64f924f6f2ff6275b06facb4c2adbc7c05f70641
|
Subproject commit 8ba5dffb5ee7e7daea1030f6b34bfef10f9801a3
|
|
@ -396,10 +396,6 @@ parse_mdvdsub (ParserState * state, const gchar * line)
|
||||||
guint start_frame, end_frame;
|
guint start_frame, end_frame;
|
||||||
gint64 clip_start = 0, clip_stop = 0;
|
gint64 clip_start = 0, clip_stop = 0;
|
||||||
gboolean in_seg = FALSE;
|
gboolean in_seg = FALSE;
|
||||||
|
|
||||||
/* FIXME: hardcoded for now, but detecting the correct value is
|
|
||||||
* not going to be easy, I suspect... */
|
|
||||||
const double frames_per_sec = 24000 / 1001.;
|
|
||||||
GString *markup;
|
GString *markup;
|
||||||
gchar *ret;
|
gchar *ret;
|
||||||
|
|
||||||
|
@ -414,8 +410,32 @@ parse_mdvdsub (ParserState * state, const gchar * line)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
state->start_time = (start_frame - 1000) / frames_per_sec * GST_SECOND;
|
/* skip the {%u}{%u} part */
|
||||||
state->duration = (end_frame - start_frame) / frames_per_sec * GST_SECOND;
|
line = strchr (line, '}') + 1;
|
||||||
|
line = strchr (line, '}') + 1;
|
||||||
|
|
||||||
|
/* see if there's a first line with a framerate */
|
||||||
|
if (state->fps == 0.0 && start_frame == 1 && end_frame == 1) {
|
||||||
|
gchar *rest, *end = NULL;
|
||||||
|
|
||||||
|
rest = g_strdup (line);
|
||||||
|
g_strdelimit (rest, ",", '.');
|
||||||
|
state->fps = g_ascii_strtod (rest, &end);
|
||||||
|
if (end == rest)
|
||||||
|
state->fps = 0.0;
|
||||||
|
GST_INFO ("framerate from file: %f ('%s')", state->fps, rest);
|
||||||
|
g_free (rest);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state->fps == 0.0) {
|
||||||
|
/* FIXME: hardcoded for now, is there a better way/assumption? */
|
||||||
|
state->fps = 24000.0 / 1001.0;
|
||||||
|
GST_INFO ("no framerate specified, assuming %f", state->fps);
|
||||||
|
}
|
||||||
|
|
||||||
|
state->start_time = start_frame / state->fps * GST_SECOND;
|
||||||
|
state->duration = (end_frame - start_frame) / state->fps * GST_SECOND;
|
||||||
|
|
||||||
/* Check our segment start/stop */
|
/* Check our segment start/stop */
|
||||||
in_seg = gst_segment_clip (state->segment, GST_FORMAT_TIME,
|
in_seg = gst_segment_clip (state->segment, GST_FORMAT_TIME,
|
||||||
|
@ -430,10 +450,6 @@ parse_mdvdsub (ParserState * state, const gchar * line)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* skip the {%u}{%u} part */
|
|
||||||
line = strchr (line, '}') + 1;
|
|
||||||
line = strchr (line, '}') + 1;
|
|
||||||
|
|
||||||
markup = g_string_new (NULL);
|
markup = g_string_new (NULL);
|
||||||
while (1) {
|
while (1) {
|
||||||
italic = FALSE;
|
italic = FALSE;
|
||||||
|
|
|
@ -60,6 +60,7 @@ typedef struct {
|
||||||
guint64 duration;
|
guint64 duration;
|
||||||
GstSegment *segment;
|
GstSegment *segment;
|
||||||
gpointer user_data;
|
gpointer user_data;
|
||||||
|
gdouble fps; /* used by microdvd parser */
|
||||||
} ParserState;
|
} ParserState;
|
||||||
|
|
||||||
typedef gchar* (*Parser) (ParserState *state, const gchar *line);
|
typedef gchar* (*Parser) (ParserState *state, const gchar *line);
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
|
|
||||||
#include <gst/check/gstcheck.h>
|
#include <gst/check/gstcheck.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
|
static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
|
||||||
GST_PAD_SINK,
|
GST_PAD_SINK,
|
||||||
GST_PAD_ALWAYS,
|
GST_PAD_ALWAYS,
|
||||||
|
@ -205,7 +207,7 @@ GST_START_TEST (test_srt)
|
||||||
GST_END_TEST;
|
GST_END_TEST;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
test_tmplayer_do_test (SubParseInputChunk * input, guint num)
|
do_test (SubParseInputChunk * input, guint num, const gchar * media_type)
|
||||||
{
|
{
|
||||||
guint n;
|
guint n;
|
||||||
|
|
||||||
|
@ -249,12 +251,24 @@ test_tmplayer_do_test (SubParseInputChunk * input, guint num)
|
||||||
fail_unless (GST_BUFFER_CAPS (buf) != NULL);
|
fail_unless (GST_BUFFER_CAPS (buf) != NULL);
|
||||||
buffer_caps_struct = gst_caps_get_structure (GST_BUFFER_CAPS (buf), 0);
|
buffer_caps_struct = gst_caps_get_structure (GST_BUFFER_CAPS (buf), 0);
|
||||||
fail_unless_equals_string (gst_structure_get_name (buffer_caps_struct),
|
fail_unless_equals_string (gst_structure_get_name (buffer_caps_struct),
|
||||||
"text/plain");
|
media_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
teardown_subparse ();
|
teardown_subparse ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_tmplayer_do_test (SubParseInputChunk * input, guint num)
|
||||||
|
{
|
||||||
|
do_test (input, num, "text/plain");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_microdvd_do_test (SubParseInputChunk * input, guint num)
|
||||||
|
{
|
||||||
|
do_test (input, num, "text/x-pango-markup");
|
||||||
|
}
|
||||||
|
|
||||||
GST_START_TEST (test_tmplayer_multiline)
|
GST_START_TEST (test_tmplayer_multiline)
|
||||||
{
|
{
|
||||||
static SubParseInputChunk tmplayer_multiline_input[] = {
|
static SubParseInputChunk tmplayer_multiline_input[] = {
|
||||||
|
@ -392,6 +406,30 @@ GST_START_TEST (test_tmplayer_style4_with_bogus_lines)
|
||||||
|
|
||||||
GST_END_TEST;
|
GST_END_TEST;
|
||||||
|
|
||||||
|
GST_START_TEST (test_microdvd_with_fps)
|
||||||
|
{
|
||||||
|
static SubParseInputChunk microdvd_input[] = {
|
||||||
|
{
|
||||||
|
"{1}{1}12.500\n{100}{200}- Hi, Eddie.|- Hiya, Scotty.\n",
|
||||||
|
8 * GST_SECOND, 16 * GST_SECOND,
|
||||||
|
"<span>- Hi, Eddie.</span>\n<span>- Hiya, Scotty.</span>"}, {
|
||||||
|
"{1250}{1350}- Cold enough for you?|- Well, I'm only faintly alive. "
|
||||||
|
"It's 25 below\n",
|
||||||
|
100 * GST_SECOND, 108 * GST_SECOND,
|
||||||
|
"<span>- Cold enough for you?</span>\n"
|
||||||
|
"<span>- Well, I'm only faintly alive. It's 25 below</span>"}
|
||||||
|
};
|
||||||
|
|
||||||
|
test_microdvd_do_test (microdvd_input, G_N_ELEMENTS (microdvd_input));
|
||||||
|
|
||||||
|
/* and the same with ',' instead of '.' as floating point divider */
|
||||||
|
microdvd_input[0].in =
|
||||||
|
"{1}{1}12,500\n{100}{200}- Hi, Eddie.|- Hiya, Scotty.\n";
|
||||||
|
test_microdvd_do_test (microdvd_input, G_N_ELEMENTS (microdvd_input));
|
||||||
|
}
|
||||||
|
|
||||||
|
GST_END_TEST;
|
||||||
|
|
||||||
/* TODO:
|
/* TODO:
|
||||||
* - add/modify tests so that lines aren't dogfed to the parsers in complete
|
* - add/modify tests so that lines aren't dogfed to the parsers in complete
|
||||||
* lines or sets of complete lines, but rather in random chunks
|
* lines or sets of complete lines, but rather in random chunks
|
||||||
|
@ -413,6 +451,7 @@ subparse_suite (void)
|
||||||
tcase_add_test (tc_chain, test_tmplayer_style3);
|
tcase_add_test (tc_chain, test_tmplayer_style3);
|
||||||
tcase_add_test (tc_chain, test_tmplayer_style4);
|
tcase_add_test (tc_chain, test_tmplayer_style4);
|
||||||
tcase_add_test (tc_chain, test_tmplayer_style4_with_bogus_lines);
|
tcase_add_test (tc_chain, test_tmplayer_style4_with_bogus_lines);
|
||||||
|
tcase_add_test (tc_chain, test_microdvd_with_fps);
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue