gstreamer中GList的使用

简单实例

定义一个decoderbuffer_list

GList* buffer_list;

在使用这个buffer_list的时候,没有g_list_alloc分配内存,直接通过g_list_append把数据appendlist里面就可以:

if (!dec->buffer_list) {
   dec->buffer_list = g_list_alloc();
}

g_list_append将一个新元素加入到链表尾,函数返回list的新起点,这个起点可能已经改变。如下,返回值又赋值给了dec->buffer_list:

dec->buffer_list = g_list_append(dec->buffer_list, frame);

在gstreamer中比较多见的对list的遍历:

g_mutex_lock (&priv->mutex);
for (l = msdk_resp->surfaces_avail; l; l = l->next) {
    surface = l->data;

    if (!surface->Data.Locked) {
        msdk_resp->surfaces_avail =
            g_list_remove (msdk_resp->surfaces_avail, surface);
        msdk_resp->surfaces_used =
            g_list_prepend (msdk_resp->surfaces_used, surface);
        break;
    }
}
g_mutex_unlock (&priv->mutex);

GList的整体概念

GList结构及其相关函数提供了一个标准的双链接列表数据结构。

GListGLib中的双向链表,其每个元素都包含一块数据和指向前后元素的指针。存储的数据类型是gpointer,在GLib中,gpointer指向实际数据的指针。

要增加元素,可以使用g_list_append(), g_list_prepend(), g_list_insert()g_list_insert_sorted()

要删除元素,使用g_list_remove()

要查找列表中的元素,使用g_list_first(), g_list_last(), g_list_next(), g_list_previous(), g_list_nth(), g_list_nth_data(), g_list_find()g_list_find_custom()

要找到一个元素的索引,使用g_list_position()g_list_index()

要为列表中的每个元素调用一个函数,使用g_list_foreach()

要释放整个列表,使用g_list_free()

GList的原型定义:

/usr/include/glib-2.0/glib/glist.h

typedef struct _GList GList;

struct _GList
{
  gpointer data;
  GList *next;
  GList *prev;
};

GList提供的函数:

// 将一个新元素加入到链表尾
GList *g_list_append(GList *list, gpointer data);

// 将一个新元素加入到链表头
GList *g_list_prepend(GList *list, gpointer data);

// 插入一个新元素到链表的指定位置
GList *g_list_insert(GList *list, gpointer data, gint position);

// 从链表中移除一个具有值data的元素,如果元素不存在,则链表不变
GList *g_list_remove(GList *list, gpointer data);

// 数释放由GList使用的所有存储区
GList *g_list_free(GList *list);

// 从GList中移除一个元素,但不释放该元素。
// 被删除的元素的上一个和下一个链接被设置为NULL,这样它就成为一个有一个元素的独立的列表。
GList *g_list_remove_link(GList *list, GList *link);

// 链表元素位置反转
GList *g_list_reverse(GList *list);

// 获取指定位置元素
GList *g_list_nth(GList *list, gint n);

// 在链表中查找一个含有指定值的元素,没有则返回NULL
GList *g_list_find(GList *list, gpointer data);

// 获取链表中最后一个元素
GList *g_list_last(GList *list);

// 获取链表中第一个元素
GList *g_list_first(GList *list);

// 返回链表元素个数
gint g_list_length(GList *list);

// 遍历链表
void g_list_foreach(GList *list, GFunc func, gpointer data);

// 返回指定元素在链表中的位置,没有找到匹配的元素,则返回-1,元素位置从0开始计算
gint g_list_index(GList *list, gconstpointer data);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GStreamer 是一个开源的多媒体框架,可以在 Java 使用。以下是在 Java 使用 GStreamer 的步骤: 1. 安装 GStreamer 在安装 GStreamer 之前,需要先安装以下依赖库: - libgstreamer-plugins-base1.0-dev - libgstreamer1.0-dev - libgstreamer-plugins-good1.0-dev - libgstreamer-plugins-bad1.0-dev 安装完依赖库后,可以通过以下命令安装 GStreamer: ``` sudo apt-get install gstreamer1.0-tools gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav ``` 2. 引入 GStreamer 的 Java 绑定库 GStreamer 的 Java 绑定库在 Maven 是可用的,可以在项目的 pom.xml 文件添加以下依赖项: ``` <dependency> <groupId>org.freedesktop.gstreamer</groupId> <artifactId>gstreamer-java</artifactId> <version>1.14.4</version> </dependency> ``` 3. 编写 GStreamer 的 Java 代码 以下是一个简单的 GStreamer Java 代码示例,它使用 GStreamer 播放一个视频: ``` import org.freedesktop.gstreamer.*; public class GStreamerExample { public static void main(String[] args) { Gst.init("VideoPlayer", args); Pipeline pipe = new Pipeline(); Element source = ElementFactory.make("filesrc", "source"); source.set("location", "/path/to/video.mp4"); Element decoder = ElementFactory.make("decodebin", "decoder"); Element convert = ElementFactory.make("videoconvert", "convert"); Element sink = ElementFactory.make("autovideosink", "sink"); pipe.addMany(source, decoder, convert, sink); Pipeline.linkMany(source, decoder); decoder.link(convert); convert.link(sink); pipe.play(); Gst.main(); } } ``` 以上代码使用 GStreamer 创建了一个管道(pipeline),其包含一个文件源(filesrc)、一个解码器(decodebin)、一个视频转换器(videoconvert)和一个视频输出端(autovideosink)。它将视频源(/path/to/video.mp4)连接到解码器,解码器连接到转换器,转换器连接到视频输出端。最后,它启动了管道并进入 GStreamer 的主循环。 以上就是在 Java 使用 GStreamer 的简单步骤和示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值