RKMEDIA--VENC/VDEC使用

news2024/10/7 14:32:41

前面两篇已经介绍了VI和VO的使用,本章节来介绍rkmedia且也是瑞芯微平台重点部分:编解码

目录

一、简介

二、编解码能力

三、编码

编码初始化:

在初始化VENC时需要注意几点:

venc编码帧率控制:

 编码添加osd位图:

四、解码

解码初始化:

五、编解码常见问题及调试

1、调试命令

2、编码常见问题

3、解码常见问题


一、简介

rkmedia编解码部分是对mpp接口进行封装提供给用户使用。

mpp是瑞芯微提供的媒体处理软件平台(Media Process Platform, 简称 MPP)是适用于瑞芯微芯片系列的通用媒体处理软件平台。只要是rk平台的的编解码都是用的mpp,区别在于编解码能力不同以及不同芯片支持的格式等不同。编解码都是硬件编解码,编解码资源是分开的。

MPP 提供的功能包括:
视频解码:
        H.265 / H.264 / H.263 / VP9 / VP8 / MPEG-4 / MPEG-2 / MPEG-1 / VC1 / MJPEG
视频编码:
        H.264 / VP8 / MJPEG

二、编解码能力

rv1126编解码能力如下:

 

rv1109编解码能力如下:

 以上编解码能力是总的编解码能力,如需多路编解码,可以自行换算。

三、编码

VENC 模块,即视频编码模块。此模块支持多路实时编码,且每路编码独立,编码协议和编码 profile 可以不同。支持视频编码同时,调度 Region 模块对编码图像内容进行叠加和遮挡。支持
H264/H265/MJPEG/JPEG编码,支持的码控类型为CBR和VBR。

编码初始化:

        以H264 CBR为例:

venc_chn_attr.stVencAttr.enType = RK_CODEC_TYPE_H264;
venc_chn_attr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;
venc_chn_attr.stRcAttr.stH264Cbr.u32Gop = 30;
venc_chn_attr.stRcAttr.stH264Cbr.u32BitRate = u32Width * u32Height;
// frame rate: in 30/1, out 30/1.
venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateDen = 1;
venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateNum = 30;
venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateDen = 1;
venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateNum = 30;

venc_chn_attr.stVencAttr.imageType = IMAGE_TYPE_NV12;
venc_chn_attr.stVencAttr.u32PicWidth = u32Width;
venc_chn_attr.stVencAttr.u32PicHeight = u32Height;
venc_chn_attr.stVencAttr.u32VirWidth = u32Width;
venc_chn_attr.stVencAttr.u32VirHeight = u32Height;
venc_chn_attr.stVencAttr.u32Profile = 77;
ret = RK_MPI_VENC_CreateChn(0, &venc_chn_attr);
if (ret) {
    printf("ERROR: create VENC[0] error! ret=%d\n", ret);
    return 0;
}

        设置jpeg/mjpeg编码时,可以设置zoom宽高,实际上是经过rga进行缩放后再送去编码:

  VENC_CHN_ATTR_S venc_chn_attr;
  memset(&venc_chn_attr, 0, sizeof(venc_chn_attr));
  venc_chn_attr.stVencAttr.enType = RK_CODEC_TYPE_JPEG;
  venc_chn_attr.stVencAttr.imageType = enPixFmt;
  venc_chn_attr.stVencAttr.u32PicWidth = u32SrcWidth;
  venc_chn_attr.stVencAttr.u32PicHeight = u32SrcHeight;
  venc_chn_attr.stVencAttr.u32VirWidth = u32SrcWidth;
  venc_chn_attr.stVencAttr.u32VirHeight = u32SrcHeight;

  /*********************************************************************/
  venc_chn_attr.stVencAttr.stAttrJpege.u32ZoomWidth = u32DstWidth;
  venc_chn_attr.stVencAttr.stAttrJpege.u32ZoomHeight = u32DstHeight;
  venc_chn_attr.stVencAttr.stAttrJpege.u32ZoomVirWidth = u32DstWidth;
  venc_chn_attr.stVencAttr.stAttrJpege.u32ZoomVirHeight = u32DstHeight;
  /*********************************************************************/

  venc_chn_attr.stVencAttr.enRotation = enRotation;
  venc_chn_attr.stVencAttr.stAttrJpege.bSupportDCF = RK_TRUE;
  venc_chn_attr.stVencAttr.stAttrJpege.stMPFCfg.u8LargeThumbNailNum = 2;
  venc_chn_attr.stVencAttr.stAttrJpege.stMPFCfg.astLargeThumbNailSize[0]
      .u32Width = 164;
  venc_chn_attr.stVencAttr.stAttrJpege.stMPFCfg.astLargeThumbNailSize[0]
      .u32Height = 128;
  venc_chn_attr.stVencAttr.stAttrJpege.stMPFCfg.astLargeThumbNailSize[1]
      .u32Width = 128;
  venc_chn_attr.stVencAttr.stAttrJpege.stMPFCfg.astLargeThumbNailSize[1]
      .u32Height = 164;
  ret = RK_MPI_VENC_CreateChn(0, &venc_chn_attr);
  if (ret) {
    printf("Create Venc failed! ret=%d\n", ret);
    return -1;
  }

