GStreamer插件实列rockchipmpp
尽管这些年arm发展取得了不少的进步,不过对于音视频的编解码仍然心有余力不足,好在芯片厂家在SOC里面提供了硬件加速能力。善于发挥出芯片的能力,才能打造出完美的应用.今天我们一起来探索一下rk3568上的为我们提供的多媒体加速能力-MPP,然后一起分析一下rk的gstreamer插件。
MPP
概述
- 视频解码
- 视频编码
- 视频处理
系统架构
- 硬件层 Hardware
- 内核驱动层 Kernel driver
- 操作系统层
- 应用层
MPI
rk gstreamer 插件
rockchipmpp是rk公司开发的一个在gstreamer插件,主要把自己的MPP和GStreamer,结合起来,我们在使用是可以直接把相关代码放到gstreamer源码中编译即可。
如下为它的源码
├── gstmppallocator.c
├── gstmppallocator.h
├── gstmppalphadecodebin.c
├── gstmppalphadecodebin.h
├── gstmpp.c
├── gstmppdec.c
├── gstmppdec.h
├── gstmppenc.c
├── gstmppenc.h
├── gstmpp.h
├── gstmpph264enc.c
├── gstmpph264enc.h
├── gstmpph265enc.c
├── gstmpph265enc.h
├── gstmppjpegdec.c
├── gstmppjpegdec.h
├── gstmppjpegenc.c
├── gstmppjpegenc.h
├── gstmppvideodec.c
├── gstmppvideodec.h
├── gstmppvp8enc.c
├── gstmppvp8enc.h
├── gstmppvpxalphadecodebin.c
├── gstmppvpxalphadecodebin.h
gstmpp.c为统一的入口文件,在它里面注册其他插件,gstmppjpegdec.c为jpeg的解码文件,我们能以他们为例子分析一下这个rockchip的mpp插件
gstreamer rkmpp 插件定义
如下为rkmpp的定义
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,GST_VERSION_MINOR,rkmpp,"Rockchip Mpp Video Plugin",plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
这个功能相当于面向对象语言的模板功能,由于C语言不支持模板功能,需要使用宏定义,来模拟模板功能,下面我们一起展开一下;
#ifdef __cplusplus
#define G_BEGIN_DECLS extern "C" {
#define G_END_DECLS }
#else
#define G_BEGIN_DECLS
#define G_END_DECLS
#endif#if (0 || defined(_MSC_VER)) && !defined(GST_STATIC_COMPILATION)
# define GST_PLUGIN_EXPORT __declspec(dllexport)
# ifdef GST_EXPORTS
# define GST_EXPORT __declspec(dllexport)
# else
# define GST_EXPORT __declspec(dllimport) extern
# endif
#else
# if defined(__GNUC__) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))
# define GST_PLUGIN_EXPORT __attribute__ ((visibility ("default")))
# define GST_EXPORT extern __attribute__ ((visibility ("default")))
# else
# define GST_PLUGIN_EXPORT
# define GST_EXPORT extern
# endif
#endif
#define G_PASTE_ARGS(identifier1,identifier2) identifier1 ## identifier2
#define G_PASTE(identifier1,identifier2) G_PASTE_ARGS (identifier1, identifier2)#define GST_PLUGIN_DEFINE(major,minor,name,description,init,version,license,package,origin) \
G_BEGIN_DECLS \
GST_PLUGIN_EXPORT const GstPluginDesc * G_PASTE(gst_plugin_, G_PASTE(name, _get_desc)) (void); \
GST_PLUGIN_EXPORT void G_PASTE(gst_plugin_, G_PASTE(name, _register)) (void); \
\
static const GstPluginDesc gst_plugin_desc = { \major, \minor, \G_STRINGIFY(name), \(gchar *) description, \init, \version, \license, \PACKAGE, \package, \origin, \__GST_PACKAGE_RELEASE_DATETIME, \GST_PADDING_INIT \
}; \
\
const GstPluginDesc * \
G_PASTE(gst_plugin_, G_PASTE(name, _get_desc)) (void) \
{ \return &gst_plugin_desc; \
} \
\
void \
G_PASTE(gst_plugin_, G_PASTE(name, _register)) (void) \
{ \gst_plugin_register_static (major, minor, G_STRINGIFY(name), \description, init, version, license, \PACKAGE, package, origin); \
} \
G_END_DECLS
这个宏定义主要生成gst_plugin_desc结构和gst_plugin_rkmpp_get_desc,gst_plugin_rkmpp_register,来的分析,把部分宏找出来直接用gcc命令生产:
gcc -E -P gst-define.c > gst-define_m.c
大致代码如下
__attribute__ ((visibility ("default"))) const GstPluginDesc * gst_plugin_rkmpp_get_desc (void);__attribute__ ((visibility ("default"))) void gst_plugin_rkmpp_register (void); static const GstPluginDesc gst_plugin_desc = { GST_VERSION_MAJOR, GST_VERSION_MINOR, G_STRINGIFY(rkmpp), (gchar *) "Rockchip Mpp Video Plugin", plugin_init, VERSION, GST_LICENSE, PACKAGE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN, __GST_PACKAGE_RELEASE_DATETIME, GST_PADDING_INIT };const GstPluginDesc * gst_plugin_rkmpp_get_desc (void) { return &gst_plugin_desc; } void gst_plugin_rkmpp_register (void) { gst_plugin_register_static (GST_VERSION_MAJOR, GST_VERSION_MINOR, G_STRINGIFY(rkmpp), "Rockchip Mpp Video Plugin", plugin_init, VERSION, GST_LICENSE, PACKAGE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);}
插件初始化
我们在编写一个GStreamer应用_专注&突破的博客-CSDN博客开始的时候说过编写gstreamer应用首先使用gst_init
初始化
前奏
void
gst_init (int *argc, char **argv[])
{GError *err = NULL;if (!gst_init_check (argc, argv, &err)) {g_print ("Could not initialize GStreamer: %s\n",err ? err->message : "unknown error occurred");if (err) {g_error_free (err);}exit (1);}
}
它的主要功能,
- 初始化GStreamer库
- 注册内部element
- 加载插件列表,扫描列表中及相应路径下的插件
- 解析并执行命令行参数
我们下面简单跟踪它的代码,重点看看怎么一步步加载插件的
gst_init
主要调用gst_init_check,这个函数如下所示
gboolean
gst_init_check (int *argc, char **argv[], GError ** err)
{static GMutex init_lock;
#ifndef GST_DISABLE_OPTION_PARSINGGOptionGroup *group;GOptionContext *ctx;
#endifgboolean res;g_mutex_lock (&init_lock);if (gst_initialized) {GST_DEBUG ("already initialized gst");g_mutex_unlock (&init_lock);return TRUE;}
#ifndef GST_DISABLE_OPTION_PARSINGctx = g_option_context_new ("- GStreamer initialization");g_option_context_set_ignore_unknown_options (ctx, TRUE);g_option_context_set_help_enabled (ctx, FALSE);group = gst_init_get_option_group ();g_option_context_add_group (ctx, group);res = g_option_context_parse (ctx, argc, argv, err);g_option_context_free (ctx);
#elseinit_pre (NULL, NULL, NULL, NULL);init_post (NULL, NULL, NULL, NULL);res = TRUE;
#endifgst_initialized = res;g_mutex_unlock (&init_lock);return res;
}
这个函数主要是先看看有没有初始化,没有的话,进行初始化。在初始化的时候也可以使用GOption来指定参数,之前已经提过,GOption数组来定义你的命令行选项将表与由gst_init_get_option_group函数返回的选项组一同传给GLib初始化函数。通过使用GOption表来初始化GSreamer,你的程序还可以解析除标准GStreamer选项以外的命令行选项。
这里重点是
group->pre_parse_func = pre_parse_func; init_pregroup->post_parse_func = post_parse_func; ///init_post
主要的工作是在init_post中完成,这里不准备详细介绍,着重说几点:
- 插件的加载并不是普通的动态库加载那样,而是形成一个plugin registry,这个registry主要记载插件的详细信息,在使用的时候方便调用
- 插件的加载使用父子进程方式,父进程收集和记录信息,子进程执行加载过程
GStreamer插件实列rockchipmpp相关推荐
- 使用Python打造基本WEB漏洞扫描器(二) 爬虫插件系统的开发—E-Mail收集插件实列
一.实验介绍 1.1 实验内容 基于上节的爬虫,在爬虫的基础上增加一个插件系统,通过爬虫爬取网页链接后调用这个插件系统中的插件进行各种操作,本节也会写个简单的email收集插件作为列子,后面也会讲到如 ...
- gst-crypto GStreamer插件
gst-crypto GStreamer插件 内容 • 1. gst-crypto概述 o 1.1gst-crypto GStreamer插件功能 o 1.2用例范例 • 2. GStreamer插件 ...
- Fragment的运用实列
运用ListFragment view: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android ...
- 输出等边三角形php,php打印三角星星方法实列
php打印三角星星方法实列 php打印三角形,直角三角形.倒直角三角形.等腰三角形的代码.逻辑都是外层循环控制行数,内层循环控制空格或星号的个数. 一.php输出直角三角形<?php for($ ...
- php实现身份证号码获取归属地地址的实列教程,含完整全国地区归属数据!
本篇文章主要讲解实现,php通过读取身份证地理位置编码进行匹配归属地的功能实例. 日期:2021-7-10 作者:任聪聪 实列文件截图: 说明:我将数据切分成了两种类型,依据自己的习惯进行导入数据库即 ...
- BGP——AS—PATH正则表达式(实列讲解+配置)
目录 一.(表1 )关于AS_PATH访问列表的正则表达式元字符特殊字符 二.字符组合路由含义: 三.实列理解: 四.应用: (1)应用--过滤: (2)应用--选路: 使用 正则表达式目的:匹配BG ...
- 旋度的散度为零证明_(大牛分享)实列讲解:Python Sympy计算梯度、散度和旋度...
今天为大家带来的内容是:(大牛分享)实列讲解:Python Sympy计算梯度.散度和旋度 sympy有个vector 模块,里面提供了求解标量场.向量场的梯度.散度.旋度等计算,官方参考连接: ht ...
- 【综合评价分析】熵权算法确定权重 原理+完整MATLAB代码+详细注释+操作实列
[综合评价分析]熵权算法确定权重 原理+完整MATLAB代码+详细注释+操作实列 文章目录 1. 熵权法确定指标权重 (1)构造评价矩阵 Ymn (2)评价矩阵标准化处理 (3)计算指标信息熵值 Mj ...
- 【综合评价分析】topsis评价 原理+完整MATLAB代码+详细注释+操作实列
[综合评价分析]topsis评价 原理+完整MATLAB代码+详细注释+操作实列 文章目录 1.TOPSIS法的原理 2.TOPSIS法案例分析 3.建立模型并求解 3.1数据预处理 3.2代码实现数 ...
最新文章
- 0627 - 不能再靠功能取胜
- 能力素质有所欠缺_孩子说话啰嗦没重点?家长学会“大脑整理术”,提高孩子表达能力...
- 数据特殊显示``````
- PyQt5显示一个空白的窗口
- 安装Fontawesome4字体图标
- CF1137F Matches Are Not a Child‘s Play(树上数据结构问题、树链剖分+ODT)
- 电源管理 解析_智能电源控制箱
- 信息学奥赛一本通(1039:判断数正负)
- Android App优化之提升你的App启动速度之实例挑战
- 远程下层文档 正在打印_长宁打印机随叫随到,送货上门
- Fixcel电子表格——报表模块(一)
- 图片底侧空白缝隙解决方案(HTML、CSS)
- llvm+clang 添加 LTO(Link Time Optimization) 支持
- python解压并另存 .bz2文件的方法
- javaMail学习二 电子邮件的工作原理
- Qt编写可视化大屏电子看板系统17-柱状堆积图
- nu.xom:Document
- [4G5G专题-78]:流程 - 4G LTE 核心网的Attach流程
- 什么样的代码是好代码_什么使好代码3 7
- 有没有英语语音测试软件,推荐我用过的几款真正可以找外国人练口语的软件app...
热门文章
- 关于PhotoShop中保存CMYK格式TIFF文件在GDI+错误地显示颜色的问题解决方法
- python中if not x_python使用 'if x is not None' 还是'if not x is None' – IT热血青年
- 后缀自动机1003 HDU 4416
- 自动化(四)appium真机远程控制和远程群控
- C语言中的scanf
- K_A18_001 基于STM32等单片机采集MQ2传感参数串口与OLED0.96双显示
- Win7有多条隧道适配器(isatap、teredo、6to4)的原因及关闭方法(转)
- SpringCloud分布式框架
- python反爬虫原理与绕过实战pdf-antispider
- 传统“寒热”病的背后 王溢嘉