RK3568 应用层 libhwjpeg.so 硬件编解码的使用

2023-11-08

        libhwjpeg是RK封装的一个对MJPEG数据进行硬件编解码的so,用起来还是比较方便,相比软编效率也有提升。应用层没有提供接口,所以需要自己封装JNI接口。在SDK/hardware/rockchip/libhwjpeg/test 下有提供硬件编解码的demo,直接照搬过来用即可。以下是我封装的JNI接口
        硬解 

extern "C"
JNIEXPORT jbyteArray JNICALL
Java_com_wirelessmedia_eserver_remotecamera_camerafusion_HwjpegUtil_decodeFrame(JNIEnv *env,jobject thiz,jbyteArray data,jint size) {      
        MpiJpegDecoder *pDecoder = new MpiJpegDecoder();//创建解码器
        /*准备参数,这里RK默认输出的是NV12的数据,询问过RK,对于YUV420 目前输出也只支持
           NV12,如果需要其他格式的可以通过librga进行转换   
        */
        bool ret =pDecoder->prepareDecoder();

        if(!ret) return nullptr;
        
        jbyte *src_data= env->GetByteArrayElements(data, 0); //应用层传递的jpeg buf
        MpiJpegDecoder::OutputFrame_t frameOut; 
        memset(&frameOut, 0, sizeof(MpiJpegDecoder::OutputFrame_t));
        ret = pDecoder->decodePacket((char *)src_data, size, &frameOut);//解码 size为jpeg的buf长度
        if(!ret) return nullptr;
        LOGD("width = %d,height = %d",frameOut.DisplayWidth,frameOut.DisplayHeight);
        /*
            frameOut.MemVirAddr 为解码后的 char*数组 test demo中有介绍
        */
        int len = frameOut.DisplayWidth*frameOut.DisplayHeight*3/2;
        jbyteArray jbyteArray = env->NewByteArray(len);//申明数组,与char字符长度一致
        env->SetByteArrayRegion(jbyteArray, 0, len, (jbyte *) frameOut.MemVirAddr);
        pDecoder->deinitOutputFrame(&frameOut);
        return jbyteArray ;
}
  

        硬编
        

extern "C"
JNIEXPORT jbyteArray JNICALL
Java_com_wirelessmedia_eserver_remotecamera_camerafusion_HwjpegUtil_encodeFrame(JNIEnv *env,jobject thiz,jbyteArray data,jint width,jint height) {  
    MpiJpegEncoder *pEncoder = new MpiJpegEncoder(); //创建编码器
    bool ret = pEncoder->prepareEncoder(); //准备编码器
    if(!ret){
        LOGD("prepareEncoder fail");
        return nullptr;
    }
    //设置参数  这里的输入格式是比较多可以选
    /*
            typedef enum {
        INPUT_FMT_YUV420SP     = MPP_FMT_YUV420SP,
        INPUT_FMT_YUV420P      = MPP_FMT_YUV420P,
        INPUT_FMT_YUV422SP_VU  = MPP_FMT_YUV422SP_VU,
        INPUT_FMT_YUV422_YUYV  = MPP_FMT_YUV422_YUYV,
        INPUT_FMT_YUV422_UYVY  = MPP_FMT_YUV422_UYVY,
        INPUT_FMT_ARGB8888     = MPP_FMT_ARGB8888,
        INPUT_FMT_RGBA8888     = MPP_FMT_RGBA8888,
        INPUT_FMT_ABGR8888     = MPP_FMT_ABGR8888
    } InputFormat;
    */
    ret = pEncoder->updateEncodeCfg(width, height, MpiJpegEncoder::INPUT_FMT_YUV420SP);
    if(!ret){
        LOGD("updateEncodeCfgfail");
        return nullptr;
    }

    jbyte *src_data= env->GetByteArrayElements(data, 0);//传进来的yuv数据 
    MpiJpegEncoder::OutputPacket_t pktOut;
    memset(&pktOut, 0, sizeof(MpiJpegEncoder::OutputPacket_t));
    ret = pEncoder->encodeFrame((char *) src_data, &pktOut); //编码
    if(!ret){
        return nullptr;
    }
    //pktOut.size 是编码后的长度 pktOut.data 编码后的buf 数组
    jbyteArray jbyteArray = env->NewByteArray(pktOut.size);//申明数组,与char字符长度一致
    env->SetByteArrayRegion(jbyteArray, 0, pktOut.size, (jbyte *) pktOut.data);
    pEncoder->deinitOutputPacket(&pktOut);
    return jbyteArray; 
}  

