Пример #1
0
static gboolean
gst_dvbsrc_start (GstBaseSrc * bsrc)
{
    GstDvbSrc *src = GST_DVBSRC (bsrc);

    gst_dvbsrc_open_frontend (src);
    if (!gst_dvbsrc_tune (src)) {
        GST_ERROR_OBJECT (src, "Not able to lock on to the dvb channel");
        close (src->fd_frontend);
        return FALSE;
    }
    if (!gst_dvbsrc_frontend_status (src)) {
        /* unset filters also */
        gst_dvbsrc_unset_pes_filters (src);
        close (src->fd_frontend);
        return FALSE;
    }
    if (!gst_dvbsrc_open_dvr (src)) {
        GST_ERROR_OBJECT (src, "Not able to open dvr_device");
        /* unset filters also */
        gst_dvbsrc_unset_pes_filters (src);
        close (src->fd_frontend);
        return FALSE;
    }

    return TRUE;
}
Пример #2
0
static gboolean
gst_dvbsrc_start (GstBaseSrc * bsrc)
{
  GstDvbSrc *src = GST_DVBSRC (bsrc);

  gst_dvbsrc_open_frontend (src, TRUE);
  if (!gst_dvbsrc_tune (src)) {
    GST_ERROR_OBJECT (src, "Not able to lock on to the dvb channel");
    close (src->fd_frontend);
    return FALSE;
  }
  if (!gst_dvbsrc_frontend_status (src)) {
    /* unset filters also */
    gst_dvbsrc_unset_pes_filters (src);
    close (src->fd_frontend);
    return FALSE;
  }
  if (!gst_dvbsrc_open_dvr (src)) {
    GST_ERROR_OBJECT (src, "Not able to open dvr_device");
    /* unset filters also */
    gst_dvbsrc_unset_pes_filters (src);
    close (src->fd_frontend);
    return FALSE;
  }
  if (!(src->poll = gst_poll_new (TRUE))) {
    GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ_WRITE, (NULL),
        ("could not create an fdset: %s (%d)", g_strerror (errno), errno));
    /* unset filters also */
    gst_dvbsrc_unset_pes_filters (src);
    close (src->fd_frontend);
    return FALSE;
  } else {
    gst_poll_fd_init (&src->poll_fd_dvr);
    src->poll_fd_dvr.fd = src->fd_dvr;
    gst_poll_add_fd (src->poll, &src->poll_fd_dvr);
    gst_poll_fd_ctl_read (src->poll, &src->poll_fd_dvr, TRUE);
  }

  return TRUE;
}
Пример #3
0
static void
gst_dvbsrc_set_property (GObject * _object, guint prop_id,
                         const GValue * value, GParamSpec * pspec)
{
    GstDvbSrc *object;

    g_return_if_fail (GST_IS_DVBSRC (_object));
    object = GST_DVBSRC (_object);

    switch (prop_id) {
    case ARG_DVBSRC_ADAPTER:
        object->adapter_number = g_value_get_int (value);
        break;
    case ARG_DVBSRC_FRONTEND:
        object->frontend_number = g_value_get_int (value);
        break;
    case ARG_DVBSRC_DISEQC_SRC:
        if (object->diseqc_src != g_value_get_int (value)) {
            object->diseqc_src = g_value_get_int (value);
            object->send_diseqc = TRUE;
        }
        GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_DISEQC_ID");
        break;
    case ARG_DVBSRC_FREQUENCY:
        object->freq = g_value_get_int (value);
        GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_FREQUENCY");
        break;
    case ARG_DVBSRC_POLARITY:
    {
        const char *s = NULL;

        s = g_value_get_string (value);
        if (s != NULL)
            object->pol = (s[0] == 'h' || s[0] == 'H') ? DVB_POL_H : DVB_POL_V;
    }
    GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_POLARITY");
    break;
    case ARG_DVBSRC_PIDS:
    {
        gchar *pid_string;

        GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_PIDS");
        pid_string = g_value_dup_string (value);
        if (!strcmp (pid_string, "8192")) {
            /* get the whole ts */
            object->pids[0] = 8192;
        } else {
            int pid = 0;
            int pid_count;
            gchar **pids;
            char **tmp;

            tmp = pids = g_strsplit (pid_string, ":", MAX_FILTERS);
            if (pid_string)
                g_free (pid_string);

            /* always add the PAT and CAT pids */
            object->pids[0] = 0;
            object->pids[1] = 1;

            pid_count = 2;
            while (*pids != NULL && pid_count < MAX_FILTERS) {
                pid = strtol (*pids, NULL, 0);
                if (pid > 1 && pid <= 8192) {
                    GST_INFO_OBJECT (object, "Parsed Pid: %d\n", pid);
                    object->pids[pid_count] = pid;
                    pid_count++;
                }
                pids++;
            }

            g_strfreev (tmp);
        }
        /* if we are in playing or paused, then set filters now */
        GST_INFO_OBJECT (object, "checking if playing for setting pes filters");
        if (GST_ELEMENT (object)->current_state == GST_STATE_PLAYING ||
                GST_ELEMENT (object)->current_state == GST_STATE_PAUSED) {
            GST_INFO_OBJECT (object, "Setting pes filters now");
            gst_dvbsrc_set_pes_filters (object);
        }
    }
    break;
    case ARG_DVBSRC_SYM_RATE:
        object->sym_rate = g_value_get_int (value);
        GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_SYM_RATE to value %d",
                         g_value_get_int (value));
        break;

    case ARG_DVBSRC_BANDWIDTH:
        object->bandwidth = g_value_get_enum (value);
        break;
    case ARG_DVBSRC_CODE_RATE_HP:
        object->code_rate_hp = g_value_get_enum (value);
        break;
    case ARG_DVBSRC_CODE_RATE_LP:
        object->code_rate_lp = g_value_get_enum (value);
        break;
    case ARG_DVBSRC_GUARD:
        object->guard_interval = g_value_get_enum (value);
        break;
    case ARG_DVBSRC_MODULATION:
        object->modulation = g_value_get_enum (value);
        break;
    case ARG_DVBSRC_TRANSMISSION_MODE:
        object->transmission_mode = g_value_get_enum (value);
        break;
    case ARG_DVBSRC_HIERARCHY_INF:
        object->hierarchy_information = g_value_get_enum (value);
        break;
    case ARG_DVBSRC_INVERSION:
        object->inversion = g_value_get_enum (value);
        break;
    case ARG_DVBSRC_TUNE:
        GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_TUNE");
        /* if we are in paused/playing state tune now, otherwise in ready to paused state change */
        if (gst_element_get_state
                (GST_ELEMENT (object), NULL, NULL,
                 GST_CLOCK_TIME_NONE) > GST_STATE_READY) {
            g_mutex_lock (object->tune_mutex);
            gst_dvbsrc_tune (object);
            g_mutex_unlock (object->tune_mutex);
        }
        break;
    case ARG_DVBSRC_STATS_REPORTING_INTERVAL:
        object->stats_interval = g_value_get_uint (value);
        object->stats_counter = 0;
        break;
    default:
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
    }

}