Я пытаюсь отобразить текст с помощью GStreamer. Текст - это временная метка, которую я хочу обновить для каждого кадра моего видеоисточника. Временная метка будет затем накладываться на видеопоток, захваченный из v4l2src.
Проблема заключается в том, что на выходе дисплея отображается только самая первая временная метка. Конвейер продолжает работать, вызывается пробник и отправляет данные в приложение. Я не вижу никакой ошибки в выходных данных отладки (GST_DEBUG = 4).
Обратите внимание, я не хочу использовать плагины timeoverlay или clockoverlay, так как я буду использовать плагин с аппаратным ускорением, доступный на моем SoC, для выполненияналожение. Я просто хочу создать видеопоток с текстом, который затем можно направить в мой плагин наложения.
Это конвейеры в тестовом приложении:
auto src_pipe = gst_parse_launch("videotestsrc ! video/x-raw,width=1920,height=1080,format=YUY2 ! fakesink name=camera");
auto time_pipe = gst_parse_launch("appsrc name=time_overlay format=3 is-live=true do-timestamp=true ! text/x-raw,format=utf8 ! textrender ! video/x-raw,format=ARGB,framerate=30/1,width=720,height=480 ! autovideoconvert ! autovideosink");
И я использую следующеепробник для генерации текста:
auto src = gst_bin_get_by_name(GST_BIN(src_pipe), "camera");
auto time_appsrc = gst_bin_get_by_name(GST_BIN(time_pipe), "time_overlay");
auto pad = gst_element_get_static_pad (src, "sink");
gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER, (GstPadProbeCallback) cb_have_data, time_appsrc, NULL);
gst_object_unref (pad);
static void push_time(GstElement *time_appsrc)
{
GstFlowReturn ret;
GstMapInfo map;
struct timespec tp;
clock_gettime(CLOCK_REALTIME, &tp);
static std::string time;
time = "The time " + std::to_string(tp.tv_sec) + "sec " + std::to_string(tp.tv_nsec) + "ns";
auto buffer = gst_buffer_new_and_alloc (time.size());
GST_BUFFER_TIMESTAMP (buffer) = gst_util_uint64_scale (1, GST_SECOND, 25);
GST_BUFFER_DURATION (buffer) = gst_util_uint64_scale (1, GST_SECOND, 25);
gst_buffer_map (buffer, &map, GST_MAP_WRITE);
memcpy(map.data, time.c_str(), time.size());
gst_buffer_unmap (buffer, &map);
g_signal_emit_by_name (time_appsrc, "push-buffer", buffer, &ret);
gst_buffer_unref (buffer);
}
static GstPadProbeReturn cb_have_data (GstPad *pad, GstPadProbeInfo *info, gpointer user_data)
{
GstMapInfo map;
GstBuffer *buffer;
GstElement *time_appsrc = (GstElement *)user_data;
buffer = GST_PAD_PROBE_INFO_BUFFER (info);
push_time(time_appsrc);
GST_PAD_PROBE_INFO_DATA (info) = buffer;
return GST_PAD_PROBE_OK;
}