Toybrick

中文 / EN
Toybrick Wiki教程 TB-96AI Debian 10用户指南
Debian 10用户指南

用户登录

用户名:toybrick

 密码  : toybrick

软件升级

  1. sudo apt updatesudo apt upgrade

系统软件库

DRM内存分配

1. 安装DRM内存库

  1. sudo apt install rockchip-drm-dev libdrm-dev

2. 编译链接:

  1. LDDFLAGS := -lrockchip_drm

3. 包含头文件:

  1. #include <rockchip/rockchip_drm.h>

4. 示例代码:

  1. /usr/share/rockchip_drm/example

5. 重要数据结构

  1. tpyedef struct _DrmBuffer {int fd;  // DRM/CMA内存的文件描述符unsigned int handle; // DRM/CMA内存的句柄void *ptr; // DRM/CMA内存映射到用户空间的虚拟地址size_t size; // DRM/CMA内存的大小,单位:字节unsigned long phys; // DRM/CMA内存的物理地址} DrmBuffer, CmaBuffer;

6. DRM接口说明: 详见/usr/include/rockchip/rockchip_drm.h

1) RockchipDrmOpen: 打开设备节点

    示例:

  1. int fd = RockchipDrmOpen();

2) RockchipDrmClose: 关闭设备节点

    示例:

  1. RockchipDrmClose(fd);

    注:必须释放所有fd分配的内存后,才能关闭设备节点

3) RockchipDrmAlloc:分配DRM内存,物理地址不连续

    示例:

  1. DrmBuffer *buf = RockchipDrmAlloc(fd, V4L2_PIX_FMT_NV12, 1920, 1080);

4) RockchipDrmFree:释放DRM内存

    示例:

  1. RockchipDrmFree(buf);

5) RockchipCmaAlloc:分配CMA内存,物理地址连续

    示例:

  1. CmaBuffer *buf = RockchipCmaAlloc(fd, size);

6) RockchipCmaFree:释放CMA内存

    示例:

  1. RockchipCmaFree(buf);

RGA 2D图形加速

1. 安装RGA 2D图形加速库

  1. sudo apt install rockchip-rga-dev

2. 编译链接:

  1. LDDFLAGS := -lrockchip_rga

3. 包含头文件:

  1. #include <rockchip/rockchip_rga.h>

4. 示例代码:

  1. /usr/share/rockchip_rga/example

5. 重要数据结构:

  1. tpyedef struct _RgaBuffer {int fd;  // RGA内存的文件描述符unsigned int handle; // RGA内存的句柄void *ptr; // RGA内存映射到用户空间的虚拟地址size_t size; // RGA内存的大小,单位:字节unsigned long phys; // RGA内存的物理地址};

6. RGA接口说明:详见/usr/include/rockchip/rockchip_rga.h

1) RgaCreate:创建RGA实例,返回RGA结构指针

    示例:

  1. RockchipRga *rga = RgaCreate();

2) RgaDestory:销毁RGA实例

    示例:

  1. RgaDestroy(rga);

3) initCtx:清空RGA上下文

    示例:

  1. rga->ops->initCtx(rga);

注:如果不清空上下文,下次执行RGA操作时会沿用之前设置图像参数。

4) setRotate设置选择旋转角度

    示例:

  1. rga->ops->setRotate(rga, rotate);

    rotate参数说明:

   a) RGA_ROTATE_NONE:不旋转

   b) RGA_ROTATE_90:逆时针旋转90度

   c) RGA_ROTATE_180:逆时针旋转180度

   d) RGA_ROTATE_270:逆时针旋转270度

   e) RGA_ROTATE_VFLIP:垂直镜像

   f) RGA_ROTATE_HFLIP:水平镜像

5) setFillColor:设置色彩填充

    示例:

  1. rga->ops->setFillColor(rga, color);

    color参数说明:

    a) 蓝色:0xffff0000

    b) 绿色:0xff00ff00

    c) 红色:0xff0000ff

