gstreamer插件开发-What are states?

这篇具有很好参考价值的文章主要介绍了gstreamer插件开发-What are states?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

What are states?

状态描述元素实例是否初始化、是否准备好传输数据以及当前是否正在处理数据。在GStreamer中定义了四种状态:

  • GST_STATE_NULL
  • GST_STATE_READY
  • GST_STATE_PAUSED
  • GST_STATE_PLAYING
    从现在开始,它们将被简单地称为“NULL”、“READY”、“PAUSED”和“PLAYING”。

GST_STATE_NULL 是元素的默认状态。在这种状态下,它没有分配任何运行时资源,没有加载任何运行时库,显然它不能处理数据。

GST_STATE_READY 是元素可以进入的下一个状态。在READY状态下,元素分配了所有默认资源(运行时库、运行时内存)。然而,它还没有分配或定义任何特定于流的东西。当从NULL到READY状态(GST_STATE_CHANGE_NULL_TO_READY)时,元素应该分配任何非流特定的资源,并且应该加载运行时可加载的库(如果有的话)。当进行相反的操作时(从READY到NULL, GST_STATE_CHANGE_READY_TO_NULL),元素应该卸载这些库并释放所有已分配的资源。这种资源的例子是硬件设备。请注意,文件通常是流,因此这些文件应被视为特定于流的资源;因此,不应该在这种状态下分配它们。

GST_STATE_PAUSED 是元素准备接受和处理数据的状态。对于大多数元素,这种状态与PLAYING相同。此规则的唯一例外是接收元素。Sink元素只接受一个数据缓冲区,然后阻塞。在这一点上,管道是“预卷”,并准备立即呈现数据。

GST_STATE_PLAYING 是元素可以处于的最高状态。对于大多数元素来说,这种状态与暂停状态完全相同,它们接受并处理带有数据的事件和缓冲区。只有sink元素需要区分暂停状态和播放状态。在播放状态下,接收器元素实际渲染传入数据,例如输出音频到声卡或渲染视频图像到图像接收器。

Managing filter state

如果可能的话,您的元素应该从一个新的基类(预制基类)派生。对于不同类型的源、汇和过滤器/转换元素,有现成的通用基类。除此之外,音频和视频元素以及其他元素还存在专门的基类。

如果使用基类,则很少需要自己处理状态更改。您所要做的就是重写基类的start()和stop()虚函数(可能根据基类的不同而被不同地调用),基类将为您处理所有事情。

但是,如果您不是从现成的基类派生,而是从GstElement或其他不是构建在基类之上的类派生,那么您很可能必须实现自己的状态更改函数,以便收到状态更改的通知。如果你的插件是一个demuxer或demuxer,这是绝对必要的,因为还没有针对muxers或demuxers的基类。

可以通过虚函数指针通知元素状态更改。在这个函数中,元素可以初始化元素所需的任何类型的特定数据,并且它可以选择从一种状态切换到另一种状态。

对于未处理的状态更改不要g_assert;这是由GstElement基类处理的。

static GstStateChangeReturn
gst_my_filter_change_state (GstElement *element, GstStateChange transition);

static void
gst_my_filter_class_init (GstMyFilterClass *klass)
{
  GstElementClass *element_class = GST_ELEMENT_CLASS (klass);

  element_class->change_state = gst_my_filter_change_state;
}



static GstStateChangeReturn
gst_my_filter_change_state (GstElement *element, GstStateChange transition)
{
  GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
  GstMyFilter *filter = GST_MY_FILTER (element);

  switch (transition) {
	case GST_STATE_CHANGE_NULL_TO_READY:
	  if (!gst_my_filter_allocate_memory (filter))
		return GST_STATE_CHANGE_FAILURE;
	  break;
	default:
	  break;
  }

  ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
  if (ret == GST_STATE_CHANGE_FAILURE)
	return ret;

  switch (transition) {
	case GST_STATE_CHANGE_READY_TO_NULL:
	  gst_my_filter_free_memory (filter);
	  break;
	default:
	  break;
  }

  return ret;
}

请注意,向上(NULL=>READY, READY=>PAUSED, PAUSED=>PLAYING)和向下(PLAYING=>PAUSED, PAUSED=>READY, READY=>NULL)状态变化是在两个单独的块中处理的,向下的状态变化只有在我们链接到父类的状态变化函数之后才能处理。为了安全地处理多线程的并发访问,这是必要的。