在初始化VENC时需要注意几点:

        1、编码是没有缩放功能的,输入的分辨率要和配置的分辨率一样,否则执行过程会报错。如需要动态切换分分辨率,需要disable venc、解绑、重新配置vi分辨率、重新配置venc分辨率、绑定。

        2、帧率控制参数是比例关系。比如默认配置的是1 30 1 30,实际比例是1:1。所以代表输入多少帧率就编码多少帧率。很多人会错误的认为是实际帧率的关系,觉得帧率控制有问题。

        3、编码h26x视频编码协议都是基于YUV420的,所以如果是yuv422输入编码出来的数据会有色彩偏差,这一点一般用hdmi作为输入的时候容易遇到。因为mpp内部会把输入的非yuv420格式(yuv422、argb8888)转换成yuv420,造成色彩丢失。

        4、编码jpeg时会多样一些,因为是图像。图像和视频还是有区别的。

venc编码帧率控制:

默认情况下编码的qp值已经设置成

qpMin:8, qpMax:48, qpMinI:8, qpMaxI:48

如果对码率控制的比较严格的情况下需要自行修改qp值,至于qp值具体配置成什么,那要根据自己的实际情况自己慢慢去调整。

RK_MPI_VENC_GetRcParam(0,&stRcParam);
printf("pstRcParam->s32FirstFrameStartQp=%d\n",stRcParam.s32FirstFrameStartQp);
stRcParam.stParamH264.u32StepQp = 4;
stRcParam.stParamH264.u32MaxQp = 50;
stRcParam.stParamH264.u32MinQp = 23;
stRcParam.stParamH264.u32MaxIQp = 48;
stRcParam.stParamH264.u32MinIQp = 18;
RK_MPI_VENC_SetRcParam(0, &stRcParam);

 对于编码高级参数在rkmedia的手册中描述的不多,这边截取海思手册中的描述,总体使用都差不多。

在学习/使用编码高级参数还是需要多多去动手,多修改对应参数将保存的编码数据对比,这样才可以深入了解各个参数设置的意思。

 

 

 

 编码添加osd位图:

rkmedia的venc中添加位图,使用的是RK_MPI_VENC_RGN_SetBitMap 接口去实现。位图只支持ARGB8888的格式,且最多支持8个区域优先级从REGION_ID_0~REGION_ID_7递增。

#define TEST_ARGB32_YELLOW 	0xFFFFFF00
#define TEST_ARGB32_RED 	0xFFFF0000
#define TEST_ARGB32_GREEN 	0xFF00FF00
#define TEST_ARGB32_BLUE 	0xFF0000FF
#define TEST_ARGB32_TRANS 	0x00000000
#define TEST_ARGB32_WHITE 	0xF0FFFFFF

