Good afternoon, colleagues!
I am trying to develop a Gstreamer component that will read data from a GPS sensor and broadcast the data as strings like subtitles.
static GstFlowReturn
gst_gpssrc_create (GstBaseSrc * src, guint64 offset, guint size,
GstBuffer ** buf)
{
GstGpssrc *gpssrc = GST_GPSSRC (src);
GST_DEBUG_OBJECT (gpssrc, "create");
struct gps_data_t* gps_data = &gpssrc->gps_data;
if(gps_waiting(gps_data, 5000000)) { // 5-second timeout
if (gps_read(gps_data, NULL, 0 ) == -1) {
GST_ERROR_OBJECT(gpssrc, "Error reading GPS data: %s", gps_errstr(errno));
return GST_FLOW_ERROR;
} else {
if (MODE_SET != (MODE_SET & ((*gps_data).set))) {
return GST_FLOW_OK;
}
if (0 > (*gps_data).fix.mode || MODE_STR_NUM <= (*gps_data).fix.mode) {
(*gps_data).fix.mode = 0;
}
printf("Fix mode: %s (%d) Time: ", mode_str[(*gps_data).fix.mode], (*gps_data).fix.mode);
if (TIME_SET == (TIME_SET & (*gps_data).set)) {
// not 32 bit safe
printf("%ld.%09ld \n", (*gps_data).fix.time.tv_sec, (*gps_data).fix.time.tv_nsec);
} else {
puts("n/a ");
}
if (isfinite((*gps_data).fix.latitude) && isfinite((*gps_data).fix.longitude)) {
gchar data[256];
g_snprintf(data, sizeof(data), "Latitude: %f, Longitude: %f\n", (*gps_data).fix.latitude, (*gps_data).fix.longitude);
gsize data_size = strlen(data);
*buf = gst_buffer_new_and_alloc(data_size);
GstMapInfo map;
gst_buffer_map(*buf, &map, GST_MAP_WRITE);
memcpy(map.data, data, data_size);
gst_buffer_unmap(*buf, &map);
GST_BUFFER_TIMESTAMP(*buf) = gst_clock_get_time(gst_element_get_clock(GST_ELEMENT(gpssrc)));
GST_BUFFER_DURATION (*buf) = gst_util_uint64_scale_int(GST_SECOND, 1, 1); // 1-second duration
return GST_FLOW_OK;
} else {
printf("Lat n/a Lon n/a\n");
}
}
}
return GST_FLOW_OK;
}
And here I see that in some cases I don’t get any data and return GST_FLOW_OK and buf is NULL. This is causing an error.
What should I return if I have no GPS data?