6) setSrcCrops/setDstCrop:设置源/目的剪切窗口

    示例:

  1. rga->ops->setSrcCrop(rga, cropX, cropY, cropW, cropH);rga->ops->setSrcCrop(rga, cropX, cropY, cropW, cropH);

    参数说明:

    a) cropX:原点横坐标

    b) cropY:原点纵坐标

    c) cropW:窗口宽度

    d) cropH:窗口高度

7) setSrcFormat/setDstFormat:设置源/目的图像格式

    示例:

  1. rga->ops->setSrcFormat(rga, v4l2Format, width, height);rga->ops->setDstFormat(rga, v4l2Format, width, height);

   参数说明:

   a) V4l2Format:v4l2图像格式,支持的格式见:/usr/include/rockchip/rockchip_rga.h

   b) Width:图像宽度

   c) Height:图像高度

8) setSrcBufferFd/setDstBufferFd:设置图像Buffer的文件描述符

    示例:

  1. int fd = RockchipDrmOpen();DrmBuffer *buf = RockchipDrmAlloc(fd, V4L2_PIX_FMT_NV12, 1920, 1080);rga->ops->setSrcBufferFd(rga, buf->fd);

9) setSrcBufferPtr/setDstBufferPtr:设置图像Buffer的内存指针

    示例:

  1. Void *buf = malloc(size);rga->ops->setSrcBufferPtr(rga, buf);

10) setSrcBufferPhys/setDstBufferPhys:设置图像Buffer的物理地址

      示例:

  1. int fd = RockchipDrmOpen();CmaBuffer *buf = RockchipCmaAlloc(fd, size);rga->ops->setSrcBufferPhys(rga, buf->phys);

      注:分配的内存必须是物理连续的内存

11) 执行图像处理操作

      示例:

  1. rga->ops->go(rga);

MPP视频编解码

1. 安装MPP视频编解码库

  1. sudo apt install rockchip-mpp-dev

2. 编译链接:

  1. LDDFLAGS := -lrockchip_mpp

3. 包含头文件:

  1. #include <rockchip/rockchip_mpp.h>

4. 示例代码:

  1. /usr/share/rockchip_mpp/example

5. 重要数据结构:

1)

  1. typedef struct _DecFrame {MppFrame mppFrame; // 内部使用__u32 v4l2Format; // 解码后的图像格式,目前只支持V4L2_PIX_FMT_NV12__u32 width; // 解码的图像宽度__u32 height; // 解码的图像高度__u32 coded_width; // 解码图像的实际宽度(16字节对齐)__u32 coded_height; // 解码图像的实际高度(16字节对齐)int fd; // 解码图像内存的文件描述符void *data; // 解码图像内存映射到用户空间的虚拟地址size_t size; // 解码图像的大小,单位:字节MppBufferGroup frameGroup; // 内部使用MppBuffer frameBuf; // 内部使用} DecFrame;

2) 

  1. typedef strcut _EncPacket{MppPacket mppPacket; // 内部使用int fd; // 编码图像内存的文件描述符void *data; // 编码图像内存映射到用户空间的虚拟地址size_t size; // 编码图像的大小,单位:字节int is_intra; // 内部使用} EncPacket;

3) 

  1. typedef struct _EncCtx {__u32 v4l2Format; // 待编码图像格式__u32 width; // 待编码图像宽度__u32 height; // 待编码图像高度size_t size; // 待编码图像大小,单位:字节int fps; // 编码帧速int bps; // 编码码率int gop; // 关键帧间隔EncodeRcMode mode; // RC mode, 支持CBR和VBREncodeQuality quality; // 编码图像质量Union {int profile; // 画质,只对H264编码有效int quant; // 量化指标,只对MJPEG编码有效,};};

6. MPP接口说明:详见/usr/include/rockchip/rockchip_mpp.h

1) MppDecoderCreate:创建MPP解码器实例,成功返回MPP结构指针

    示例:

  1. MppDecoder *dec = MppDecoderCreate(DECODE_TYPE_H264);

2) MppDecoderDestroy:销毁MPP实例

    示例:

  1. MppDecoderDestroy(dec);

3) enqueue:解码图像入队操作

    示例:

  1. dec->ops->enqueue(dec, data, size);

   参数说明:

   a) data:存放H264图像数据的BUFFER指针

   b) size:图像大小

