Я столкнулся с проблемой при использовании gstappsr c pu sh -buffer, которая могла привести к утечке памяти. Я получаю внешний поток данных в функции обратного вызова need-data, а затем вызываю pu sh -buffer для pu sh потока данных, но не каждый раз, когда поступает действительный поток данных. После долгого В то время я обнаружил, что RES процесса под командой TOP росли медленно. Я полагаю, нужно ли использовать pu sh -buffer в функции обратного вызова need-data? Ниже приведен фрагмент моего кода
static gboolean cb_need_data (GstElement *appsrc, guint unused_size, gpointer user_data)
{
if (condition)// condition check
{
static gboolean white = FALSE;
gst_buffer_memset(buf, 0, white ? 0x00 : 0xFF, VIDEO_SIZE);
white = !white;
GST_BUFFER_PTS (buf) = timestamp;
GST_BUFFER_DURATION (buf) = gst_util_uint64_scale_int (1, GST_SECOND, FRAMERATE);
timestamp += GST_BUFFER_DURATION (buf);
// ret = gst_app_src_push_buffer(GST_APP_SRC(appsrc), buf);
g_signal_emit_by_name(appsrc, "push-buffer", buf, &ret);
gst_buffer_unref(buf);
if (ret != GST_FLOW_OK)
{
g_print("gst flow is not ok !\n");
ok = FALSE;
}
return ok;
}
return TRUE;
}
static void start_feed(GstElement *appsrc, guint size, gpointer data)
{
//g_print("start_feed\n");
guint ret = g_idle_add((GSourceFunc)cb_need_data, appsrc);
}
gint main(gint argc, gchar* argv[])
{
.....
g_signal_connect (appsrc, "need-data", G_CALLBACK (start_feed), NULL);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
g_main_loop_run (loop);gg
.....
}