static void set_argb8888_buffer(RK_U32 *buf, RK_U32 size, RK_U32 color) {
  for (RK_U32 i = 0; buf && (i < size); i++)
    *(buf + i) = color;
}
  

RK_MPI_VENC_RGN_Init(0, NULL);

BITMAP_S BitMap;
BitMap.enPixelFormat = PIXEL_FORMAT_ARGB_8888;
BitMap.u32Width = 160;
BitMap.u32Height = 160;
BitMap.pData = malloc(BitMap.u32Width * 4 * BitMap.u32Height);
RK_U8 *ColorData = (RK_U8 *)BitMap.pData;
RK_U16 ColorBlockSize = BitMap.u32Height * BitMap.u32Width;
set_argb8888_buffer((RK_U32 *)ColorData, ColorBlockSize / 4,
                      TEST_ARGB32_WHITE);
set_argb8888_buffer((RK_U32 *)(ColorData + ColorBlockSize),
                      ColorBlockSize / 4, TEST_ARGB32_TRANS);
set_argb8888_buffer((RK_U32 *)(ColorData + 2 * ColorBlockSize),
                      ColorBlockSize / 4, TEST_ARGB32_RED);
set_argb8888_buffer((RK_U32 *)(ColorData + 3 * ColorBlockSize),
                      ColorBlockSize / 4, TEST_ARGB32_BLUE);

// Case 1: Canvas and bitmap are equal in size
OSD_REGION_INFO_S RngInfo;
RngInfo.enRegionId = REGION_ID_0;
RngInfo.u32PosX = 160;
RngInfo.u32PosY = 160;
RngInfo.u32Width = 160;
RngInfo.u32Height = 160;
RngInfo.u8Enable = 1;
RngInfo.u8Inverse = 0;
RK_MPI_VENC_RGN_SetBitMap(0, &RngInfo, &BitMap);

 注意点:

        1、编码的位图只支持256色,所以如果是叠加彩色图片会出现色彩有偏差的问题,可以换成RGA的位图叠加函数去实现。

        2、每次更新数据的时候,需要重新调用RK_MPI_VENC_RGN_SetBitMap接口去刷一遍数据

        3、想要显示文字osd,还是需要把文字的类型转成argb的数据,送进去显示。给个链接可以参考:海思3516a实现OSD叠加水印_烫手的热山药的博客-CSDN博客

四、解码

VDEC 模块,即视频解码模块。此模块支持多路实时解码,且每路解码独立,支持
H264/H265/MJPEG/JPEG解码。


解码初始化:

VDEC_CHN_ATTR_S stVdecAttr;
memset(&stVdecAttr, 0, sizeof(stVdecAttr));
stVdecAttr.enCodecType = enCodecType;
stVdecAttr.enMode = VIDEO_MODE_FRAME;

if (stVdecAttr.enCodecType == RK_CODEC_TYPE_MJPEG) 
  stVdecAttr.enMode = VIDEO_MODE_FRAME;
else 
  stVdecAttr.enMode = VIDEO_MODE_STREAM;
stVdecAttr.enDecodecMode = VIDEO_DECODEC_HADRWARE;

ret = RK_MPI_VDEC_CreateChn(0, &stVdecAttr);
if (ret) 
{
  printf("Create Vdec[0] failed! ret=%d\n", ret);
  return -1;
}

解码的初始化比较简单。解码的方式分为两种:帧模式流模式

帧模式需要在送数据前已经分好帧,流模式则是在内部分帧

注意:

        1、jpeg和mjpeg解码只支持帧模式,没有流模式。

        2、在解码中送数据的时间延时要自己控制,送的太快或者太慢都会导致解码器报错。

        3、解码时需要收到第一个I帧才会解码

五、编解码常见问题及调试

1、调试命令

编码:

查看编码信息cat /proc/mpp_service/session_summary
查看硬件编解码时间echo 0x100 > /sys/module/rk_vcodec/parameters/mpp_dev_debug

