Рендеринг текста с помощью Gstreamer (appsrc, textrender) - PullRequest
1 голос
/ 29 октября 2019

Я пытаюсь отобразить текст с помощью 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;
}

1 Ответ

0 голосов
/ 30 октября 2019

Нашел проблему. Я установил временную метку буфера на фиксированное значение ... Удаление строки ниже заставляет его работать как положено.

GST_BUFFER_TIMESTAMP (buffer) = gst_util_uint64_scale (1, GST_SECOND, 25);

...