dvb: src: consolidate tuning stats gathering

Additionally: drop unneeded fe_fd variable.
This commit is contained in:
Reynaldo H. Verdejo Pinochet 2017-06-29 14:35:40 -07:00
parent da44d1f0a9
commit 43335d31c6

View file

@ -253,7 +253,8 @@ enum
#define DEFAULT_INTERLEAVING 0 #define DEFAULT_INTERLEAVING 0
#endif #endif
static void gst_dvbsrc_output_frontend_stats (GstDvbSrc * src); static gboolean gst_dvbsrc_output_frontend_stats (GstDvbSrc * src,
fe_status_t * status);
#define GST_TYPE_DVBSRC_CODE_RATE (gst_dvbsrc_code_rate_get_type ()) #define GST_TYPE_DVBSRC_CODE_RATE (gst_dvbsrc_code_rate_get_type ())
static GType static GType
@ -1931,6 +1932,7 @@ gst_dvbsrc_create (GstPushSrc * element, GstBuffer ** buf)
gint buffer_size; gint buffer_size;
GstFlowReturn retval = GST_FLOW_ERROR; GstFlowReturn retval = GST_FLOW_ERROR;
GstDvbSrc *object; GstDvbSrc *object;
fe_status_t status;
object = GST_DVBSRC (element); object = GST_DVBSRC (element);
GST_LOG ("fd_dvr: %d", object->fd_dvr); GST_LOG ("fd_dvr: %d", object->fd_dvr);
@ -1948,7 +1950,7 @@ gst_dvbsrc_create (GstPushSrc * element, GstBuffer ** buf)
if (object->stats_interval && if (object->stats_interval &&
++object->stats_counter == object->stats_interval) { ++object->stats_counter == object->stats_interval) {
gst_dvbsrc_output_frontend_stats (object); gst_dvbsrc_output_frontend_stats (object, &status);
object->stats_counter = 0; object->stats_counter = 0;
} }
} }
@ -2178,55 +2180,60 @@ gst_dvbsrc_do_tune (GstDvbSrc * src)
gst_dvbsrc_tune (src); gst_dvbsrc_tune (src);
} }
static void static gboolean
gst_dvbsrc_output_frontend_stats (GstDvbSrc * src) gst_dvbsrc_output_frontend_stats (GstDvbSrc * src, fe_status_t * status)
{ {
fe_status_t status;
guint16 snr, signal; guint16 snr, signal;
guint32 ber, bad_blks; guint32 ber, bad_blks;
GstMessage *message; GstMessage *message;
GstStructure *structure; GstStructure *structure;
int fe_fd = src->fd_frontend;
gint err; gint err;
LOOP_WHILE_EINTR (err, ioctl (fe_fd, FE_READ_STATUS, &status)); errno = 0;
if (!err) {
structure = gst_structure_new ("dvb-frontend-stats", LOOP_WHILE_EINTR (err, ioctl (src->fd_frontend, FE_READ_STATUS, status));
"status", G_TYPE_INT, status, if (err) {
"lock", G_TYPE_BOOLEAN, status & FE_HAS_LOCK, NULL); GST_ERROR_OBJECT (src, "Failed querying frontend for tuning status"
} else { " %s (%d)", g_strerror (errno), errno);
GST_ERROR_OBJECT (src, "Error getting frontend status: '%s'", return FALSE;
g_strerror (errno));
return;
} }
errno = 0; structure = gst_structure_new ("dvb-frontend-stats",
LOOP_WHILE_EINTR (err, ioctl (fe_fd, FE_READ_SIGNAL_STRENGTH, &signal)); "status", G_TYPE_INT, status,
"lock", G_TYPE_BOOLEAN, *status & FE_HAS_LOCK, NULL);
LOOP_WHILE_EINTR (err, ioctl (src->fd_frontend, FE_READ_SIGNAL_STRENGTH,
&signal));
if (!err) if (!err)
gst_structure_set (structure, "signal", G_TYPE_INT, signal, NULL); gst_structure_set (structure, "signal", G_TYPE_INT, signal, NULL);
LOOP_WHILE_EINTR (err, ioctl (fe_fd, FE_READ_SNR, &snr)); LOOP_WHILE_EINTR (err, ioctl (src->fd_frontend, FE_READ_SNR, &snr));
if (!err) if (!err)
gst_structure_set (structure, "snr", G_TYPE_INT, snr, NULL); gst_structure_set (structure, "snr", G_TYPE_INT, snr, NULL);
LOOP_WHILE_EINTR (err, ioctl (fe_fd, FE_READ_BER, &ber)); LOOP_WHILE_EINTR (err, ioctl (src->fd_frontend, FE_READ_BER, &ber));
if (!err) if (!err)
gst_structure_set (structure, "ber", G_TYPE_INT, ber, NULL); gst_structure_set (structure, "ber", G_TYPE_INT, ber, NULL);
LOOP_WHILE_EINTR (err, ioctl (fe_fd, FE_READ_UNCORRECTED_BLOCKS, &bad_blks)); LOOP_WHILE_EINTR (err, ioctl (src->fd_frontend, FE_READ_UNCORRECTED_BLOCKS,
&bad_blks));
if (!err) if (!err)
gst_structure_set (structure, "unc", G_TYPE_INT, bad_blks, NULL); gst_structure_set (structure, "unc", G_TYPE_INT, bad_blks, NULL);
if (errno) if (errno) {
GST_WARNING_OBJECT (src, GST_WARNING_OBJECT (src,
"There were errors getting frontend status information: '%s'", "There were errors getting frontend status information: '%s'",
g_strerror (errno)); g_strerror (errno));
}
GST_INFO_OBJECT (src, "Frontend stats: %" GST_PTR_FORMAT, structure); GST_INFO_OBJECT (src, "Frontend stats: %" GST_PTR_FORMAT, structure);
message = gst_message_new_element (GST_OBJECT (src), structure); message = gst_message_new_element (GST_OBJECT (src), structure);
gst_element_post_message (GST_ELEMENT (src), message); gst_element_post_message (GST_ELEMENT (src), message);
return TRUE;
} }
static void static void
diseqc_send_msg (int fd, fe_sec_voltage_t v, struct dvb_diseqc_master_cmd *cmd, diseqc_send_msg (int fd, fe_sec_voltage_t v, struct dvb_diseqc_master_cmd *cmd,
fe_sec_tone_mode_t t, fe_sec_mini_cmd_t b) fe_sec_tone_mode_t t, fe_sec_mini_cmd_t b)
@ -2374,14 +2381,10 @@ gst_dvbsrc_tune_fe (GstDvbSrc * object)
/* signal locking loop */ /* signal locking loop */
do { do {
LOOP_WHILE_EINTR (err, ioctl (object->fd_frontend, FE_READ_STATUS,
&status)); if (!gst_dvbsrc_output_frontend_stats (object, &status))
if (err) {
GST_WARNING_OBJECT (object, "Failed querying frontend for tuning status"
" %s (%d)", g_strerror (errno), errno);
goto fail_with_signal; goto fail_with_signal;
}
gst_dvbsrc_output_frontend_stats (object);
/* keep retrying forever if tuning_timeout = 0 */ /* keep retrying forever if tuning_timeout = 0 */
if (object->tuning_timeout) if (object->tuning_timeout)
elapsed_time = GST_CLOCK_DIFF (start, gst_util_get_timestamp ()); elapsed_time = GST_CLOCK_DIFF (start, gst_util_get_timestamp ());