查看h26x编码频率

cat /sys/kernel/debug/clk/clk_summary | grep enc
查看mjpeg编码频率cat /sys/kernel/debug/clk/clk_summary | grep vepu
设置26x编码频率echo 600000000 > /proc/mpp_service/rkvenc/clk_core(594000000是最高频率)

解码:

查看jpeg解码频率cat /sys/kernel/debug/clk/clk_summary | grep jpeg

2、编码常见问题

1、jpeg的旋转不支持缩放旋转,只能单独旋转

2、jpeg编码不支持rgb格式,支持argb格式

3、不管是输入格式是i还是p  编码出来的都是p(P代表逐行扫描,i代表隔行扫描)

4、编码帧率达不到预期

原因:可能达到编码能力的瓶颈。

解决:以下步骤挨个测试

(1)抬高编码频率

(2)DDR定频 修改 rkbin/RKBOOT/RV1126MINIALL.ini 所有924改成1056

(3)cpu定频 

        echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
        echo 1512000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed

(4)提高cpu优先级

        io -4 0xfe830008 0x202

 (5)关闭温控

        echo user_space > /sys/class/thermal/thermal_zone0/policy
        echo 0 > /sys/class/thermal/thermal_zone0/cdev0/cur_state

        echo 0 > /sys/class/thermal/thermal_zone0/cdev0/cur_state

3、解码常见问题

1、在获取vdec的yuv数据时,将获取的数据直接写入到文件中,打开后会出现一部分绿色的情况

   解决:主要是写文件的方式有问题

int width,height,h_stride,v_stride;
RK_U8 *base_y;
RK_U8 *base_c;  
while (!quit) {
    mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VDEC, 0, 500);
    if (!mb) {
      printf("RK_MPI_SYS_GetMediaBuffer get null buffer in 500ms...\n");
      return NULL;
    }
    
    sprintf(picname, "/userdata/rv1126_dec_%d", ccount++);
    vdec_file_save = fopen(picname, "w");
    
    base_y = RK_MPI_MB_GetPtr(mb);
    base_c = RK_MPI_MB_GetPtr(mb) + h_stride * v_stride;
    for (i = 0; i < height; i++, base_y += h_stride)
    {
        fwrite(base_y, 1, width, vdec_file_save);
    }
    for (i = 0; i < height / 2; i++, base_c += h_stride)
    {
        fwrite(base_c, 1, width, vdec_file_save);
    }

    fclose(vdec_file_save);
    memset(picname, 0 ,64);
    RK_MPI_MB_ReleaseBuffer(mb);
  }

2、在使用vdec解码jpeg时,会导致缓存逐渐增大。

解决:需要配置 /proc/mpp_service/vdpu/session_buffers 这个值,默认是40,可以将其改小

3、解码时出现

[ 669.352997] mpp_rkvdec2 fdf80200.rkvdec: resetting...

[ 669.353460] mpp_rkvdec2 fdf80200.rkvdec: reset done 打印

原因:mpp吧数据丢给硬件解码后设定了一个200ms的等待时间,如果超时硬件认为有异常,所以复位了。

解决:增加延时时间( kernel/drivers/video/rockchip/mpp)

暂时关于VENC/VENC部分写这么多,有新的建议后续加上来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/51956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件设计师考试重点1 计算机组成与体系结构

软件设计师考试重点1 计算机组成与体系结构一、 数据的表示1. 进制转换2. 原码/反码/补码/移码3. 数值表示范围4. 浮点数的运算二、运算器与控制器1. 计算机结构2. 计算机五大组成部分&#xff1a;3. CPU组成部分&#xff1a;4. 控制器组成部分&#xff1a;5. 运算器组成部分&a…

如何构建一个自动化油田注水站监控系统?

一、应用背景 目前&#xff0c;在大部分的钻井平台中&#xff0c;维护油田注水站的工作状态主要通过人工方式进行&#xff0c;这种方式不仅作业效率低且对工人的经验有着较高要求。此外&#xff0c;油田注水站的工作环境恶劣&#xff0c;为了能够有效地掌握各个设备的工作状态…