因为整个项目有些涉及到的不仅仅是编码解码,还涉及到很多格式转换,多个摄像头数据的叠加,融合,拼接 缩放等等,如果有小伙伴刚好也是做类似功能,有什么疑问,或者有什么想法我们可以私信交流下~~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RK3568 应用层 libhwjpeg.so 硬件编解码的使用 的相关文章

  • C# 中的 memcpy 函数 [重复]

    这个问题在这里已经有答案了 可能的重复 C memcpy 等效项 https stackoverflow com questions 510971 c memcpy equivalent 相当于什么memcpyC 中的函数 正如已经说过的
  • 处理可选依赖项 (C#)

    我们有一个可以选择与 TFS 集成的应用程序 但是由于集成是可选的 所以我显然不希望所有机器都需要 TFS 程序集作为要求 我应该怎么办 我是否可以在主程序集中引用 TFS 库 并确保在使用 TFS 集成时仅引用 TFS 相关对象 或者 更
  • 如何为 IAsyncOperation 指定回调方法

    是否可以指定一个方法完成后调用async手术 平台 C Windows Phone 8 我需要实现非阻塞方法来异步发送UDP数据包 他们有我的方法 onWriteComplete int errorCode 操作完成时回调 这是我尝试过的
  • 访问 Android 崩溃报告

    当我使用 Sports Tracker 时 它崩溃了 当我按下 报告 按钮来报告崩溃时 我会看到一个简单的输入字段 要求对崩溃做出评论 但是 按 预览 将使我了解正在与崩溃日志一起发送的数据 数据量实际上是巨大的 包括日期 时间 设备名称
  • 如何重命名 MacOS/X 程序中的程序名称菜单标签?

    我有一个在 MacOS X 下运行的基于 Qt 的 GUI 程序 我希望能够更改该程序的第一个菜单标题的标签 即此屏幕截图中用红色圈出的标签 有没有一种编程方法可以做到这一点 假设不存在基于 Qt 的解决方案 则 Objective C 本
  • 为什么 VS 2008 在 Intellisense 中不显示 String 类的扩展方法

    由于 String 实现了IEnumerable
  • 编译器错误? g++ 允许可变大小的静态数组,除非函数是模板化的

    下面的代码演示了我无法解释的 gcc 4 6 2 的行为 第一个函数声明一个 vec t 类型的静态数组 其中 vec t 是 unsigned char 的 typedef 别名 第二个函数是相同的 只是 vect t 的类型是模板参数
  • C++ 中的结构填充

    如果我有一个struct在 C 中 有没有办法安全地将其读 写到跨平台 编译器兼容的文件中 因为如果我理解正确的话 每个编译器都会根据目标平台进行不同的 填充 不 那是不可能的 这是因为C 在二进制层面缺乏标准化 Don Box http
  • iText7 RegexBasedLocationExtractionStrategy 如何获取找到的文本的字体名和字体大小

    我尝试在 C 上使用 iText7 进行文本替换 我只能使用 RegexBasedLocationExtractionStrategy 获取搜索文本的内容和矩形 并且我想获取文本的字体和大小 有什么建议么 谢谢 你可以实施IText提取策略
  • 限制用户在 Mapview 上可以到达的区域

    我正在使用地图视图的定制版本 OSMDroid 版本 我在其中使用自定义图块 我只希望用户能够查看我拥有自定义图块的区域 有没有办法设置边界纬度 以便当他们平移地图时不会超出这些边界 Update 我知道这是一个老问题 但 osmdroid
  • 如何安装“Android 支持库”以将 Gluon Mobile 应用程序部署到 Android?

    我想使用 Gluon Mobile 框架开发一个 Android 应用程序 我在 Netbeans IDE 中安装了 Gluon 插件 创建了一个示例项目并成功构建了它 现在我想将该应用程序部署到 Android 设备 我指的是在线文档 1
  • ViewCompat.setOnApplyWindowInsetsListener使状态栏颜色消失

    这是我用来检测何时的代码Keyboard Height变化 唯一的问题是Statur Bar当此代码运行时 颜色消失并变为白色 ViewCompat setOnApplyWindowInsetsListener this getWindow
  • 检测非 DPI 感知应用程序是否已扩展/虚拟化

    我正在尝试在 WinForms 应用程序中检测它是否由于操作系统具有高 DPI 而以缩放 虚拟化模式启动 目前 在以 3840x2400 缩放 200 缩放运行的系统中 应用程序将分辨率视为 1920x1200 DPI 为 96 缩放因子为
  • 使用 C# winforms 与 Windows 中的其他桌面应用程序交互

    我想知道是否可以与使用我的程序的其他程序进行交互 例如 单击另一个程序上的按钮等 我不确定这是否可能 但如果可能的话 有人可以提供一些 C 示例代码 Thanks 您可以创建消息并将其发送到其他进程 为此 您必须在 C 代码中使用 P In
  • 如何在 JSON 输出上强制采用 ISO 格式“YYYY-MM-DDThh:mm:ss.sss”?

    我有一个 ASP NET WebApi2 api 它返回一些 JSON 格式的时间戳 时间戳具有毫秒分辨率 通常我会得到这种格式的时间戳 这很好 YYYY MM DDThh mm ss sss 不幸的是 如果时间戳恰好用整秒对日期进行编码
  • Android 前台服务通知未显示

    我正在尝试启动前台服务 我收到服务确实启动的通知 但通知总是被抑制 我仔细检查了应用程序是否允许在我的设备上的应用程序信息中显示通知 这是我的代码 private void showNotification Intent notificat
  • 如何使用 Dictionary 属性序列化对象?

    在下面的示例代码中 我得到了这个error 元素 TestSerializeDictionary123 Customer CustomProperties 呕吐型 System Collections Generic Dictionary
  • Action 的通用约束未按预期工作

    我无法理解为什么以下代码片段没有给我错误 public void SomeMethod
  • Android 上方向改变时如何避免重新启动 Activity

    我正在创建一个 Android 应用程序 在其中在画布上绘制视图 当设备的方向改变时 活动将重新启动 我不想这样 如何避免在方向改变时重新启动 Activity 有多种方法可以做到这一点 但正如给定的here https stackover
  • SQLDroid 和加密数据库

    我的应用程序有一个已经存在的数据库 已经存在 是指我不在我的应用程序中创建数据库 我只是连接到它并读取数据 为了设置连接 我使用 SQLDroid 现在我想知道是否有可能使用 SQLDroid 加密我的数据库 否则我的数据库未加密 任何人都

随机推荐

  • PHP登录注册页面

    注册 html 注册1 php
  • 四元数 旋转 旋转矩阵 欧拉角互相转换

    四元数的作用 表达旋转 旋转的表达方式有很多种 有欧拉角 旋转矩阵 轴角 四元数 unit quaternion unit quaternion是一种表达旋转的方式 不同的旋转表达方式概览 1 欧拉角 欧拉角使用最简单的x y z值来分别表
  • Python如何计算两个数字之和是多少?

    python是一门非常受欢迎的编程语言 具有多种优势 简单易学 用途广泛 免费开源 易读易维护 可移植 且具有丰富的库 在诸多领域都得到了广泛的应用 而在python中 求两个数的和是非常常见的需求 但很多小伙伴在实际操作过程中经常会出现报
  • 第【4】篇 如何理解数字货币?它与区块链又是什么样的关系?

    为什么80 的码农都做不了架构师 gt gt gt 从历史进程来看 货币的形态主要经历了几次变化 从早期社会如兽皮 牲畜 陶器的物物交换 到各种贝壳类的货币 再到后面的铜币 乃至后来人们选择了黄金和白银作为流通货币 随着消费需求不断增加 人
  • Android获取系统文件常用路径(详细)

    在android 6 0以前 你可以只关注外置存储是否挂载即可 但是从6 0以后 也就是M系统后 还需要判断是否有读写权限 只有具备这些权限才可以读写外置存储 package com jinfeng gongshigonggao utils
  • 获取1-10000之前所有的对称数(回文数)

    对称数 求 1 10000 之间的所有对称数 回文 例如 0 1 2 11 22 101 232 1221 思路1 使用数组反转 数字转换为字符串 字符串转换为数组 reverse 再 join 生成字符串 比较前后的字符串 查询 1 ma
  • 【论文阅读-Transformer】Attention is all you need

    Title Attention is all you need From NeurIPS 2017 Link https arxiv org abs 1706 03762 Code https github com tensorflow t
  • 若依框架整合mybatis-plus

    若依框架之整合mybatis plus mybatis plus在若依框架中的应用 文章目录 若依框架之整合mybatis plus 前言 一 为什么要用mybatis plus 二 整合步骤 1 引入pom文件 2 增加mybatis p
  • 高德地图api之编码(Geocoder)

    高德地图目前仅支持中国范围内的的地理编码和反地理编码 当我们在做搜索功能的时候 由于用户不可以记住地点的经纬度 所以只可能输入地名 所以地理编码就显得额外重要 这里我们查看一下AMap api中的地理编码 地理编码 地理编码 顾名思义就是根
  • [QT] QMap使用详解

    QT QMap使用详解 引言 QMap QMultiMap属于关联式容器 其底层结构是通过二叉树实现 故其查找value的效率很快 QMap中的数据都是成对出现的 第一个称为key 键 第二个称value 键值 目录 实例化QMap对象 插
  • 这才是真正的 Git——分支合并

    本文作者 lzaneli 腾讯 TEG 前端开发工程师 合并前文件还在的 合并后就不见了 我遇到 Git 合并的 bug 了 是两句经常听到的话 但真的是 Git 的 bug 么 或许只是你的预期不对 本文通过讲解三向合并和 Git 的合并
  • C++命名空间

    为了避免变量 函数 类 结构体等重命名 我们可以使用命名空间 简单的用例 定义命名空间 namespace name 代码声明 使用命名空间 code为name命名空间中的成员 name code using指令 使用 using name
  • Python中的is和==理解

    Python中的is和 理解 Python中的三要素 id 身份标识 type 数据类型 value 值 is 和 具体区别 是python标准操作符中的比较操作符 用来比较判断两个对象的value 值 是否相等 a1 hello a2 h
  • 5分钟学会ECharts项目:全球GDP数据可视化

    应对现在数据可视化的趋势 越来越多企业需要在很多场景下使用可视化图表来展示体现数据 让数据更加直观 数据特点更加突出 目前 数据可视化JS库也有很多 比如 echarts d3 js 等等 本项目使用的是 echarts 库实现的 效果如下
  • 靶形数独

    我终于AC了 毒瘤卡常题 pragma GCC optimize 1 pragma GCC optimize 2 pragma GCC optimize 3 pragma GCC optimize Ofast pragma GCC opti
  • kettle 转换命名参数从将上一转换的参数传递到下一转换中

    kettle 转换命名参数从将上一转换的参数传递到下一转换中 1 知识点 1 如何将转换中的行记录传递到job 结果 中 2 如何使用转换的命名参数功能获取到上一转换中的参数 2 需求及实现 1 需求 如下图所示在转换1中将转换中的结果值传
  • 一起来算圆周率

    转载自 http www guokr com blog 444081 自古计算圆周率是数学界一项流行运动 各大数学家争相破记录以名垂青史 想象有人为圆周率15年如一日地算 算的不是圆周率而是寂寞啊 自有圆周率 计算比的是数学 后有现代数学
  • r语言怎么把txt数据变成一个Rdata格式_R语言 第2章 数据对象与数据读写(8)

    Rcurl举例 读取拉手深圳美食搜索 解析页面内容 获取门店名称 描述 优惠价 门店价 课后练习1 读取系统日期时间 进行变量类型的转换 对转换前后的变量类型进行辨别对比 1 使用读取系统当前日期时间的3个函数 Sys Date Sys t
  • mac环境搭建

    macpro 11 开发环境搭建 一 基础软件安装 1 1 安装nginx 参考 https www jianshu com p 4f433d219ab7 现在mac认为root安装软件过于危险 不推荐用root账号安装软件 brew in
  • RK3568 应用层 libhwjpeg.so 硬件编解码的使用

    libhwjpeg是RK封装的一个对MJPEG数据进行硬件编解码的so 用起来还是比较方便 相比软编效率也有提升 应用层没有提供接口 所以需要自己封装JNI接口 在SDK hardware rockchip libhwjpeg test 下