summaryrefslogtreecommitdiffstats
path: root/ext/annodex/gstcmmlparser.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/annodex/gstcmmlparser.c')
-rw-r--r--ext/annodex/gstcmmlparser.c45
1 files changed, 37 insertions, 8 deletions
diff --git a/ext/annodex/gstcmmlparser.c b/ext/annodex/gstcmmlparser.c
index c7931ea6..1411478a 100644
--- a/ext/annodex/gstcmmlparser.c
+++ b/ext/annodex/gstcmmlparser.c
@@ -22,12 +22,17 @@
*/
#include <string.h>
+#include <stdarg.h>
#include <gst/gst.h>
#include "gstcmmlparser.h"
#include "gstannodex.h"
#include "gstcmmlutils.h"
+GST_DEBUG_CATEGORY (cmmlparser);
+#define GST_CAT_DEFAULT cmmlparser
+
+static void gst_cmml_parser_generic_error (void *ctx, const char *msg, ...);
static xmlNodePtr gst_cmml_parser_new_node (GstCmmlParser * parser,
const gchar * name, ...);
static void
@@ -42,6 +47,15 @@ static void gst_cmml_parser_parse_processing_instruction (xmlParserCtxtPtr ctxt,
static void gst_cmml_parser_meta_to_string (GstCmmlParser * parser,
xmlNodePtr parent, GValueArray * meta);
+/* initialize the parser */
+void
+gst_cmml_parser_init (void)
+{
+ GST_DEBUG_CATEGORY_INIT (cmmlparser, "cmmlparser", 0, "annodex CMML parser");
+
+ xmlGenericError = gst_cmml_parser_generic_error;
+}
+
/* create a new CMML parser
*/
GstCmmlParser *
@@ -58,7 +72,8 @@ gst_cmml_parser_new (GstCmmlParserMode mode)
(startElementNsSAX2Func) gst_cmml_parser_parse_start_element_ns;
parser->context->sax->endElementNs =
(endElementNsSAX2Func) gst_cmml_parser_parse_end_element_ns;
- parser->context->sax->processingInstruction = (processingInstructionSAXFunc)
+ parser->context->sax->processingInstruction =
+ (processingInstructionSAXFunc)
gst_cmml_parser_parse_processing_instruction;
parser->preamble_callback = NULL;
parser->cmml_end_callback = NULL;
@@ -463,13 +478,18 @@ gst_cmml_parser_parse_clip (GstCmmlParser * parser, xmlNodePtr clip)
GstClockTime start_time = GST_CLOCK_TIME_NONE;
GstClockTime end_time = GST_CLOCK_TIME_NONE;
- g_value_init (&str_val, G_TYPE_STRING);
+ start = xmlGetProp (clip, (xmlChar *) "start");
+ if (parser->mode == GST_CMML_PARSER_ENCODE && start == NULL)
+ /* XXX: validate the document */
+ return;
id = xmlGetProp (clip, (xmlChar *) "id");
track = xmlGetProp (clip, (xmlChar *) "track");
- start = xmlGetProp (clip, (xmlChar *) "start");
end = xmlGetProp (clip, (xmlChar *) "end");
+ if (track == NULL)
+ track = (guchar *) g_strdup ("default");
+
if (start) {
if (!strncmp ((gchar *) start, "smpte", 5))
start_time = gst_cmml_clock_time_from_smpte ((gchar *) start);
@@ -484,11 +504,7 @@ gst_cmml_parser_parse_clip (GstCmmlParser * parser, xmlNodePtr clip)
end_time = gst_cmml_clock_time_from_npt ((gchar *) end);
}
- if (track == NULL)
- track = (guchar *) g_strdup ("default");
-
- clip_tag = g_object_new (GST_TYPE_CMML_TAG_CLIP,
- "id", id,
+ clip_tag = g_object_new (GST_TYPE_CMML_TAG_CLIP, "id", id,
"track", track, "start-time", start_time, "end-time", end_time, NULL);
g_free (id);
@@ -496,6 +512,8 @@ gst_cmml_parser_parse_clip (GstCmmlParser * parser, xmlNodePtr clip)
g_free (start);
g_free (end);
+ g_value_init (&str_val, G_TYPE_STRING);
+
/* parse the children */
for (walk = clip->children; walk; walk = walk->next) {
/* the clip is not empty */
@@ -545,6 +563,17 @@ gst_cmml_parser_meta_to_string (GstCmmlParser * parser,
}
}
+static void
+gst_cmml_parser_generic_error (void *ctx, const char *msg, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, msg);
+ gst_debug_log_valist (GST_CAT_DEFAULT, GST_LEVEL_WARNING,
+ "", "", 0, NULL, msg, varargs);
+ va_end (varargs);
+}
+
/* sax handler called when an element start tag is found
* this is used to parse the cmml start tag
*/