【测试沉思录】20. 如何做好测试需求分析?

作者&#xff1a;刘亚茹 编辑&#xff1a;毕小烦 我们都知道测试用例是软件测试中保障质量的必要手段&#xff0c;而测试需求作为用例编写的主要依据却往往被很多人忽视。到底什么是测试需求&#xff1f;又如何做好测试需求分析呢&#xff1f;本文带你了解一下。 1. 测试需求到…

Java项目如何导出数据为 PDF 文件?

文章目录Java项目如何导出数据为 PDF 文件&#xff1f;一、代码结构如下二、代码说明1、添加依赖 pom.xml3、添加字体4、PDF 导出工具类三、效果图结语Java项目如何导出数据为 PDF 文件&#xff1f; 一个小需求&#xff0c;需要将页面上的数据导出为PDF&#xff0c;正常情况下…

11月业务安全月报 | 台湾2300万人信息泄露;黑客两分钟即可破解安卓锁屏;乌克兰“IT军团”入侵俄罗斯中央银行

导语&#xff1a;随着数字化的深入普及&#xff0c;业务愈加开放互联。企业的关键数据、用户信息、基础设施、运营过程等均处于边界模糊且日益开放的环境中&#xff0c;涉及利益流和高附加值的业务面临多样的安全隐患&#xff0c;随时可能遭遇损失&#xff0c;进而影响企业运营…

Android 8.0网络DNS

1 Linux DNS规范 Linux上并没有一个单独的方法可以完成DNS查询工作&#xff1b;没有一个有这样的明确接口的核心系统调用system call。不过&#xff0c;glibc (nss)的getaddrinfo (3), gethostbyname (3)等相关API (RFC3493)提供了DNS查询功能。 1&#xff09;不支持nscd&#…

关于使用STM32CubeMx配置串口出现的一些问题

一、使用CubeMX配置好串口中断的工程&#xff0c;打开工程添加相关代码后串口没有数据输出或者看不见数据但串口助手的RX会一直增加的问题。 参考&#xff1a;这里 大概意思就是时钟的原因&#xff0c;需要把stm32f4xx_hal_conf.h文件中的时钟改一下&#xff0c;将25MHz改为8…

Ansys Zemax | 使用 OpticStudio 进行闪光激光雷达系统建模(中)

在消费类电子产品领域&#xff0c;工程师可利用激光雷达实现众多功能&#xff0c;如面部识别和3D映射等。尽管激光雷达系统的应用非常广泛而且截然不同&#xff0c;但是 “闪光激光雷达” 解决方案通常都适用于在使用固态光学元件的目标场景中生成可检测的点阵列。凭借具有针对…

我要涨知识——TypeScript 经典高频面试题(二)

又是一个年底来了&#xff0c;好大一批人可能又准备跑路了&#xff0c;翻了翻掘金和 CSDN 发现好多大佬都有大厂 Offer &#xff0c;看着看着我心动了&#xff01; 话不多说&#xff0c;赶紧开干&#xff0c;给自己整了一个前端面试小助手——微信小程序内搜索 “WEB学习学习加…

jar启动指定JDK/JRE 安装路径教程

前言 因为疫情在家办公的缘故&#xff0c;有个老项目&#xff0c;需要改个接口&#xff0c;然后需要前端联调&#xff0c;因为外网服务器没有多余的空间了&#xff0c;想着把jar给前端让前端开发人员&#xff0c;在自己的本机启动后端服务&#xff0c;进行接口联调&#xff0c;…

streptavidin-PEG-6-FAM 链霉亲和素-聚乙二醇-6-羧甲基荧光素

产品名称&#xff1a;链霉亲和素-聚乙二醇-6-羧甲基荧光素 英文名称&#xff1a;streptavidin-PEG-6-FAM 纯度&#xff1a;95% 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观:固体或粘性液体&#xff0c;取决于分子量 PEG分子量可选&#xff1a;350、550、75…

