在C中的Wayland表面上绘制文本

时间:2017-11-12 08:01:27

标签: c linux gstreamer frame-rate wayland

我是Wayland编程的新手。目前,我想创建一个应用程序,可以在Wayland客户端的表面上显示播放视频的FPS。 use

首先,我使用Gstreamer来读取fps。我已经执行了2种获取FPS的方法:

[1]使用计时器

/proc/self/maps

我使用了一个回调函数来计算FPS,并尝试使用 textoverlay 元素在播放视频中显示,但失败了。

[2]使用 fpsdisplaysink

static char prv_time_str[25] = {0,};
static volatile int fps_counter = 0;
static char str_fps[10] = "";
static time_t timer;
static char time_str[25];
static struct tm* tm_info;
static int ignored_first = 0;
static GstElement *overlay;

static GstPadProbeReturn
cb_have_data (GstPad          *pad,
              GstPadProbeInfo *info,
              gpointer         user_data)
{
    time(&timer);
    tm_info = localtime(&timer);
    strftime(time_str, 25, "%Y:%m:%d%H:%M:%S\n", tm_info);

    fps_counter++;
    if (!strlen(prv_time_str))
        strcpy(prv_time_str, time_str);
    if (strcmp(prv_time_str, time_str)) {
        if (ignored_first) {
            sprintf(str_fps, "FPS: %d", fps_counter);
            g_object_set (G_OBJECT (overlay), "text", str_fps, NULL);
            g_print("fps: %d\n", fps_counter);
        }
        ignored_first = 1;
        fps_counter = 0;
    }
    strcpy(prv_time_str, time_str);

    return GST_PAD_PROBE_OK;
}
 ...
overlay = gst_element_factory_make ("textoverlay", "overlay");
g_object_set (G_OBJECT (overlay), "font-desc", "Sans, 72", NULL);
gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER, (GstPadProbeCallback)cb_have_data, NULL, NULL);

我设置fpsdisplaysink的属性(" text-overlay"为TRUE),但它仍然失败。 FPS值根本不显示。

其次,我尝试创建一个wayland客户端(在weston背景上运行)以在屏幕上显示FPS(如上图所示 - 只是演示)。但我不知道这样做的方法。根据我在互联网上的调查,我可能会使用 cairo lib通过函数绘制文本( cairo_show_text cairo_show_glyphs )。

任何人都可以帮助我吗?感谢。

0 个答案:

没有答案