Nvidia Jetson 开发套件,视频解码的相关源码解读:videoSource.h、videoSource.cpp

57 篇文章 59 订阅
32 篇文章 5 订阅

为了解 Nvidia Jetson 视频解码过程,搜索了其中的代码,发现解码器是类 videoSource 的衍生类。于是决定先看看 videoSource 是如何定义的

搜了一下, 发现 videoSource.hvideoSource.cpp 位于目录 /home/jetson/jetson-inference/utils/video

1. videoSource 的定义

我们先来看看 videoSource.h 的内容。

class videoSource
{
public:
	static videoSource* Create( const videoOptions& options );
	static videoSource* Create( const char* URI, const videoOptions& options=videoOptions() );
	static videoSource* Create( const char* URI, const commandLine& cmdLine );
	static videoSource* Create( const char* URI, const int argc, char** argv );
	static videoSource* Create( const int argc, char** argv, int positionArg=-1 );
	static videoSource* Create( const commandLine& cmdLine, int positionArg=-1 );
	virtual ~videoSource();
	static inline const char* Usage() 		{ return VIDEO_SOURCE_USAGE_STRING; }
	template<typename T> bool Capture( T** image, uint64_t timeout=UINT64_MAX )		{ return Capture((void**)image, imageFormatFromType<T>(), timeout); }
	virtual bool Capture( void** image, imageFormat format, uint64_t timeout=UINT64_MAX ) = 0;
	virtual bool Open();
	virtual void Close();
	inline bool IsStreaming() const	   			{ return mStreaming; }
	inline uint32_t GetWidth() const				{ return mOptions.width; }
	inline uint32_t GetHeight() const				{ return mOptions.height; }
	inline uint32_t GetFrameRate() const			{ return mOptions.frameRate; }
	inline const URI& GetResource() const			{ return mOptions.resource; }
	inline const videoOptions& GetOptions() const	{ return mOptions; }
	virtual inline uint32_t GetType() const			{ return 0; }
	inline bool IsType( uint32_t type ) const		{ return (type == GetType()); }
	template<typename T> bool IsType() const		{ return IsType(T::Type); }
	inline const char* TypeToStr() const			{ return TypeToStr(GetType()); }
	static const char* TypeToStr( uint32_t type );
protected:
	videoSource( const videoOptions& options );
	bool         mStreaming;
	videoOptions mOptions;
};

videoSource 是一个抽象类,因为方法 bool Capture (…) = 0 是抽象方法,需要衍生类自己实现。下面分析一下这个抽象类的主要内容:

2. Create 函数

创建 videoSource 的实例。因为 videoSource 是抽象类,所以其实现方法必须借助衍生类。我看了一下 Create 的代码,发现很流氓呀,竟然引用了 "gstCamera.h、gstDecoder.h 等模块。不过这样一来,也给我们带来很多方便,毕竟 camera、decoder 等代码不需要我们动手鼓捣了。

3. Capture

Open、Close 我就不浪费时间解释了,这里看看 Capture 的功能。一共声明了两个 Capture 函数。第一个竟然是利用模板定义的,定义如下:

template<typename T> bool Capture( T** image, uint64_t timeout=UINT64_MAX )
{ 
	return Capture((void**)image, imageFormatFromType<T>(), timeout); 
}

原来它直接调用了虚函数 Capture,这个虚函数需要在衍生类中具体实现。翻译了一下源代码的注释:

此模板化版本的Capture()支持的图像格式包括:

  • uchar3(IMAGE_RGB8
  • uchar4(IMAGE_RGBA8
  • float3(IMAGE_RGB32F
  • float4(IMAGE_RGBA32F

图像格式将自动从这些类型中推导出来。如果使用其他类型 使用此重载,将断言静态编译时错误。

  • @param[out] image 输出指针,将设置为包含图像的内存。
    如果此接口的videoOptions:zeroCopy标志设置为true,则内存在映射的CPU/GPU内存中分配,可以从CPU和CUDA访问。否则,只能从CUDA访问。
  • @param[in]timeout 等待捕获图像然后返回的超时(毫秒)。 “UINT64_ MAX”的超时值(默认值)将永远等待,如果帧没有立即就绪,将立即返回0的超时值。
  • @如果捕获了帧,则返回 true,如果发生错误或超时,则返回 false。

【特别说明】
重要的事情说三遍,上面的一条说明,再重复一遍:

如果此接口的videoOptions:zeroCopy标志设置为true,则内存在映射的CPU/GPU内存中分配,可以从CPU和CUDA访问。否则,只能从CUDA访问。

这里说的接口,就是抽象类 videoSource,因为 C++ 抽象类就是其他编程语言里的接口。这个说明给出了视频解码存放位置,只有两种情况:一种是CPU/GPU共享内存,另一种是GPU内存。在 Jetson 中,videoSource 不会把视频帧保存到 CPU 的独享内存。

读到这里,我想应该明白如何利用 Jetson 来进行视频流解码了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许野平

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值