作為virtual camera程序卤唉,gstreamer部分需要向directshow部分提供媒體數(shù)據(jù)和媒體類型信息逃默,所以我們需要兩類接口:
- 作為媒體信息接口
作為媒體信息接口臂拓,我們需要提供足夠的信息,以方便directshow用戶創(chuàng)建source的output pin,信息包含的內(nèi)容如下,可參考 使用Gstreamer 作為數(shù)據(jù)源輸出視頻數(shù)據(jù) II 媒體類型信息:
video/x-raw,width=1280,height=720泌枪,format=YUY2,framerate=(fraction)30/1
我們自定義一個結(jié)構(gòu)體秕岛,VcamMediaInfo, 將包含以上信息碌燕,并使用c語言的類型作為屬性類型,方便directshow程序集成:
struct _VcamMediaInfo {
char* type;
long width;
long height;
long framerate;
};
void vcam_source_get_mediatype(VcamSource* self, VcamMediaInfo* info);
_VcamMediaInfo 包含了所有的媒體類型信息继薛, vcam_source_get_mediatype用來返回當(dāng)前source支持的媒體類型修壕,這個接口比較簡單,僅支持返回一個具體媒體類型和格式信息遏考。
- 數(shù)據(jù)接口
數(shù)據(jù)接口主要用于在directshow filter 在fillbuffer的時候獲取數(shù)據(jù)慈鸠,GstSample 封裝的東西比較多,它包含了數(shù)據(jù)灌具,類型青团,時間以及其它任意數(shù)據(jù);對我們來說咖楣,我們現(xiàn)在之關(guān)系數(shù)據(jù)督笆,所以我們將GstMemory作為返回的數(shù)據(jù)容器:
void vcam_source_get_mediatype(VcamSource* self, VcamMediaInfo* info);
void vcam_source_pull_sample(VcamSource* self, GstSample* sample);
void vcam_source_pull_preroll(VcamSource* self, GstSample* sample);
void vcam_source_pull_sample2(VcamSource* self, GstMemory* mem); //返回gstMemory
void vcam_source_pull_preroll2(VcamSource* self, GstMemory* mem); //返回gstMemory
為了能夠被c++程序調(diào)用,我們需要通過extern c 來開發(fā)source的頭文件诱贿,最終得到得頭文件如下:
#ifndef VCAM_SOURCE_H
#define VCAM_SOURCE_H
#ifdef __cplusplus
extern "C" {
#endif
#include <gst/gst.h> //包含gst 頭文件娃肿,方便調(diào)用gstmemory及方法
#define VCAM_TYPE_SOURCE (vcam_source_get_type())
G_DECLARE_DERIVABLE_TYPE(VcamSource, vcam_source, VCAM, SOURCE, GObject)
typedef struct _VcamSourcePrivate VcamSourcePrivate;
struct _VcamSourceClass {
GObjectClass parent_class;
gshort(*start)(VcamSource* self);
};
typedef struct _VcamMediaInfo VcamMediaInfo;
struct _VcamMediaInfo {
char* type;
long width;
long height;
long framerate;
};
gshort vcam_source_start(VcamSource* self);
void vcam_source_get_mediatype(VcamSource* self, VcamMediaInfo* info);
void vcam_source_pull_sample(VcamSource* self, GstSample* sample);
void vcam_source_pull_preroll(VcamSource* self, GstSample* sample);
void vcam_source_pull_sample2(VcamSource* self, GstMemory* mem);
void vcam_source_pull_preroll2(VcamSource* self, GstMemory* mem);
#ifdef __cplusplus
}
#endif
#endif /* __VCAM_SOURCE_H__ */