Poor performance when doing gst_buffer_map after gldownload
OS: Windows 10 64bit
CPU: intel i7-8700 3.2GHz
Graphics Card: AMD Radeon RX5700
Gstreamer: 1.16.2/1.17.2
When I try to call gst_buffer_map to get data, it costs about 24ms to doing gst_buffer_map. It only happens when fetching data downloaded from glMemory on AMD graphics card. I tried to use another AMD graphics card, but the same result.
If I use NVIDIA or Intel graphics card, everything is ok.
The sample code below shows the problem which costs 24ms to do gst_buffer_map. Please help, thanks.
GTimer *ti;
GstPadProbeReturn get_data(GstPad *pPad, GstPadProbeInfo *pInfo, gpointer data) {
GstBuffer *pBuffer = GST_BUFFER(pInfo->data);
g_timer_start(ti);
GstMapInfo mapInfo;
gst_buffer_map(pBuffer, &mapInfo, GST_MAP_READ);
gst_buffer_unmap(pBuffer, &mapInfo);
gdouble second = g_timer_elapsed(ti, nullptr); // 24 milliseconds
return GST_PAD_PROBE_OK;
}
void play() {
ti = g_timer_new();
GstElement *p = gst_pipeline_new(nullptr);
GstElement *src = gst_element_factory_make("gltestsrc", nullptr);
g_object_set(src, "is-live", TRUE, nullptr);
GstElement *download = gst_element_factory_make("gldownload", nullptr);
GstElement *capsfilter = gst_element_factory_make("capsfilter", nullptr);
GstCaps *caps = gst_caps_from_string("video/x-raw, width=1920, height=1080, framerate=60/1");
g_object_set(capsfilter, "caps", caps, nullptr);
GstElement *sink = gst_element_factory_make("fakesink", nullptr);
gst_bin_add_many(GST_BIN(p), src, download, capsfilter, sink, nullptr);
gst_element_link_many(src, download, capsfilter, sink, nullptr);
GstPad *pad = gst_element_get_static_pad(sink, "sink");
gst_pad_add_probe(pad, GST_PAD_PROBE_TYPE_BUFFER, get_data, this, nullptr);
gst_object_unref(pad);
gst_element_set_state(p, GST_STATE_PLAYING);
}