使用Gstreamer 作为数据源输出视频数据 IV Sourc

2021-11-17  本文已影响0人  Charles_linzc

作为virtual camera程序,gstreamer部分需要向directshow部分提供媒体数据和媒体类型信息,所以我们需要两类接口:

  1. 作为媒体信息接口
    作为媒体信息接口,我们需要提供足够的信息,以方便directshow用户创建source的output pin,信息包含的内容如下,可参考 使用Gstreamer 作为数据源输出视频数据 II 媒体类型信息:
    video/x-raw,width=1280,height=720,format=YUY2,framerate=(fraction)30/1
    我们自定义一个结构体,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用来返回当前source支持的媒体类型,这个接口比较简单,仅支持返回一个具体媒体类型和格式信息。

  1. 数据接口
    数据接口主要用于在directshow filter 在fillbuffer的时候获取数据,GstSample 封装的东西比较多,它包含了数据,类型,时间以及其它任意数据;对我们来说,我们现在之关系数据,所以我们将GstMemory作为返回的数据容器:
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++程序调用,我们需要通过extern c 来开发source的头文件,最终得到得头文件如下:

#ifndef VCAM_SOURCE_H
#define VCAM_SOURCE_H

#ifdef __cplusplus             
extern "C" {
#endif
#include <gst/gst.h>  //包含gst 头文件,方便调用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__ */
上一篇下一篇

猜你喜欢

热点阅读