static gboolean
parse_and_configure_from_zap_conf_file (GstElement * dvbbasebin,
    const gchar * filename, const gchar * channel_name, GError ** error)
{
  gboolean ret = FALSE;
  GHashTable *channels, *params;
  gchar *type;

  /**
   * Assumptions are made here about a format that is loosely
   * defined. Particularly, we assume a given delivery system
   * out of counting the number of fields per line. dvbsrc has
   * smarter code to auto-detect a delivery system based on
   * known-correct combinations of parameters so if you ever
   * encounter cases where the delivery system is being
   * wrongly set here, just remove the offending
   * g_object_set line and let dvbsrc work his magic out.
   */

  channels = parse_channels_conf_from_file (dvbbasebin, filename, error);

  if (!channels)
    goto beach;

  params = g_hash_table_lookup (channels, channel_name);

  if (!params)
    goto unknown_channel;

  g_object_set (dvbbasebin, "program-numbers",
      g_hash_table_lookup (params, "sid"), NULL);
  /* check if it is terrestrial or satellite */
  g_object_set (dvbbasebin, "frequency",
      atoi (g_hash_table_lookup (params, "frequency")), NULL);
  type = g_hash_table_lookup (params, "type");
  if (strcmp (type, "terrestrial") == 0) {
    gchar *val;

    val = g_hash_table_lookup (params, "inversion");
    if (strcmp (val, "INVERSION_OFF") == 0)
      g_object_set (dvbbasebin, "inversion", INVERSION_OFF, NULL);
    else if (strcmp (val, "INVERSION_ON") == 0)
      g_object_set (dvbbasebin, "inversion", INVERSION_ON, NULL);
    else
      g_object_set (dvbbasebin, "inversion", INVERSION_AUTO, NULL);

    val = g_hash_table_lookup (params, "bandwidth");
    if (strcmp (val, "BANDWIDTH_8_MHZ") == 0)
      g_object_set (dvbbasebin, "bandwidth", 0, NULL);
    else if (strcmp (val, "BANDWIDTH_7_MHZ") == 0)
      g_object_set (dvbbasebin, "bandwidth", 1, NULL);
    else if (strcmp (val, "BANDWIDTH_6_MHZ") == 0)
      g_object_set (dvbbasebin, "bandwidth", 2, NULL);
    else if (strcmp (val, "BANDWIDTH_5_MHZ") == 0)
      g_object_set (dvbbasebin, "bandwidth", 4, NULL);
    else if (strcmp (val, "BANDWIDTH_10_MHZ") == 0)
      g_object_set (dvbbasebin, "bandwidth", 5, NULL);
    else if (strcmp (val, "BANDWIDTH_1_712_MHZ") == 0)
      g_object_set (dvbbasebin, "bandwidth", 6, NULL);
    else
      g_object_set (dvbbasebin, "bandwidth", 3, NULL);

    val = g_hash_table_lookup (params, "code-rate-hp");
    if (strcmp (val, "FEC_NONE") == 0)
      g_object_set (dvbbasebin, "code-rate-hp", 0, NULL);
    else if (strcmp (val, "FEC_1_2") == 0)
      g_object_set (dvbbasebin, "code-rate-hp", 1, NULL);
    else if (strcmp (val, "FEC_2_3") == 0)
      g_object_set (dvbbasebin, "code-rate-hp", 2, NULL);
    else if (strcmp (val, "FEC_3_4") == 0)
      g_object_set (dvbbasebin, "code-rate-hp", 3, NULL);
    else if (strcmp (val, "FEC_4_5") == 0)
      g_object_set (dvbbasebin, "code-rate-hp", 4, NULL);
    else if (strcmp (val, "FEC_5_6") == 0)
      g_object_set (dvbbasebin, "code-rate-hp", 5, NULL);
    else if (strcmp (val, "FEC_6_7") == 0)
      g_object_set (dvbbasebin, "code-rate-hp", 6, NULL);
    else if (strcmp (val, "FEC_7_8") == 0)
      g_object_set (dvbbasebin, "code-rate-hp", 7, NULL);
    else if (strcmp (val, "FEC_8_9") == 0)
      g_object_set (dvbbasebin, "code-rate-hp", 8, NULL);
    else
      g_object_set (dvbbasebin, "code-rate-hp", 9, NULL);

    val = g_hash_table_lookup (params, "code-rate-lp");
    if (strcmp (val, "FEC_NONE") == 0)
      g_object_set (dvbbasebin, "code-rate-lp", 0, NULL);
    else if (strcmp (val, "FEC_1_2") == 0)
      g_object_set (dvbbasebin, "code-rate-lp", 1, NULL);
    else if (strcmp (val, "FEC_2_3") == 0)
      g_object_set (dvbbasebin, "code-rate-lp", 2, NULL);
    else if (strcmp (val, "FEC_3_4") == 0)
      g_object_set (dvbbasebin, "code-rate-lp", 3, NULL);
    else if (strcmp (val, "FEC_4_5") == 0)
      g_object_set (dvbbasebin, "code-rate-lp", 4, NULL);
    else if (strcmp (val, "FEC_5_6") == 0)
      g_object_set (dvbbasebin, "code-rate-lp", 5, NULL);
    else if (strcmp (val, "FEC_6_7") == 0)
      g_object_set (dvbbasebin, "code-rate-lp", 6, NULL);
    else if (strcmp (val, "FEC_7_8") == 0)
      g_object_set (dvbbasebin, "code-rate-lp", 7, NULL);
    else if (strcmp (val, "FEC_8_9") == 0)
      g_object_set (dvbbasebin, "code-rate-lp", 8, NULL);
    else
      g_object_set (dvbbasebin, "code-rate-lp", 9, NULL);

    val = g_hash_table_lookup (params, "modulation");
    if (strcmp (val, "QPSK") == 0)
      g_object_set (dvbbasebin, "modulation", 0, NULL);
    else if (strcmp (val, "QAM_16") == 0)
      g_object_set (dvbbasebin, "modulation", 1, NULL);
    else if (strcmp (val, "QAM_32") == 0)
      g_object_set (dvbbasebin, "modulation", 2, NULL);
    else if (strcmp (val, "QAM_64") == 0)
      g_object_set (dvbbasebin, "modulation", 3, NULL);
    else if (strcmp (val, "QAM_128") == 0)
      g_object_set (dvbbasebin, "modulation", 4, NULL);
    else if (strcmp (val, "QAM_256") == 0)
      g_object_set (dvbbasebin, "modulation", 5, NULL);
    else
      g_object_set (dvbbasebin, "modulation", 6, NULL);

    val = g_hash_table_lookup (params, "transmission-mode");
    if (strcmp (val, "TRANSMISSION_MODE_2K") == 0)
      g_object_set (dvbbasebin, "trans-mode", 0, NULL);
    else if (strcmp (val, "TRANSMISSION_MODE_8K") == 0)
      g_object_set (dvbbasebin, "trans-mode", 1, NULL);
    else
      g_object_set (dvbbasebin, "trans-mode", 2, NULL);

    val = g_hash_table_lookup (params, "guard");
    if (strcmp (val, "GUARD_INTERVAL_1_32") == 0)
      g_object_set (dvbbasebin, "guard", 0, NULL);
    else if (strcmp (val, "GUARD_INTERVAL_1_16") == 0)
      g_object_set (dvbbasebin, "guard", 1, NULL);
    else if (strcmp (val, "GUARD_INTERVAL_1_8") == 0)
      g_object_set (dvbbasebin, "guard", 2, NULL);
    else if (strcmp (val, "GUARD_INTERVAL_1_4") == 0)
      g_object_set (dvbbasebin, "guard", 3, NULL);
    else
      g_object_set (dvbbasebin, "guard", 4, NULL);

    val = g_hash_table_lookup (params, "hierarchy");
    if (strcmp (val, "HIERARCHY_NONE") == 0)
      g_object_set (dvbbasebin, "hierarchy", 0, NULL);
    else if (strcmp (val, "HIERARCHY_1") == 0)
      g_object_set (dvbbasebin, "hierarchy", 1, NULL);
    else if (strcmp (val, "HIERARCHY_2") == 0)
      g_object_set (dvbbasebin, "hierarchy", 2, NULL);
    else if (strcmp (val, "HIERARCHY_4") == 0)
      g_object_set (dvbbasebin, "hierarchy", 3, NULL);
    else
      g_object_set (dvbbasebin, "hierarchy", 4, NULL);

    ret = TRUE;
  } else if (strcmp (type, "satellite") == 0) {
    gchar *val;

    ret = TRUE;

    g_object_set (dvbbasebin, "delsys", SYS_DVBS, NULL);

    val = g_hash_table_lookup (params, "polarity");
    if (val)
      g_object_set (dvbbasebin, "polarity", val, NULL);
    else
      ret = FALSE;

    val = g_hash_table_lookup (params, "diseqc-source");
    if (val)
      g_object_set (dvbbasebin, "diseqc-source", atoi (val), NULL);

    val = g_hash_table_lookup (params, "symbol-rate");
    if (val)
      g_object_set (dvbbasebin, "symbol-rate", atoi (val), NULL);
    else
      ret = FALSE;
  } else if (strcmp (type, "cable") == 0) {
    gchar *val;

    g_object_set (dvbbasebin, "delsys", SYS_DVBC_ANNEX_A, NULL);

    ret = TRUE;
    val = g_hash_table_lookup (params, "symbol-rate");
    if (val)
      g_object_set (dvbbasebin, "symbol-rate", atoi (val) / 1000, NULL);
    val = g_hash_table_lookup (params, "modulation");
    if (strcmp (val, "QPSK") == 0)
      g_object_set (dvbbasebin, "modulation", 0, NULL);
    else if (strcmp (val, "QAM_16") == 0)
      g_object_set (dvbbasebin, "modulation", 1, NULL);
    else if (strcmp (val, "QAM_32") == 0)
      g_object_set (dvbbasebin, "modulation", 2, NULL);
    else if (strcmp (val, "QAM_64") == 0)
      g_object_set (dvbbasebin, "modulation", 3, NULL);
    else if (strcmp (val, "QAM_128") == 0)
      g_object_set (dvbbasebin, "modulation", 4, NULL);
    else if (strcmp (val, "QAM_256") == 0)
      g_object_set (dvbbasebin, "modulation", 5, NULL);
    else
      g_object_set (dvbbasebin, "modulation", 6, NULL);
    val = g_hash_table_lookup (params, "code-rate-hp");
    if (strcmp (val, "FEC_NONE") == 0)
      g_object_set (dvbbasebin, "code-rate-hp", 0, NULL);
    else if (strcmp (val, "FEC_1_2") == 0)
      g_object_set (dvbbasebin, "code-rate-hp", 1, NULL);
    else if (strcmp (val, "FEC_2_3") == 0)
      g_object_set (dvbbasebin, "code-rate-hp", 2, NULL);
    else if (strcmp (val, "FEC_3_4") == 0)
      g_object_set (dvbbasebin, "code-rate-hp", 3, NULL);
    else if (strcmp (val, "FEC_4_5") == 0)
      g_object_set (dvbbasebin, "code-rate-hp", 4, NULL);
    else if (strcmp (val, "FEC_5_6") == 0)
      g_object_set (dvbbasebin, "code-rate-hp", 5, NULL);
    else if (strcmp (val, "FEC_6_7") == 0)
      g_object_set (dvbbasebin, "code-rate-hp", 6, NULL);
    else if (strcmp (val, "FEC_7_8") == 0)
      g_object_set (dvbbasebin, "code-rate-hp", 7, NULL);
    else if (strcmp (val, "FEC_8_9") == 0)
      g_object_set (dvbbasebin, "code-rate-hp", 8, NULL);
    else
      g_object_set (dvbbasebin, "code-rate-hp", 9, NULL);
    val = g_hash_table_lookup (params, "inversion");
    if (strcmp (val, "INVERSION_OFF") == 0)
      g_object_set (dvbbasebin, "inversion", 0, NULL);
    else if (strcmp (val, "INVERSION_ON") == 0)
      g_object_set (dvbbasebin, "inversion", 1, NULL);
    else
      g_object_set (dvbbasebin, "inversion", 2, NULL);
  } else if (strcmp (type, "atsc") == 0) {
    gchar *val;

    ret = TRUE;

    g_object_set (dvbbasebin, "delsys", SYS_ATSC, NULL);

    val = g_hash_table_lookup (params, "modulation");
    if (strcmp (val, "QAM_64") == 0)
      g_object_set (dvbbasebin, "modulation", 3, NULL);
    else if (strcmp (val, "QAM_256") == 0)
      g_object_set (dvbbasebin, "modulation", 5, NULL);
    else if (strcmp (val, "8VSB") == 0)
      g_object_set (dvbbasebin, "modulation", 7, NULL);
    else if (strcmp (val, "16VSB") == 0)
      g_object_set (dvbbasebin, "modulation", 8, NULL);
    else
      ret = FALSE;
  }

  destroy_channels_hash (channels);

beach:
  return ret;

unknown_channel:
  {
    /* FIXME: is channel name guaranteed to be ASCII or UTF-8? */
    g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_NOT_FOUND,
        _("Couldn't find details for DVB channel %s"), channel_name);
    destroy_channels_hash (channels);
    return FALSE;
  }
}
Пример #2
0
gboolean
set_properties_for_channel (GstElement * dvbbasebin,
                            const gchar * channel_name, GError ** error)
{
    gboolean ret = FALSE;
    GHashTable *channels, *params;
    gchar *filename;
    gchar *type;
    const gchar *adapter;

    filename = g_strdup (g_getenv ("GST_DVB_CHANNELS_CONF"));
    if (filename == NULL) {
        filename = g_build_filename (g_get_user_config_dir (),
                                     "gstreamer-" GST_API_VERSION, "dvb-channels.conf", NULL);
    }
    channels = parse_channels_conf_from_file (dvbbasebin, filename, error);
    g_free (filename);

    if (!channels)
        goto beach;

    params = g_hash_table_lookup (channels, channel_name);

    if (!params)
        goto unknown_channel;

    g_object_set (dvbbasebin, "program-numbers",
                  g_hash_table_lookup (params, "sid"), NULL);
    /* check if it is terrestrial or satellite */
    adapter = g_getenv ("GST_DVB_ADAPTER");
    if (adapter)
        g_object_set (dvbbasebin, "adapter", atoi (adapter), NULL);
    g_object_set (dvbbasebin, "frequency",
                  atoi (g_hash_table_lookup (params, "frequency")), NULL);
    type = g_hash_table_lookup (params, "type");
    if (strcmp (type, "terrestrial") == 0) {
        gchar *val;

        g_object_set (dvbbasebin, "delsys", SYS_DVBT, NULL);

        val = g_hash_table_lookup (params, "inversion");
        if (strcmp (val, "INVERSION_OFF") == 0)
            g_object_set (dvbbasebin, "inversion", 0, NULL);
        else if (strcmp (val, "INVERSION_ON") == 0)
            g_object_set (dvbbasebin, "inversion", 1, NULL);
        else
            g_object_set (dvbbasebin, "inversion", 2, NULL);

        val = g_hash_table_lookup (params, "bandwidth");
        if (strcmp (val, "BANDWIDTH_8_MHZ") == 0)
            g_object_set (dvbbasebin, "bandwidth", 0, NULL);
        else if (strcmp (val, "BANDWIDTH_7_MHZ") == 0)
            g_object_set (dvbbasebin, "bandwidth", 1, NULL);
        else if (strcmp (val, "BANDWIDTH_6_MHZ") == 0)
            g_object_set (dvbbasebin, "bandwidth", 2, NULL);
        else
            g_object_set (dvbbasebin, "bandwidth", 3, NULL);

        val = g_hash_table_lookup (params, "code-rate-hp");
        if (strcmp (val, "FEC_NONE") == 0)
            g_object_set (dvbbasebin, "code-rate-hp", 0, NULL);
        else if (strcmp (val, "FEC_1_2") == 0)
            g_object_set (dvbbasebin, "code-rate-hp", 1, NULL);
        else if (strcmp (val, "FEC_2_3") == 0)
            g_object_set (dvbbasebin, "code-rate-hp", 2, NULL);
        else if (strcmp (val, "FEC_3_4") == 0)
            g_object_set (dvbbasebin, "code-rate-hp", 3, NULL);
        else if (strcmp (val, "FEC_4_5") == 0)
            g_object_set (dvbbasebin, "code-rate-hp", 4, NULL);
        else if (strcmp (val, "FEC_5_6") == 0)
            g_object_set (dvbbasebin, "code-rate-hp", 5, NULL);
        else if (strcmp (val, "FEC_6_7") == 0)
            g_object_set (dvbbasebin, "code-rate-hp", 6, NULL);
        else if (strcmp (val, "FEC_7_8") == 0)
            g_object_set (dvbbasebin, "code-rate-hp", 7, NULL);
        else if (strcmp (val, "FEC_8_9") == 0)
            g_object_set (dvbbasebin, "code-rate-hp", 8, NULL);
        else
            g_object_set (dvbbasebin, "code-rate-hp", 9, NULL);

        val = g_hash_table_lookup (params, "code-rate-lp");
        if (strcmp (val, "FEC_NONE") == 0)
            g_object_set (dvbbasebin, "code-rate-lp", 0, NULL);
        else if (strcmp (val, "FEC_1_2") == 0)
            g_object_set (dvbbasebin, "code-rate-lp", 1, NULL);
        else if (strcmp (val, "FEC_2_3") == 0)
            g_object_set (dvbbasebin, "code-rate-lp", 2, NULL);
        else if (strcmp (val, "FEC_3_4") == 0)
            g_object_set (dvbbasebin, "code-rate-lp", 3, NULL);
        else if (strcmp (val, "FEC_4_5") == 0)
            g_object_set (dvbbasebin, "code-rate-lp", 4, NULL);
        else if (strcmp (val, "FEC_5_6") == 0)
            g_object_set (dvbbasebin, "code-rate-lp", 5, NULL);
        else if (strcmp (val, "FEC_6_7") == 0)
            g_object_set (dvbbasebin, "code-rate-lp", 6, NULL);
        else if (strcmp (val, "FEC_7_8") == 0)
            g_object_set (dvbbasebin, "code-rate-lp", 7, NULL);
        else if (strcmp (val, "FEC_8_9") == 0)
            g_object_set (dvbbasebin, "code-rate-lp", 8, NULL);
        else
            g_object_set (dvbbasebin, "code-rate-lp", 9, NULL);

        val = g_hash_table_lookup (params, "modulation");
        if (strcmp (val, "QPSK") == 0)
            g_object_set (dvbbasebin, "modulation", 0, NULL);
        else if (strcmp (val, "QAM_16") == 0)
            g_object_set (dvbbasebin, "modulation", 1, NULL);
        else if (strcmp (val, "QAM_32") == 0)
            g_object_set (dvbbasebin, "modulation", 2, NULL);
        else if (strcmp (val, "QAM_64") == 0)
            g_object_set (dvbbasebin, "modulation", 3, NULL);
        else if (strcmp (val, "QAM_128") == 0)
            g_object_set (dvbbasebin, "modulation", 4, NULL);
        else if (strcmp (val, "QAM_256") == 0)
            g_object_set (dvbbasebin, "modulation", 5, NULL);
        else
            g_object_set (dvbbasebin, "modulation", 6, NULL);

        val = g_hash_table_lookup (params, "transmission-mode");
        if (strcmp (val, "TRANSMISSION_MODE_2K") == 0)
            g_object_set (dvbbasebin, "trans-mode", 0, NULL);
        else if (strcmp (val, "TRANSMISSION_MODE_8K") == 0)
            g_object_set (dvbbasebin, "trans-mode", 1, NULL);
        else
            g_object_set (dvbbasebin, "trans-mode", 2, NULL);

        val = g_hash_table_lookup (params, "guard");
        if (strcmp (val, "GUARD_INTERVAL_1_32") == 0)
            g_object_set (dvbbasebin, "guard", 0, NULL);
        else if (strcmp (val, "GUARD_INTERVAL_1_16") == 0)
            g_object_set (dvbbasebin, "guard", 1, NULL);
        else if (strcmp (val, "GUARD_INTERVAL_1_8") == 0)
            g_object_set (dvbbasebin, "guard", 2, NULL);
        else if (strcmp (val, "GUARD_INTERVAL_1_4") == 0)
            g_object_set (dvbbasebin, "guard", 3, NULL);
        else
            g_object_set (dvbbasebin, "guard", 4, NULL);

        val = g_hash_table_lookup (params, "hierarchy");
        if (strcmp (val, "HIERARCHY_NONE") == 0)
            g_object_set (dvbbasebin, "hierarchy", 0, NULL);
        else if (strcmp (val, "HIERARCHY_1") == 0)
            g_object_set (dvbbasebin, "hierarchy", 1, NULL);
        else if (strcmp (val, "HIERARCHY_2") == 0)
            g_object_set (dvbbasebin, "hierarchy", 2, NULL);
        else if (strcmp (val, "HIERARCHY_4") == 0)
            g_object_set (dvbbasebin, "hierarchy", 3, NULL);
        else
            g_object_set (dvbbasebin, "hierarchy", 4, NULL);

        ret = TRUE;
    } else if (strcmp (type, "satellite") == 0) {
        gchar *val;

        ret = TRUE;

        g_object_set (dvbbasebin, "delsys", SYS_DVBS, NULL);

        val = g_hash_table_lookup (params, "polarity");
        if (val)
            g_object_set (dvbbasebin, "polarity", val, NULL);
        else
            ret = FALSE;

        val = g_hash_table_lookup (params, "diseqc-source");
        if (val)
            g_object_set (dvbbasebin, "diseqc-source", atoi (val), NULL);

        val = g_hash_table_lookup (params, "symbol-rate");
        if (val)
            g_object_set (dvbbasebin, "symbol-rate", atoi (val), NULL);
        else
            ret = FALSE;
    } else if (strcmp (type, "cable") == 0) {
        gchar *val;

        g_object_set (dvbbasebin, "delsys", SYS_DVBC_ANNEX_A, NULL);

        ret = TRUE;
        val = g_hash_table_lookup (params, "symbol-rate");
        if (val)
            g_object_set (dvbbasebin, "symbol-rate", atoi (val) / 1000, NULL);
        val = g_hash_table_lookup (params, "modulation");
        if (strcmp (val, "QPSK") == 0)
            g_object_set (dvbbasebin, "modulation", 0, NULL);
        else if (strcmp (val, "QAM_16") == 0)
            g_object_set (dvbbasebin, "modulation", 1, NULL);
        else if (strcmp (val, "QAM_32") == 0)
            g_object_set (dvbbasebin, "modulation", 2, NULL);
        else if (strcmp (val, "QAM_64") == 0)
            g_object_set (dvbbasebin, "modulation", 3, NULL);
        else if (strcmp (val, "QAM_128") == 0)
            g_object_set (dvbbasebin, "modulation", 4, NULL);
        else if (strcmp (val, "QAM_256") == 0)
            g_object_set (dvbbasebin, "modulation", 5, NULL);
        else
            g_object_set (dvbbasebin, "modulation", 6, NULL);
        val = g_hash_table_lookup (params, "code-rate-hp");
        if (strcmp (val, "FEC_NONE") == 0)
            g_object_set (dvbbasebin, "code-rate-hp", 0, NULL);
        else if (strcmp (val, "FEC_1_2") == 0)
            g_object_set (dvbbasebin, "code-rate-hp", 1, NULL);
        else if (strcmp (val, "FEC_2_3") == 0)
            g_object_set (dvbbasebin, "code-rate-hp", 2, NULL);
        else if (strcmp (val, "FEC_3_4") == 0)
            g_object_set (dvbbasebin, "code-rate-hp", 3, NULL);
        else if (strcmp (val, "FEC_4_5") == 0)
            g_object_set (dvbbasebin, "code-rate-hp", 4, NULL);
        else if (strcmp (val, "FEC_5_6") == 0)
            g_object_set (dvbbasebin, "code-rate-hp", 5, NULL);
        else if (strcmp (val, "FEC_6_7") == 0)
            g_object_set (dvbbasebin, "code-rate-hp", 6, NULL);
        else if (strcmp (val, "FEC_7_8") == 0)
            g_object_set (dvbbasebin, "code-rate-hp", 7, NULL);
        else if (strcmp (val, "FEC_8_9") == 0)
            g_object_set (dvbbasebin, "code-rate-hp", 8, NULL);
        else
            g_object_set (dvbbasebin, "code-rate-hp", 9, NULL);
        val = g_hash_table_lookup (params, "inversion");
        if (strcmp (val, "INVERSION_OFF") == 0)
            g_object_set (dvbbasebin, "inversion", 0, NULL);
        else if (strcmp (val, "INVERSION_ON") == 0)
            g_object_set (dvbbasebin, "inversion", 1, NULL);
        else
            g_object_set (dvbbasebin, "inversion", 2, NULL);
    } else if (strcmp (type, "atsc") == 0) {
        gchar *val;

        ret = TRUE;

        g_object_set (dvbbasebin, "delsys", SYS_ATSC, NULL);

        val = g_hash_table_lookup (params, "modulation");
        if (strcmp (val, "QAM_64") == 0)
            g_object_set (dvbbasebin, "modulation", 3, NULL);
        else if (strcmp (val, "QAM_256") == 0)
            g_object_set (dvbbasebin, "modulation", 5, NULL);
        else if (strcmp (val, "8VSB") == 0)
            g_object_set (dvbbasebin, "modulation", 7, NULL);
        else if (strcmp (val, "16VSB") == 0)
            g_object_set (dvbbasebin, "modulation", 8, NULL);
        else
            ret = FALSE;
    }

    destroy_channels_hash (channels);

beach:
    return ret;

unknown_channel:
    {
        /* FIXME: is channel name guaranteed to be ASCII or UTF-8? */
        g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_NOT_FOUND,
                     _("Couldn't find details for DVB channel %s"), channel_name);
        destroy_channels_hash (channels);
        return FALSE;
    }
}
Пример #3
0
gboolean
set_properties_for_channel (GObject * dvbbasebin, const gchar * channel_name)
{
  gboolean ret = FALSE;
  GHashTable *channels;
  gchar *filename;

  filename = g_strdup (g_getenv ("GST_DVB_CHANNELS_CONF"));
  if (filename == NULL) {
    guint major, minor, micro, nano;

    gst_version (&major, &minor, &micro, &nano);
    filename = g_strdup_printf ("%s/.gstreamer-%d.%d/dvb-channels.conf",
        g_get_home_dir (), major, minor);
  }
  channels = parse_channels_conf_from_file (filename);
  g_free (filename);

  if (channels) {
    GHashTable *params = g_hash_table_lookup (channels,
        channel_name);

    if (params) {
      gchar *type;
      const gchar *adapter;

      g_object_set (dvbbasebin, "program-numbers",
          g_hash_table_lookup (params, "sid"), NULL);
      /* check if it is terrestrial or satellite */
      adapter = g_getenv ("GST_DVB_ADAPTER");
      if (adapter)
        g_object_set (dvbbasebin, "adapter", atoi (adapter), NULL);
      g_object_set (dvbbasebin, "frequency",
          atoi (g_hash_table_lookup (params, "frequency")), NULL);
      type = g_hash_table_lookup (params, "type");
      if (strcmp (type, "terrestrial") == 0) {
        gchar *val;

        val = g_hash_table_lookup (params, "inversion");
        if (strcmp (val, "INVERSION_OFF") == 0)
          g_object_set (dvbbasebin, "inversion", 0, NULL);
        else if (strcmp (val, "INVERSION_ON") == 0)
          g_object_set (dvbbasebin, "inversion", 1, NULL);
        else
          g_object_set (dvbbasebin, "inversion", 2, NULL);

        val = g_hash_table_lookup (params, "bandwidth");
        if (strcmp (val, "BANDWIDTH_8_MHZ") == 0)
          g_object_set (dvbbasebin, "bandwidth", 0, NULL);
        else if (strcmp (val, "BANDWIDTH_7_MHZ") == 0)
          g_object_set (dvbbasebin, "bandwidth", 1, NULL);
        else if (strcmp (val, "BANDWIDTH_6_MHZ") == 0)
          g_object_set (dvbbasebin, "bandwidth", 2, NULL);
        else
          g_object_set (dvbbasebin, "bandwidth", 3, NULL);

        val = g_hash_table_lookup (params, "code-rate-hp");
        if (strcmp (val, "FEC_NONE") == 0)
          g_object_set (dvbbasebin, "code-rate-hp", 0, NULL);
        else if (strcmp (val, "FEC_1_2") == 0)
          g_object_set (dvbbasebin, "code-rate-hp", 1, NULL);
        else if (strcmp (val, "FEC_2_3") == 0)
          g_object_set (dvbbasebin, "code-rate-hp", 2, NULL);
        else if (strcmp (val, "FEC_3_4") == 0)
          g_object_set (dvbbasebin, "code-rate-hp", 3, NULL);
        else if (strcmp (val, "FEC_4_5") == 0)
          g_object_set (dvbbasebin, "code-rate-hp", 4, NULL);
        else if (strcmp (val, "FEC_5_6") == 0)
          g_object_set (dvbbasebin, "code-rate-hp", 5, NULL);
        else if (strcmp (val, "FEC_6_7") == 0)
          g_object_set (dvbbasebin, "code-rate-hp", 6, NULL);
        else if (strcmp (val, "FEC_7_8") == 0)
          g_object_set (dvbbasebin, "code-rate-hp", 7, NULL);
        else if (strcmp (val, "FEC_8_9") == 0)
          g_object_set (dvbbasebin, "code-rate-hp", 8, NULL);
        else
          g_object_set (dvbbasebin, "code-rate-hp", 9, NULL);

        val = g_hash_table_lookup (params, "code-rate-lp");
        if (strcmp (val, "FEC_NONE") == 0)
          g_object_set (dvbbasebin, "code-rate-lp", 0, NULL);
        else if (strcmp (val, "FEC_1_2") == 0)
          g_object_set (dvbbasebin, "code-rate-lp", 1, NULL);
        else if (strcmp (val, "FEC_2_3") == 0)
          g_object_set (dvbbasebin, "code-rate-lp", 2, NULL);
        else if (strcmp (val, "FEC_3_4") == 0)
          g_object_set (dvbbasebin, "code-rate-lp", 3, NULL);
        else if (strcmp (val, "FEC_4_5") == 0)
          g_object_set (dvbbasebin, "code-rate-lp", 4, NULL);
        else if (strcmp (val, "FEC_5_6") == 0)
          g_object_set (dvbbasebin, "code-rate-lp", 5, NULL);
        else if (strcmp (val, "FEC_6_7") == 0)
          g_object_set (dvbbasebin, "code-rate-lp", 6, NULL);
        else if (strcmp (val, "FEC_7_8") == 0)
          g_object_set (dvbbasebin, "code-rate-lp", 7, NULL);
        else if (strcmp (val, "FEC_8_9") == 0)
          g_object_set (dvbbasebin, "code-rate-lp", 8, NULL);
        else
          g_object_set (dvbbasebin, "code-rate-lp", 9, NULL);

        val = g_hash_table_lookup (params, "modulation");
        if (strcmp (val, "QPSK") == 0)
          g_object_set (dvbbasebin, "modulation", 0, NULL);
        else if (strcmp (val, "QAM_16") == 0)
          g_object_set (dvbbasebin, "modulation", 1, NULL);
        else if (strcmp (val, "QAM_32") == 0)
          g_object_set (dvbbasebin, "modulation", 2, NULL);
        else if (strcmp (val, "QAM_64") == 0)
          g_object_set (dvbbasebin, "modulation", 3, NULL);
        else if (strcmp (val, "QAM_128") == 0)
          g_object_set (dvbbasebin, "modulation", 4, NULL);
        else if (strcmp (val, "QAM_256") == 0)
          g_object_set (dvbbasebin, "modulation", 5, NULL);
        else
          g_object_set (dvbbasebin, "modulation", 6, NULL);

        val = g_hash_table_lookup (params, "transmission-mode");
        if (strcmp (val, "TRANSMISSION_MODE_2K") == 0)
          g_object_set (dvbbasebin, "trans-mode", 0, NULL);
        else if (strcmp (val, "TRANSMISSION_MODE_8K") == 0)
          g_object_set (dvbbasebin, "trans-mode", 1, NULL);
        else
          g_object_set (dvbbasebin, "trans-mode", 2, NULL);

        val = g_hash_table_lookup (params, "guard");
        if (strcmp (val, "GUARD_INTERVAL_1_32") == 0)
          g_object_set (dvbbasebin, "guard", 0, NULL);
        else if (strcmp (val, "GUARD_INTERVAL_1_16") == 0)
          g_object_set (dvbbasebin, "guard", 1, NULL);
        else if (strcmp (val, "GUARD_INTERVAL_1_8") == 0)
          g_object_set (dvbbasebin, "guard", 2, NULL);
        else if (strcmp (val, "GUARD_INTERVAL_1_4") == 0)
          g_object_set (dvbbasebin, "guard", 3, NULL);
        else
          g_object_set (dvbbasebin, "guard", 4, NULL);

        val = g_hash_table_lookup (params, "hierarchy");
        if (strcmp (val, "HIERARCHY_NONE") == 0)
          g_object_set (dvbbasebin, "hierarchy", 0, NULL);
        else if (strcmp (val, "HIERARCHY_1") == 0)
          g_object_set (dvbbasebin, "hierarchy", 1, NULL);
        else if (strcmp (val, "HIERARCHY_2") == 0)
          g_object_set (dvbbasebin, "hierarchy", 2, NULL);
        else if (strcmp (val, "HIERARCHY_4") == 0)
          g_object_set (dvbbasebin, "hierarchy", 3, NULL);
        else
          g_object_set (dvbbasebin, "hierarchy", 4, NULL);

        ret = TRUE;
      } else if (strcmp (type, "satellite") == 0) {
        gchar *val;

        ret = TRUE;

        val = g_hash_table_lookup (params, "polarity");
        if (val)
          g_object_set (dvbbasebin, "polarity", val, NULL);
        else
          ret = FALSE;

        val = g_hash_table_lookup (params, "diseqc-source");
        if (val)
          g_object_set (dvbbasebin, "diseqc-source", atoi (val), NULL);

        val = g_hash_table_lookup (params, "symbol-rate");
        if (val)
          g_object_set (dvbbasebin, "symbol-rate", atoi (val), NULL);
        else
          ret = FALSE;
      } else if (strcmp (type, "cable") == 0) {
        gchar *val;

        ret = TRUE;
        val = g_hash_table_lookup (params, "symbol-rate");
        if (val)
          g_object_set (dvbbasebin, "symbol-rate", atoi (val) / 1000, NULL);
        val = g_hash_table_lookup (params, "modulation");
        if (strcmp (val, "QPSK") == 0)
          g_object_set (dvbbasebin, "modulation", 0, NULL);
        else if (strcmp (val, "QAM_16") == 0)
          g_object_set (dvbbasebin, "modulation", 1, NULL);
        else if (strcmp (val, "QAM_32") == 0)
          g_object_set (dvbbasebin, "modulation", 2, NULL);
        else if (strcmp (val, "QAM_64") == 0)
          g_object_set (dvbbasebin, "modulation", 3, NULL);
        else if (strcmp (val, "QAM_128") == 0)
          g_object_set (dvbbasebin, "modulation", 4, NULL);
        else if (strcmp (val, "QAM_256") == 0)
          g_object_set (dvbbasebin, "modulation", 5, NULL);
        else
          g_object_set (dvbbasebin, "modulation", 6, NULL);
        val = g_hash_table_lookup (params, "code-rate-hp");
        if (strcmp (val, "FEC_NONE") == 0)
          g_object_set (dvbbasebin, "code-rate-hp", 0, NULL);
        else if (strcmp (val, "FEC_1_2") == 0)
          g_object_set (dvbbasebin, "code-rate-hp", 1, NULL);
        else if (strcmp (val, "FEC_2_3") == 0)
          g_object_set (dvbbasebin, "code-rate-hp", 2, NULL);
        else if (strcmp (val, "FEC_3_4") == 0)
          g_object_set (dvbbasebin, "code-rate-hp", 3, NULL);
        else if (strcmp (val, "FEC_4_5") == 0)
          g_object_set (dvbbasebin, "code-rate-hp", 4, NULL);
        else if (strcmp (val, "FEC_5_6") == 0)
          g_object_set (dvbbasebin, "code-rate-hp", 5, NULL);
        else if (strcmp (val, "FEC_6_7") == 0)
          g_object_set (dvbbasebin, "code-rate-hp", 6, NULL);
        else if (strcmp (val, "FEC_7_8") == 0)
          g_object_set (dvbbasebin, "code-rate-hp", 7, NULL);
        else if (strcmp (val, "FEC_8_9") == 0)
          g_object_set (dvbbasebin, "code-rate-hp", 8, NULL);
        else
          g_object_set (dvbbasebin, "code-rate-hp", 9, NULL);
        val = g_hash_table_lookup (params, "inversion");
        if (strcmp (val, "INVERSION_OFF") == 0)
          g_object_set (dvbbasebin, "inversion", 0, NULL);
        else if (strcmp (val, "INVERSION_ON") == 0)
          g_object_set (dvbbasebin, "inversion", 1, NULL);
        else
          g_object_set (dvbbasebin, "inversion", 2, NULL);
      }
    }
    destroy_channels_hash (channels);
  }

  return ret;
}