subparse: Add typefinder for LRC subtitles
authorSebastian Dröge <sebastian@centricular.com>
Wed, 18 Dec 2013 14:07:47 +0000 (15:07 +0100)
committerSebastian Dröge <sebastian@centricular.com>
Wed, 18 Dec 2013 14:52:53 +0000 (15:52 +0100)
gst/subparse/gstsubparse.c
gst/subparse/gstsubparse.h

index a8b8b1f..057e4be 100644 (file)
@@ -1287,6 +1287,34 @@ gst_sub_parse_data_format_autodetect (gchar * match_str)
     GST_LOG ("QTtext (time based) format detected");
     return GST_SUB_PARSE_FORMAT_QTTEXT;
   }
+  /* We assume the LRC file starts immediately */
+  if (match_str[0] == '[') {
+    gboolean all_lines_good = TRUE;
+    gchar **split;
+    gchar **ptr;
+
+    ptr = split = g_strsplit (match_str, "\n", -1);
+    while (*ptr && *(ptr + 1)) {
+      gchar *str = *ptr;
+      gint len = strlen (str);
+
+      if (sscanf (str, "[%u:%02u.%02u]", &n1, &n2, &n3) == 3 ||
+          sscanf (str, "[%u:%02u.%03u]", &n1, &n2, &n3) == 3) {
+        all_lines_good = TRUE;
+      } else if (str[len - 1] == ']' && strchr (str, ':') != NULL) {
+        all_lines_good = TRUE;
+      } else {
+        all_lines_good = FALSE;
+        break;
+      }
+
+      ptr++;
+    }
+    g_strfreev (split);
+
+    if (all_lines_good)
+      return GST_SUB_PARSE_FORMAT_LRC;
+  }
 
   GST_DEBUG ("no subtitle format detected");
   return GST_SUB_PARSE_FORMAT_UNKNOWN;
@@ -1672,6 +1700,9 @@ static GstStaticCaps qttext_caps =
 GST_STATIC_CAPS ("application/x-subtitle-qttext");
 #define QTTEXT_CAPS (gst_static_caps_get (&qttext_caps))
 
+static GstStaticCaps lrc_caps = GST_STATIC_CAPS ("application/x-subtitle-lrc");
+#define LRC_CAPS (gst_static_caps_get (&lrc_caps))
+
 static void
 gst_subparse_type_find (GstTypeFind * tf, gpointer private)
 {
@@ -1772,6 +1803,10 @@ gst_subparse_type_find (GstTypeFind * tf, gpointer private)
       GST_DEBUG ("QTtext format detected");
       caps = QTTEXT_CAPS;
       break;
+    case GST_SUB_PARSE_FORMAT_LRC:
+      GST_DEBUG ("LRC format detected");
+      caps = LRC_CAPS;
+      break;
     default:
     case GST_SUB_PARSE_FORMAT_UNKNOWN:
       GST_DEBUG ("no subtitle format detected");
index 5b5fd0d..012aee6 100644 (file)
@@ -55,7 +55,8 @@ typedef enum
   GST_SUB_PARSE_FORMAT_MPL2 = 6,
   GST_SUB_PARSE_FORMAT_SUBVIEWER = 7,
   GST_SUB_PARSE_FORMAT_DKS = 8,
-  GST_SUB_PARSE_FORMAT_QTTEXT = 9
+  GST_SUB_PARSE_FORMAT_QTTEXT = 9,
+  GST_SUB_PARSE_FORMAT_LRC = 10
 } GstSubParseFormat;
 
 typedef struct {