这样做的原因是,在向下状态变化的情况下,你不想破坏分配的资源,而你的插件的链函数(例如)仍然在另一个线程中访问这些资源。你的链式函数是否在运行取决于插件的垫的状态,而这些垫的状态与元素的状态密切相关。Pad状态在GstElement类的状态更改函数中处理,包括适当的锁定,这就是为什么在销毁分配的资源之前必须链接起来的原因。文章来源地址https://www.toymoban.com/news/detail-760283.html

到了这里,关于gstreamer插件开发-What are states?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [GStreamer] (1) GStreamer-plugin 基础

    GStreamer 插件基础 创建 高级 元素类型 创建 高级特殊元素类型 介绍 - 在本指南中,您将学习如何应用基本的 GStreamer 编程概念来编写一个简单的插件。 编写插件的基础流程 构建样板 通过下载模板参考,重写、添加相应的函数 $ cd ~/gst-template/gst-plugin/src $ …/tools/make_element My

    2024年02月02日
    浏览(31)
  • 【GStreamer 】3-2 gstreamer实现USB相机采集图片和录像

            感觉网上看这一类说明,常常最大的疑惑就是,为什么别人能用,我自己就不成了,其实很多时候都是各自的环境交代不清楚所致。所以我觉得讲操作前,必须先交代自己的测试环境。         我自己使用的是TX1核心模块,安装ubuntu 18.04 的环境。安装了英伟达

    2024年02月09日
    浏览(34)
  • opencv+gstreamer拉流

    opencv的VideoCapture函数支持以Gstreamer pipeline的方法对RTSP数据进行解码,VideoWriter函数支持以Gstreamer pipeline的方式进行RTSP推流。 为了实现上述的功能, opencv在编译时需要打开WITH_GSTREAMER选项 ,具体编译过程,需要后续进行测试,然后描述相应的过程。 opencv中可以通过调用getBu

    2024年02月04日
    浏览(37)
  • 二、什么是GStreamer

    GStreamer是一个用于创建流媒体应用程序的框架。基本的设计来自俄勒冈研究生院的视频管道,还有一些来自DirectShow的想法。 GStreamer的开发框架使编写任何类型的流媒体应用程序成为可能。GStreamer框架旨在使编写处理音频或视频或两者同时处理的应用程序变得容易。它不局限

    2024年02月14日
    浏览(33)
  • Gstreamer基础讲解

    背景 ​ 从历史的角度来看,Linux在多媒体方面已经远远落后于其他的操作系统。Microsoft’s Windows 和Apple’s MacOS它们对多媒体设备、多媒体创作、播放和实时处理等方面已经有了很好的支持。另一方面,Linux对多媒体应用的综合贡献比较少,这也使得Linux很难在专业级别的软件

    2024年02月03日
    浏览(28)
  • rk3588使用gstreamer推流

    在https://launchpad.net/上搜索软件名+ppa 找到需要的包后下面命令安装 如果不需要了下面命令删除 查看支持的编码器 不支持rkmpp的硬编码 下面安装插件gstreamer1.0-rockchip 这时已经支持硬件编码了 播放本地视频mp4 查找设备 播放视频画面 rk3588 硬件编码mpph264enc,使用gstreamer udp 传输

    2024年02月16日
    浏览(63)
  • GStreamer for Ethernet AVB

    https://iamkate.com/code/binary-file-viewer/ apt-get install manpages-posix-dev 1 AVB MPEG2-TS 1.1 MPEG2-TS cip_with_sph_payload: 32-byte AVTP header + 4-byte Timestamp + 4-byte MPEG2TS header + 184-byte payload 32 bytes hdr, IEEE 1722-2016 spec 00 uint32_t subtype_data; 04 uint64_t stream_id; 12 uint32_t avtp_time; 16 uint32_t format_specific; 20 uint32_t

    2024年02月02日
    浏览(40)
  • ubuntu安装GStreamer1.0

    Gstreamer是一个支持Windows,Linux,Android,iOS的跨平台的多媒体框架,应用程序可以通过管道(Pipeline)的方式,将多媒体处理的各个步骤串联起来,达到预期的效果。每个步骤通过元素(Element)基于GObject对象系统通过插件(plugins)的方式实现,方便了各项功能的扩展。 GStre

    2024年02月02日
    浏览(27)
  • opencv带GStreamer之Windows编译

    下载地址如下: gstreamer-1.0-msvc-x86_64-1.18.2.msi gstreamer-1.0-devel-msvc-x86_64-1.18.2.msi 安装目录无要求,主要是安装完设置环境变量 xxx1.0msvc_x86_64bin xxx1.0msvc_x86_64lib xxx1.0msvc_x86_64libgstreamer-1.0 xxx为安装目录 cmake_gui配置如下: 点击configure,GStreamer:显示YES即为配置成功,如下图

    2024年02月13日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包