尽管这些年arm发展取得了不少的进步,不过对于音视频的编解码仍然心有余力不足,好在芯片厂家在SOC里面提供了硬件加速能力。善于发挥出芯片的能力,才能打造出完美的应用.今天我们一起来探索一下rk3568上的为我们提供的多媒体加速能力-MPP,然后一起分析一下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插件
如下为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);
- }