4) dequeue:解码图像出队操作,阻塞直到mpp成功解码后函数返回

    示例:

  1. DecFrame *frame = dec->ops->dequeue(dec);

5) dequeue_timeout: 解码图像出队操作,阻塞直到mpp成功解码或超时后函数返回

    示例:

  1. DecFrame *frame = dec->ops->dequeuer_timeout(dec, 0); // 直接返回不阻塞DecFrame *frame = dec->ops->dequeuer_timeout(dec, -1); // 阻塞直到成功DecFrame *frame = dec->ops->dequeuer_timeout(dec, 100); // 超时时间100ms

6) decode:解码图像,相当于enqueue + dequeue操作

    示例:

  1. DecFrame *frame = dec->ops->decode(dec, data, size);

7) freeFrame:释放编码图像内存

    示例:

  1. dec->ops->freeFrame(frame);

8) MppEncoderCreate:创建MPP编码器实例,成功返回MPP结构指针

    示例:

  1. EncCtx ctx;ctx.v4l2format = V4L2_PIX_FMT_NV12;ctx.width = 1920;ctx.heigh = 1080;ctx.size = 1920 * 1080 * 3 / 2;ctx.fps = 25;ctx.gop = 25;ctx.bps = 1920 * 1080 /16 * ctx.fps;ctx.mode = ENCODE_RC_MODE_CBR;ctx.quality = ENCODE_QUALITY_BEST;ctx.profile = ENCODE_PROFILE_HIGH;MppEncoder *enc = MppEncoderCreate(ctx, ENCODE_TYPE_H264);

9) MppEncoderDestroy:销毁MPP实例

    示例:

  1. MppEncoderDestroy(enc);

10) importBufferFd: 导入外部内存的文件描述符

    示例:

  1. int fd = RockchipDrmOpen();DrmBuffer *buf1= RockchipDrmAlloc(fd, V4L2_PIX_FMT_NV12, 1920, 1080);DrmBuffer *buf2 = RockchipDrmAlloc(fd, V4L2_PIX_FMT_NV12, 1920, 1080);enc->ops->importBufferFd(enc, buf1->fd, 0); // 0号内存enc->ops->importBufferFd(enc, buf1->fd, 1); // 1号内存

11) enqueue:待编码图像入队操作

   示例:

  1. memcpy(buf1->ptr, data, buf1->size); //将待编码图像拷贝到buf1enc->ops->enqueuer(enc, 0); // 告诉MPP,编码图像保存在0号内存

12) getExtraData: 获取sps/pps等编码头部信息

   示例:

  1. EncPacket *packet = enc->ops->getExtraData(enc);

13) dequeue:编码图像出队操作

   示例:

  1. EncPacket *packet = enc->ops->dequeuer(enc);

14) freePacket:释放编码图像内存

   示例:

  1. enc->ops->freePacket(packet);

RTSP客户端

1. 安装RTSP客户端库

  1. sudo apt install rockchip-rtsp-dev

2. 编译链接:

  1. LDDFLAGS := -lrockchip_rtsp

3. 包含头文件:

  1. #include <rockchip/rockchip_rtsp.h>

4. 示例代码:

  1. /usr/share/rockchip_rtsp/example

5. Rtspclient接口说明:详见/usr/include/rockchip/rockchip_rtsp.h

1) 构造函数:

    定义:

  1. RtspClient(std::string url, std::string username = "", std::string password = "", bool useTCP=false);

    示例:

  1. Rtsplcient client(“rtsp://192.168.180.8”, “username”, “password”);

   参数说明:

Url:IPC摄像头的RTSP网络地址

Username:IPC摄像头的用户名,默认为空

Password:IPC摄像头的密码,默认为空

useTCP:传输协议释放是TCP,默认为UDP

2) 设置回调函数:

   定义:

  1. setDataCallback(FRtspCallBack callBack);

3) 开始获取RTSP流:

   示例:

  1. client.enable();

4) 停止获取RTSP流:

   示例:

client.disable();

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


返回顶部