changing text in Textoverlay during stream in GST-RTSP-SERVER
horai
ivo.hora at seznam.cz
Sun Mar 4 18:02:44 UTC 2018
Dear all,
I have added variable text to GST-RTSP-SERVER by modifying file
rtsp-media-factory.c and adding text/x-raw pad to element Textoverlay.It is
supposed to read temperature value from file provided by temperature sensor
in /proc
The pipeline I am using for test-launch example is:
videotestsrc ! textoverlay name=textoverlay ! omxh264enc ! video/x-h264,
width=800, height=480, framerate=30/1, profile=high ! h264parse ! rtph264pay
name=pay0 pt=96
It works but the stream is incredibly slow compared the raw server without
such a modification.
Please, could anyone help me resolve this issue or could anyone verify
whether it is done in a correct way?
I am enclosing methods added and modified in rtsp-media-factory.c
#define O_RDONLY 00
void readTemperatureFromSensor(char* result) {
g_print("reading temperature from sensor\r\n");
DIR *dir;
struct dirent *dirent;
char dev[16]; // Dev ID
char devPath[128]; // Path to device
char buf[256]; // Data from device
char tmpData[6]; // Temp C * 1000 reported by device
char path[] = "/sys/bus/w1/devices";
ssize_t numRead;
dir = opendir(path);
if (dir != NULL) {
while ((dirent = readdir(dir)))
// 1-wire devices are links beginning with 28-
if (dirent->d_type == DT_LNK &&
strstr(dirent->d_name, "28-") != NULL) {
strcpy(dev, dirent->d_name);
printf("\nDevice: %s\n", dev);
}
(void) closedir(dir);
} else {
perror("Couldn't open the w1 devices directory");
return 1;
}
// Assemble path to OneWire device
sprintf(devPath, "%s/%s/w1_slave", path, dev);
// Read temp continuously
// Opening the device's file triggers new reading
int fd = open(devPath, O_RDONLY);
if (fd == -1) {
perror("Couldn't open the w1 device.");
return 1;
}
while ((numRead = read(fd, buf, 256)) > 0) {
strncpy(tmpData, strstr(buf, "t=") + 2, 5);
float tempC = strtof(tmpData, NULL);
printf("Device: %s - ", dev);
printf("Temp: %.3f C ", tempC / 1000);
printf("%.3f F\n\n", (tempC / 1000) * 9 / 5 + 32);
snprintf(result, strlen(result), "%f", tempC);
}
g_print("finished reading temperature\r\n");
}
#define APPSRC_CAPS "text/x-raw,format=(string)utf8"
static gboolean
read_data(GstElement * appsrc) {
g_print("read data started\r\n");
int t = 0;
GstFlowReturn ret;
GstBuffer * buffer;
//buffer = gst_buffer_new();
buffer = gst_buffer_new();
GstMemory *mem;
char* temperature = NULL;
temperature = malloc(10 * sizeof(char));
readTemperatureFromSensor(temperature);
g_print("temperature variable content:%s\r\n", temperature);
mem = gst_allocator_alloc(NULL, strlen(temperature), NULL);
gst_buffer_append_memory(buffer, mem);
g_print("buffer size:%d", strlen(temperature));
gst_buffer_fill(buffer, 0, temperature, strlen(temperature));
g_signal_emit_by_name(appsrc, "push-buffer", buffer, &ret);
g_print("size:%d\r\n", gst_buffer_get_size(buffer));
gst_buffer_unref(buffer);
g_free(temperature);
g_print("read data stopped\r\n");
}
static void
start_feed(GstElement * pipeline, guint size, gpointer * appsrc) {
g_print("feed started\r\n");
g_idle_add((GSourceFunc) read_data, appsrc);
}
static GstElement *
default_create_element(GstRTSPMediaFactory * factory, const GstRTSPUrl *
url) {
GstRTSPMediaFactoryPrivate *priv = factory->priv;
GstElement *element;
GError *error = NULL;
GST_RTSP_MEDIA_FACTORY_LOCK(factory);
/* we need a parse syntax */
if (priv->launch == NULL)
goto no_launch;
/* parse the user provided launch line */
element =
gst_parse_launch_full(priv->launch, NULL,
GST_PARSE_FLAG_PLACE_IN_BIN,
&error);
if (element == NULL) {
goto parse_error;
} else {
GstElement* appsrc = gst_element_factory_make("appsrc", "appsrc");
GstCaps* caps = gst_caps_from_string(APPSRC_CAPS);
g_object_set(appsrc, "caps", caps, NULL);
gst_caps_unref(caps);
g_object_set(G_OBJECT(appsrc),
"stream-type", 0, // GST_APP_STREAM_TYPE_STREAM
"format", GST_FORMAT_TIME,
"is-live", TRUE,
NULL);
gst_bin_add(GST_BIN(element), appsrc);
GstElement* textoverlay = gst_bin_get_by_name(GST_BIN(element),
"textoverlay");
GstPad* srcpad = gst_element_get_static_pad(appsrc, "src");
GstPad* sinkpad = gst_element_get_static_pad(textoverlay,
"text_sink");
GstPadLinkReturn ret = gst_pad_link(srcpad, sinkpad);
g_signal_connect(appsrc, "need-data", G_CALLBACK(start_feed),
appsrc);
gst_element_sync_state_with_parent(appsrc);
gst_element_sync_state_with_parent(textoverlay);
g_print("finished adding textoverlay element");
}
GST_RTSP_MEDIA_FACTORY_UNLOCK(factory);
etc.
Best regards,
Ivo
--
Sent from: http://gstreamer-devel.966125.n4.nabble.com/
More information about the gstreamer-devel
mailing list