虚拟内存系统【如何支持巨大的虚拟地址空间】

如何支持巨大的虚拟地址空间&#x1f4d6;1. 为什么要支持巨大的虚拟地址空间&#x1f4d6;2. 交换空间&#x1f4d6;3. 存在位&#x1f4d6;4. 页错误&#x1f4d6;5. 为了处理页错误&#xff0c;操作系统大致做了什么&#xff1f;&#x1f4d6;6. 页面换出&#x1f4d6;7. 当…

IDEA 中使用 SparkSQL 远程连接 Hive

文章目录第一步&#xff0c;环境配置第二步&#xff0c;IDEA 配置第三步&#xff0c;授权第四步&#xff0c;连接测试扩展——华为云/阿里云集群报错第一步&#xff0c;环境配置 首先&#xff0c;你要确保你的集群可以正常运行。 我们在 Windows 电脑中安装 Hadoop&#xff0…

【新知实验室--音视频通话】腾讯云TRTC-实时音视频---多人会议视频通话SDK基础搭建

&#x1f996;我是Sam9029&#xff0c;一个前端 Sam9029的CSDN博客主页:Sam9029的博客_CSDN博客-JS学习,CSS学习,Vue-2领域博主 &#x1f431;‍&#x1f409;&#x1f431;‍&#x1f409;恭喜你&#xff0c;若此文你认为写的不错&#xff0c;不要吝啬你的赞扬&#xff0c;求收…

基于STM32单片机的篮球计时记分器proteus仿真原理图PCB

功能&#xff1a; 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示比赛剩余时间&#xff0c;球队分数 2.默认计时器为4节&#xff0c;每节10分钟&#xff0c;每节比赛结束&#xff0c;蜂鸣器报警 3.按键功能介绍: 1’键——加1分 4’键——减1分 2’键——加2分 5’键—…

基于java+springmvc+mybatis+vue+mysql的水果食品果蔬生鲜商城销售系统

项目介绍 网络购物作为一种全新的销售方式赢得了越来越多销售者的青睐&#xff0c;近年来销售额更是以连年翻番的惊人速度成倍增长&#xff0c;网络购物已经形成了自身特有的网络销售市场和全新的网络营销模式&#xff0c;也使网络营销渠道应运而生&#xff0c;同时&#xff0…

SRM供应商平台哪些好用?

SRM系统是管理供应商的系统&#xff0c;旨在与供应商建立高效的协同关系&#xff0c;是一种围绕采购业务的双赢管理模式。 但市面上SRM系统供应商层出不穷&#xff0c;很多企业在数字化转型中不知如何挑选合适自己企业的SRM系统&#xff0c;或是选错了系统&#xff0c;效率提升…

成功的项目管理工具拥有的五大功能

如果您决定投资一种新的项目管理工具&#xff0c;那么您需要确保购买的是最适合自己的。在为您的企业寻找最佳项目管理软件时&#xff0c;不要被所有的花里胡哨分心&#xff0c;因为某些东西看起来很漂亮并不意味着它有实质。不要错过对团队成功至关重要的关键功能&#xff0c;…

【论文精读7】MVSNet系列论文详解-PVA-MVSNet

PVA-MVSNet论文名为&#xff1a;Pyramid Multi-view Stereo Net with Self-adaptive View Aggregation&#xff0c;主要是用了一个自适应的聚合模块来在构建代价体时不用均匀的方差、而是让不同的特征体具有一定的选择注意力权重来对最终的代价体做贡献&#xff0c;同时对于多尺…

星起航跨境:跨境卖家可以这样获得好评,稳步提升销量

据调查数据显示&#xff0c;90%以上的消费者购物之前会先查看产品评论&#xff0c;好的评价能促进产品更快地转化&#xff0c;不好的评价还会对产品listing权重产生一定的影响。例如&#xff1a;在产品listing的评价较少的情况下&#xff0c;一个1星差评在listing展示超过3天之…