君正X2100 RTOS JPEG硬件编码

一、配置

进入SDK的tools/iconfigtool/IConfigToolApp目录,执行./IConfigTool指令,进入配置界面:

Config.in 是生成配置界面的文件,Config是需要修改的配置文件,选择之后点击Open。

选择 xburst2系列CPU->X2000系列 CPU->vpu_jpeg_encode(硬件解码):

点击File->save,File->Quit。

 二、代码编写

包含头文件

#include <jpeg-hw.h>

此文件所在目录:\freertos\xburst2\soc-x2000\jpeg_encoder\include

文件类容:

#ifndef __JPEG_HW_H__
#define __JPEG_HW_H__

#include <stdint.h>

enum helix_raw_format {
	HELIX_TILE_MODE = 0,
	HELIX_420P_MODE = 4,
	HELIX_NV12_MODE = 8,
	HELIX_NV21_MODE = 12,
};

/* JPEG encode quantization table select level */
typedef enum {
    LOW_QUALITY,
    MEDIUMS_QUALITY,
    HIGH_QUALITY,
} QUANT_QUALITY;


void* hw_jpeg_encode_init(int width,int height);
void hw_jpeg_encode_deinit(void *handle);
int hw_yuv420_planar_nv12_to_jpeg_frame(void *handle, unsigned char *dst_jpeg_frame, unsigned char *ybuf, unsigned char *uvbuf, int width, int height,  QUANT_QUALITY quality);
int hw_yuv420_planar_nv21_to_jpeg_frame(void *handle, unsigned char *dst_jpeg_frame, unsigned char *ybuf, unsigned char *uvbuf, int width, int height,  QUANT_QUALITY quality);

void *JZMalloc(int align, int size);
unsigned int get_phy_addr(unsigned int vaddr);

#endif    /* __JPEG_HW_H__ */

参考例程:

\freertos\example\driver\vpu_jpeg_encode_example.c

文件内容:

#include <os.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <include_bin.h>

#include <jpeg-hw.h>

#define WIDTH (128)
#define HEIGHT (72)

// #define YUV_RAWBIN

#if defined(YUV_RAWBIN)
#define WIDTH (1280)
#define HEIGHT (720)
// rawbinData, rawbinSize
INCBIN(rawbin, "example/resource/video-1280x720_nv12.yuv");
#endif

static int dump_framebuffer_hex(unsigned char *frame, int len)
{
    int i;
    unsigned char * buf;
    buf= (unsigned char *) frame;
    for (i=0;i<len;i++) {
        fprintf(stderr, "0x%02x, ", *buf++);
        if ((i&0xf)==0xf)
            fprintf(stderr, "\n");
        msleep(1);
    }
    if ((i&0xf)!=0xf)
        fprintf(stderr, "\n");

    return 0;
}

static int generate_color_pattern_nv12(unsigned char *yuvframe, int width, int height)
{
    int i,j;
    unsigned char * y0;
    unsigned short * uv;
    y0 = (unsigned char *)(yuvframe);
    uv = (unsigned short *)(yuvframe+width*height);
    /* y buffer */
    for (j=0;j<height;j++) {
        for (i=0;i<width;i++) {
            *y0 = (i&0xff);
            y0++;
        }
    }
    /* uv buffer */
    for (j=0;j<height/2;j++) {
        for (i=0;i<width/2;i++) {
            //*uv = (((255-j)&0xff)<<8)|(i&0xff);
            *uv = (((255-i)&0xff)<<8)|(i&0xff);
            uv++;
        }
    }

    return 0;
}

static int generate_color_pattern_yuv422(unsigned char *yuvframe, int width, int height)
{
    int i,j;
    unsigned short * y0u;
    unsigned short * y1v;
    y0u = (unsigned short *)(yuvframe);
    y1v = (unsigned short *)(yuvframe+2);
    for (j=0;j<height;j++) {
        for (i=0;i<width/2;i++) {
            *y0u = (((j)&0xff)<<8)|(i&0xff);
            *y1v = (((255-j)&0xff)<<8)|(i&0xff);
            y0u+=2; y1v+=2;
        }
    }

    return 0;
}

static int generate_color_pattern_yuv422_2(char *yuvframe, int width, int height)
{
    int i,j;
    unsigned short * y0u;
    unsigned short * y1v;
    y0u = (unsigned short *)(yuvframe);
    y1v = (unsigned short *)(yuvframe+2);
    for (j=0;j<height;j++) {
        for (i=0;i<width/2;i++) {
            *y0u = (((i)&0xff)<<8)|(j&0xff);
            *y1v = (((255-i)&0xff)<<8)|(j&0xff);
            y0u+=2; y1v+=2;
        }
    }

    return 0;
}

