dvb/parsechannels: implement channels.conf format autodetection

Simple autodetection avoids having to call the parsers
one after the other.
This commit is contained in:
Reynaldo H. Verdejo Pinochet 2016-06-22 16:14:33 -07:00
parent d9e0e43ca7
commit 219d4c132c

View file

@ -37,10 +37,18 @@
#include <linux/dvb/frontend.h> #include <linux/dvb/frontend.h>
typedef enum
{
CHANNEL_CONF_FORMAT_NONE,
CHANNEL_CONF_FORMAT_DVBV5,
CHANNEL_CONF_FORMAT_ZAP
} GstDvbChannelConfFormat;
static gboolean parse_and_configure_from_v5_conf_file (GstElement * dvbbasebin, static gboolean parse_and_configure_from_v5_conf_file (GstElement * dvbbasebin,
const gchar * filename, const gchar * channel_name, GError ** error); const gchar * filename, const gchar * channel_name, GError ** error);
static gboolean parse_and_configure_from_zap_conf_file (GstElement * dvbbasebin, static gboolean parse_and_configure_from_zap_conf_file (GstElement * dvbbasebin,
const gchar * filename, const gchar * channel_name, GError ** error); const gchar * filename, const gchar * channel_name, GError ** error);
static GstDvbChannelConfFormat detect_file_format (const gchar * filename);
GST_DEBUG_CATEGORY_EXTERN (dvb_base_bin_debug); GST_DEBUG_CATEGORY_EXTERN (dvb_base_bin_debug);
@ -776,6 +784,36 @@ unknown_channel:
} }
} }
static GstDvbChannelConfFormat
detect_file_format (const gchar * filename)
{
gchar *contents;
gchar **lines;
gchar **line;
GstDvbChannelConfFormat ret = CHANNEL_CONF_FORMAT_NONE;
if (!g_file_get_contents (filename, &contents, NULL, NULL))
return ret;
lines = g_strsplit (contents, "\n", 0);
line = lines;
while (*line) {
if (g_str_has_prefix (*line, "[") && g_str_has_suffix (*line, "]")) {
ret = CHANNEL_CONF_FORMAT_DVBV5;
break;
} else if (g_strrstr (*line, ":")) {
ret = CHANNEL_CONF_FORMAT_ZAP;
break;
}
line++;
}
g_strfreev (lines);
g_free (contents);
return ret;
}
gboolean gboolean
set_properties_for_channel (GstElement * dvbbasebin, set_properties_for_channel (GstElement * dvbbasebin,
const gchar * channel_name, GError ** error) const gchar * channel_name, GError ** error)
@ -790,23 +828,37 @@ set_properties_for_channel (GstElement * dvbbasebin,
"gstreamer-" GST_API_VERSION, "dvb-channels.conf", NULL); "gstreamer-" GST_API_VERSION, "dvb-channels.conf", NULL);
} }
/* TODO detect channels.conf file format */
adapter = g_getenv ("GST_DVB_ADAPTER"); adapter = g_getenv ("GST_DVB_ADAPTER");
if (adapter) if (adapter)
g_object_set (dvbbasebin, "adapter", atoi (adapter), NULL); g_object_set (dvbbasebin, "adapter", atoi (adapter), NULL);
if (!(ret = parse_and_configure_from_v5_conf_file (dvbbasebin, filename, switch (detect_file_format (filename)) {
channel_name, error))) { case CHANNEL_CONF_FORMAT_DVBV5:
/* TODO only fallback if it was a parsing error */ if (!parse_and_configure_from_v5_conf_file (dvbbasebin, filename,
channel_name, error)) {
g_clear_error (error); GST_WARNING_OBJECT (dvbbasebin, "Could not parse libdvbv5 channel "
GST_DEBUG_OBJECT (dvbbasebin, "Resorting to old ZAP format file parsing"); "configuration file '%s'", filename);
} else {
/* fallback to old format */ GST_INFO_OBJECT (dvbbasebin, "Parsed libdvbv5 channel configuration "
ret = parse_and_configure_from_zap_conf_file (dvbbasebin, filename, "file");
channel_name, error); ret = TRUE;
} }
break;
case CHANNEL_CONF_FORMAT_ZAP:
if (!parse_and_configure_from_zap_conf_file (dvbbasebin, filename,
channel_name, error)) {
GST_WARNING_OBJECT (dvbbasebin, "Could not parse ZAP channel "
"configuration file '%s'", filename);
} else {
GST_INFO_OBJECT (dvbbasebin, "Parsed ZAP channel configuration file");
ret = TRUE;
}
break;
default:
GST_WARNING_OBJECT (dvbbasebin, "Unknown configuration file format. "
"Can not get parameters for channel");
}
g_free (filename); g_free (filename);
return ret; return ret;
} }