Beispiel #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;
}
Beispiel #2
0
static GstFlowReturn
gst_dvbsrc_create (GstPushSrc * element, GstBuffer ** buf)
{
  gint buffer_size;
  GstFlowReturn retval = GST_FLOW_ERROR;
  GstDvbSrc *object;

  object = GST_DVBSRC (element);
  GST_LOG ("fd_dvr: %d", object->fd_dvr);

  //g_object_get(G_OBJECT(object), "blocksize", &buffer_size, NULL);
  buffer_size = DEFAULT_BUFFER_SIZE;

  /* device can not be tuned during read */
  g_mutex_lock (&object->tune_mutex);


  if (object->fd_dvr > -1) {
    /* --- Read TS from DVR device --- */
    GST_DEBUG_OBJECT (object, "Reading from DVR device");
    retval = gst_dvbsrc_read_device (object, buffer_size, buf);

    if (object->stats_interval != 0 &&
        ++object->stats_counter == object->stats_interval) {
      gst_dvbsrc_output_frontend_stats (object);
      object->stats_counter = 0;
    }
  }

  g_mutex_unlock (&object->tune_mutex);

  return retval;

}
Beispiel #3
0
static gboolean
gst_dvbsrc_stop (GstBaseSrc * bsrc)
{
    GstDvbSrc *src = GST_DVBSRC (bsrc);

    gst_dvbsrc_close_devices (src);
    return TRUE;
}
Beispiel #4
0
static gboolean
gst_dvbsrc_unlock_stop (GstBaseSrc * bsrc)
{
  GstDvbSrc *src = GST_DVBSRC (bsrc);

  src->need_unlock = FALSE;
  return TRUE;
}
Beispiel #5
0
static gboolean
gst_dvbsrc_unlock_stop (GstBaseSrc * bsrc)
{
  GstDvbSrc *src = GST_DVBSRC (bsrc);

  gst_poll_set_flushing (src->poll, FALSE);
  return TRUE;
}
Beispiel #6
0
static gboolean
gst_dvbsrc_stop (GstBaseSrc * bsrc)
{
  GstDvbSrc *src = GST_DVBSRC (bsrc);

  gst_dvbsrc_close_devices (src);
  if (src->poll) {
    gst_poll_free (src->poll);
    src->poll = NULL;
  }

  return TRUE;
}
Beispiel #7
0
static GstFlowReturn
gst_dvbsrc_create (GstPushSrc * element, GstBuffer ** buf)
{
    gint buffer_size;
    GstFlowReturn retval = GST_FLOW_ERROR;
    GstDvbSrc *object;

    object = GST_DVBSRC (element);
    GST_LOG ("fd_dvr: %d", object->fd_dvr);

    //g_object_get(G_OBJECT(object), "blocksize", &buffer_size, NULL);
    buffer_size = DEFAULT_BUFFER_SIZE;

    /* device can not be tuned during read */
    g_mutex_lock (object->tune_mutex);


    if (object->fd_dvr > -1) {
        /* --- Read TS from DVR device --- */
        GST_DEBUG_OBJECT (object, "Reading from DVR device");
        *buf = read_device (object->fd_dvr, object->adapter_number,
                            object->frontend_number, buffer_size, object);
        if (*buf != NULL) {
            GstCaps *caps;

            retval = GST_FLOW_OK;

            caps = gst_pad_get_caps (GST_BASE_SRC_PAD (object));
            gst_buffer_set_caps (*buf, caps);
            gst_caps_unref (caps);
        } else {
            GST_DEBUG_OBJECT (object, "Failed to read from device");
            gst_element_post_message (GST_ELEMENT_CAST (object),
                                      gst_message_new_element (GST_OBJECT (object),
                                              gst_structure_empty_new ("dvb-read-failure")));
        }

        if (object->stats_interval != 0 &&
                ++object->stats_counter == object->stats_interval) {
            gst_dvbsrc_output_frontend_stats (object);
            object->stats_counter = 0;
        }
    }

    g_mutex_unlock (object->tune_mutex);
    return retval;

}
Beispiel #8
0
static void
gst_dvbsrc_finalize (GObject * _object)
{
    GstDvbSrc *object;

    GST_DEBUG_OBJECT (_object, "gst_dvbsrc_finalize");

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

    /* freeing the mutex segfaults somehow */
    g_mutex_free (object->tune_mutex);

    if (G_OBJECT_CLASS (parent_class)->finalize)
        G_OBJECT_CLASS (parent_class)->finalize (_object);
}
Beispiel #9
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;
}
Beispiel #10
0
static GstStateChangeReturn
gst_dvbsrc_change_state (GstElement * element, GstStateChange transition)
{
    GstDvbSrc *src;
    GstStateChangeReturn ret;

    src = GST_DVBSRC (element);
    ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);

    switch (transition) {
    case GST_STATE_CHANGE_NULL_TO_READY:
        /* open frontend then close it again, just so caps sent */
        gst_dvbsrc_open_frontend (src);
        if (src->fd_frontend) {
            close (src->fd_frontend);
        }
        break;
    default:
        break;
    }

    return ret;
}
Beispiel #11
0
static void
gst_dvbsrc_get_property (GObject * _object, guint prop_id,
                         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:
        g_value_set_int (value, object->adapter_number);
        break;
    case ARG_DVBSRC_FRONTEND:
        g_value_set_int (value, object->frontend_number);
        break;
    case ARG_DVBSRC_FREQUENCY:
        g_value_set_int (value, object->freq);
        break;
    case ARG_DVBSRC_POLARITY:
        if (object->pol == DVB_POL_H)
            g_value_set_string (value, "H");
        else
            g_value_set_string (value, "V");
        break;
    case ARG_DVBSRC_SYM_RATE:
        g_value_set_int (value, object->sym_rate);
        break;
    case ARG_DVBSRC_DISEQC_SRC:
        g_value_set_int (value, object->diseqc_src);
        break;
    case ARG_DVBSRC_BANDWIDTH:
        g_value_set_enum (value, object->bandwidth);
        break;
    case ARG_DVBSRC_CODE_RATE_HP:
        g_value_set_enum (value, object->code_rate_hp);
        break;
    case ARG_DVBSRC_CODE_RATE_LP:
        g_value_set_enum (value, object->code_rate_lp);
        break;
    case ARG_DVBSRC_GUARD:
        g_value_set_enum (value, object->guard_interval);
        break;
    case ARG_DVBSRC_MODULATION:
        g_value_set_enum (value, object->modulation);
        break;
    case ARG_DVBSRC_TRANSMISSION_MODE:
        g_value_set_enum (value, object->transmission_mode);
        break;
    case ARG_DVBSRC_HIERARCHY_INF:
        g_value_set_enum (value, object->hierarchy_information);
        break;
    case ARG_DVBSRC_INVERSION:
        g_value_set_enum (value, object->inversion);
        break;
    case ARG_DVBSRC_STATS_REPORTING_INTERVAL:
        g_value_set_uint (value, object->stats_interval);
        break;
    default:
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
    }
}
Beispiel #12
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);
    }

}