int test_jpeg(void)
{
    int jpg_bs_len;
    void *jz_jpeg = NULL;
    int width = WIDTH;
    int height = HEIGHT;
    int quality = MEDIUMS_QUALITY;
    unsigned char *yframe;
    unsigned char *uvframe;
    printf("%s() width=%d, height=%d, quality=%d\n", __func__, width, height, quality);

    jz_jpeg = hw_jpeg_encode_init(width, height);

    unsigned char *yuvframe = (unsigned char *)JZMalloc(256, width*height*2);
    if(yuvframe == NULL) {
        printf("Get src yuv buffer failed!\n");
        return -1;
    }
    yframe = yuvframe;
    uvframe = yuvframe + (width*height);
    unsigned char *dst_jpeg_frame = (unsigned char *)JZMalloc(256, width*height*3/2);
    if(dst_jpeg_frame == NULL) {
        printf("Get src yuv buffer failed!\n");
        return -1;
    }
    memset(dst_jpeg_frame, 0, width*height*3/2);
    // dump_framebuffer_hex(dst_jpeg_frame, 124);

#if defined(YUV_RAWBIN)
    memcpy(yuvframe, rawbinData, width*height*2);
#else
    generate_color_pattern_nv12(yuvframe, width, height);
#endif
    printf("convert to jpeg frame:\n");
    jpg_bs_len = hw_yuv420_planar_nv12_to_jpeg_frame(jz_jpeg, (char *)dst_jpeg_frame, yframe, uvframe, width, height, quality);
    // jpg_bs_len = hw_yuv420_planar_nv21_to_jpeg_frame(jz_jpeg, (char *)dst_jpeg_frame, yframe, uvframe, width, height, quality);
    printf("convert to jpeg frame finish. quality=%d, jpg_bs_len=%d\n", quality, jpg_bs_len);
    if (jpg_bs_len>0) {
        dump_framebuffer_hex(dst_jpeg_frame, jpg_bs_len);
    } else {
        printf("err --- jpg_bs_len = %d\n", jpg_bs_len);
    }
    printf("jpeg encode deinit\n");
    hw_jpeg_encode_deinit(jz_jpeg);

    free(yuvframe);
    free(dst_jpeg_frame);

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Matter - nordic OTA(3)

Nordic Semiconductor 开发平台示例下&#xff0c;提供了两套进行空中 (OTA) 设备固件升级 (DFU)的方式&#xff1a; 1.基于 Matter OTA 更新协议规范下使用 Matter 网络查询和下载新的固件映像&#xff0c;需要 OTBR。 2. nordic 基于低功耗蓝牙(Bluetooth LE)实现的简单管理协…

golang学习随便记15

golang测试 go test 命令 go test 命令是一个按照一定的约定和组织来测试代码的程序。我们需要了解有哪些约定和组织&#xff1a;在包目录内&#xff0c;所有后缀为 _test.go 的源文件不会被 go build 构建命令构建成包的一部分&#xff0c;相反&#xff0c;它们会被 go test…

java常用IO流功能——字符流和缓冲流概述

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup! 之前说了下了IO流的概念&#xff0c;并整理了字节流&#xff0c;有需要的可以看这篇 java常用应用程序编程接口&#xff08;API&#xff09;——IO流概述及字节流的使用 字符流 FileReader(文件字…

鸿蒙TypeScript入门学习第一天【简单介绍】

1.TypeScript 教程 TypeScript 是 JavaScript 的一个超集&#xff0c;支持 ECMAScript 6 标准&#xff08;&#xff09;。 TypeScript 由微软开发的自由和开源的编程语言。 TypeScript 设计目标是开发大型应用&#xff0c;它可以编译成纯 JavaScript&#xff0c;编译出来的 …

BIM插件定制,你的功能由你说了算!python开发 | 图形引擎 | 几何引擎

各位CSDN的宝宝们~ 如果你对插件开发或BIM技术兴趣十足 有着无限的想法和创意 想解决日常使用BIM软件的难题&#xff0c;打破桎梏 却愁于没有实现的机会 现在&#xff0c;机会来了&#xff01; BIMBase插件命题征集活动已经开启&#xff01; &#xff08;没错就是征集&am…

AI时代-普通人的AI绘画工具对比(Midjouney与Stable Diffusion)

AI时代-普通人的AI绘画工具对比&#xff08;Midjouney与Stable Diffusion&#xff09; 前言1、基础对比Stable Diffusion&#xff08;SD&#xff09;SD界面安装与使用SD Midjouney&#xff08;MJ&#xff09; 2、硬件与运行要求对比Stable Diffusion硬件要求内存硬盘显卡 Midjo…

647. 回文子串

#动态规划法 class Solution:def countSubstrings(self, s: str) -> int:n len(s)#dp[i][j] [i,j]是否为回文串dp [[False]*n for _ in range(n)]res 0#dp[i][j]依赖于dp[i1][j-1]&#xff0c;所以i要从下往上遍历for i in range(n-1,-1,-1):for j in range(i,n):if s[i]…

基于java+springboot+vue实现的超市管理系统(文末源码+Lw+ppt)23-354

摘 要 系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对超市管理的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”…

神经网络代码实现(用手写数字识别数据集实验)

目录 一、前言 二、神经网络架构 三、算法实现 1、导入包 2、实现类 3、训练函数 4、权重参数矩阵初始化 5、参数矩阵变换向量 6、向量变换权重参数矩阵 7、进行梯度下降 7.1、损失函数 7.1.1、前向传播 7.2、反向传播 8、预测函数 四、完整代码 五、手写数字识别 一、前言 …

创建数组的时候,数组大小是确定数值和变量的不同情况

概要&#xff1a; 1、创将数组的时候&#xff0c;如果数组大小是确定数值 &#xff08;1&#xff09;数组所有元素默认是0 &#xff08;2&#xff09;可以通过大括号对元素进行赋值 int arr[3]{1,2,3}; int arr[10]{1}; //只将第一个元素赋值为1,其他元素依然是0 2、…

istio 设置 istio-proxy sidecar 的 resource 的 limit 和 request

方式一 修改 configmap 查看当前 sidecar 的 cpu 和 memory 的配额 在 istio-sidecar-injector 中查找,修改后重启 pod 可以生效(下面那个 proxy_init 配置不管,不知道是干嘛的) 方式二 如果是通过 iop 安装的 istio,可以修改 iop 文件中的配置 spec:values:global:…

静态住宅IP VS 动态住宅IP,怎么选择?

在进行海外 IP 代理时&#xff0c;了解动态住宅 IP 和静态住宅 IP 的区别以及如何选择合适的类型非常重要。本文将介绍精态住宅 IP 特点和&#xff0c;并提供选择建议&#xff0c;帮助您根据需求做出明智的决策。 静态住宅 IP 的特点 静态住宅 IP 是指 IP 地址在一段时间内保…

【Java程序设计】【C00360】基于Springboot的考研互助交流平台(有论文)

基于Springboot的考研互助交流平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 &#x1f345;文末点击卡片获取源码&#x1f345; 开发环境 运行环境&#xff1a;推荐jdk1.8&#xff1b; 开发工具&#xff1a;eclipse以及i…

Cadence——生成Gerber制板文件

软件版本&#xff1a;Cadence SPB OrCAD Allegro 16.6 打开Allegro PCB Designer 选择如下选项&#x1f447; 点击 File–>Open&#xff0c;找到对应的.brd文件 电气错误的检查&#xff1a;点击 Display–>Status&#xff0c;全为绿色则没有错误 按照不同的项目来进…

【SQL】1517. 查找拥有有效邮箱的用户(正则表达式regexp)

前述 sql-正则表达式SQL学习笔记 – REGEXP 题目描述 leetcode 题目&#xff1a;1517. 查找拥有有效邮箱的用户 Code select * from Users where mail regexp ^[a-zA-Z][a-zA-Z0-9_.-]*leetcode\\.com$图片引用自 MySQL正则表达式

C++中的内存分区

栈&#xff1a;在执行函数时&#xff0c;函数内局部变量的存储单元都可以在栈上创建&#xff0c;函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中&#xff0c;效率很高&#xff0c;但是分配的内存容量有限 堆&#xff1a;就是那些由 new分配的内…

【Python版】手把手带你如何进行Mock测试

什么是mock&#xff1f; mock测试是以可控的方式模拟真实的对象行为。程序员通常创造模拟对象来测试对象本身该具备的行为&#xff0c;很类似汽车设计者使用碰撞测试假人来模拟车辆碰撞中人的动态行为 为什么要使用Mock&#xff1f; 之所以使用mock测试&#xff0c;是因为真…

matplotlib查询当前系统所有字体

电脑里有这个字体但是不代表matplotlib里也有这个字体&#xff0c;所以解决matplotlib中的中文显示问题主要就是要找到它所内置支持的字体&#xff0c;那么我们首先查看一下它的内置字体&#xff0c;运行以下代码查看所支持的字体 # 查询当前系统所有字体 from matplotlib.fon…

老程序员帮公司面试java程序员,工资都在1万5左右

案例1&#xff08;电商项目经验&#xff09; 培训机构的最爱电商项目&#xff0c;有木有 项目具体模块都讲不清楚&#xff0c;面试直接下课 项目核心业务表都记不住&#xff0c;很难让面试官相信你真的开发过 面试3年电商经验java开发&#xff0c;坚持看完最后有我公司招聘要…