上一节谈到QMediaPlayer构造函数如何使用到插件中的类,先回顾一下QMediaPlayer构造函数
我们现在已经知道d -> service指向插件中的一个QMediaService派生类的实例,所以我们开始分析插件的源代码。
首先我们找到插件的root component(cpp文件中包含Q_EXPORT_PLUGIN2的那个类)
可以看出这个插件实现了两个接口,其中QMediaServiceProviderPlugin是提供视频播放服务的接口。它的成员函数create返回一个QMediaService指针,就是QMediaService构造函数d->service的candidate(至于为什么是candidate,是因为源代码还要对这个指针进行一些验证和处理)。下面是create()的源码:
(gst_init是GStreamer库的初始化函数,它会对 GStreamer 库做一些必要的初始化工作)
这些宏都是不同服务的id,create根据参数的不同返回不同的QMediaService指针。例如我们需要id为Q_MEDIASERVICE_MEDIAPLAYER的实例,create即创建一个QGstreamerPlayerService实例,并返回其指针。
考察QGstreamerPlayerService类,requestControl的源码:
QMediaPlayerControl_iid是我们需要的控制类的id,返回值m_control指向一个新分配的QGstreamerPlayerControl实例,于是d->control指向的对象终于明朗了。要想知道如果控制视频的播放,我们只需要分析QGstreamerPlayerControl类的代码。