1 GstTask基本概念

  • GstTask是由GstElement和GstPad用于提供在GstPipeline中进行数据传递的线程的工具。

  • 通常情况下,GstPad会启动一个GstTask来将数据推送到到对等GstPad中,或者从对等GstPad中获取数据。大多数source元素会启动一个GstTask来推送push数据。在某些情况下,分离器demuxer元素可以启动一个GstTask来从对等元素中拉取数据。这通常在分离器demuxer可以对上游对等元素执行随机访问以提高性能时执行。

  • 尽管GstPad上存在用于启动start/暂停pause/停止stop任务tasks的便捷函数,但如果与GstPad无关,有时可能需要手动创建GstTask。

  • 在GstTask可以运行之前,它需要一个可以使用gst_task_set_lock设置的GRecMutex。

  • 可以使用gst_task_start、gst_task_pause和gst_task_stop或gst_task_set_state函数启动、暂停和停止任务。GstTask将重复调用GstTaskFunction,并提供在使用gst_task_new创建任务时提供的用户数据。在调用函数时,它将获取提供的锁。提供的锁在任务暂停或停止时释放。

  • 使用gst_task_stop停止任务不会立即确保任务不再运行。使用gst_task_join确保任务完全停止并且线程已停止。

  • 创建GstTask后,请使用gst_object_unref释放其资源。这只能在任务不再运行时执行。

  • 任务函数可以发送GstMessage以发送带外out-of-band数据给应用程序。应用程序可以在其主循环中从GstBus接收消息。

alt text

2 GstTask类型结构与运行分析

alt text

3 GstTask对象相关函数

/**
 * @param func: 任务线程池中要执行的任务函数 (只要任务运行,func函数会被一直循环执行)
 * @param user_data: 传递给 @func 的用户数据
 * @param notify: 当@user_data不再需要的时候被自动调用函数
 * @brief: 1. 创建一个新的任务,该任务将重复调用提供的 @func,并将 @user_data 作为参数。通常任务会在一个新线程中运行。
 *         2. 任务创建后无法更改函数。要更改函数,必须创建一个新的 #GstTask。
 *         3. 该函数只会创建任务,任务线程并没有开始执行,需要使用 gst_task_start() 开始执行任务,gst_task_pause() 任务暂停(暂停不等于停止)
 *         4. 在任务执行之前,必须使用 gst_task_set_lock() 函数配置一个 #GRecMutex。该锁将在调用 @func 时使用。
*/
GstTask *
gst_task_new (GstTaskFunction func, gpointer user_data, GDestroyNotify notify);


/**
 * @param task: 要使用的 #GstTask
 * @param mutex: 要使用的 #GRecMutex
 * @brief: 设置任务使用的互斥锁。在调用 #GstTaskFunction 之前将使用该互斥锁。
 * @note: 在调用 gst_task_start() 之前必须调用此函数。
 * 
 * MT safe
*/
void
gst_task_set_lock (GstTask * task, GRecMutex * mutex);

/**
 * @brief: 任务开始执行
*/
gboolean
gst_task_start (GstTask * task);


/**
 * @brief: 任务被暂停。因为任务一直被循环去调用,使用该函数后,循环调用任务执行会被暂停。
*/
gboolean
gst_task_pause (GstTask * task);

/**
 * @brief: 任务被恢复循环调用
*/
gboolean
gst_task_resume (GstTask * task)


/**
 * @brief: 任务被停止,退出了循环调用任务函数,也就是退出了 gst_task_func 函数
*/
gboolean
gst_task_stop (GstTask * task);

/**
 * @brief: 1. 停止任务运行,也就是退出了 gst_task_func 函数
 *         2. 如果任务正在执行,会等待任务 GstTaskFunction 执行完毕后才退出。
 * @return: TRUE 表示成功任务成功退出。
*/
gboolean
gst_task_join (GstTask * task);