DM365上运行jpegdec程序记录
1. 说明
DVSDK版本:dvsdk_2_10_00_17
路径:ROOTDIR = /opt/dvsdk_2_10_00_17/dm365_codecs_01_00_06/packages/ti/sdo/codecs/jpegdec/
源代码:$(ROOTDIR)/apps/Client/Test/Src
头文件:$(ROOTDIR)/apps/Client/Test/Inc
2. 源代码部分
关于源代码可以简单看一下jpgdTestApp.c
而头文件需要注意定义内存大小的地方,如:testFramework.h
其中一段:
#define MAX_WIDTH 1280 #define MAX_HEIGHT 960 #define JPEG_MAX_NUM_JPEG_BYTES (3*MAX_WIDTH*MAX_HEIGHT) // Max stream size 1M byte #define RINGBUF_SIZE (1024*4096) // (20*4096) // Ring buffer size #define JPEG_MAX_NUM_YCC_BYTES (3*MAX_WIDTH*MAX_HEIGHT) #define AIM_START_ADDRESS (0x10000) #define INTERNAL_DATA_MEM_SIZE (4096) #define EXTERNAL_DATA_MEM_SIZE (16*1024) #define JPEG_MAX_NUM_RGB_BUFFER_LINES (16) #define JPEG_MAX_NUM_SAMPLES_PER_LINE (5000+32) // Width #define STRING_SIZE 256 //!< Size of strings used for filenames |
应用在jpgdTestApp.c中,如:
CMEM_init(); ExternalGlobalMemPool = ExternalGlobalMemPoolBase = CMEM_alloc(EXTERNAL_DATA_MEM_SIZE,&memParams); ringbuf = CMEM_alloc(RINGBUF_SIZE,&memParams); bJpegStream = CMEM_alloc(JPEG_MAX_NUM_JPEG_BYTES,&memParams); bDecodedYCC = CMEM_alloc(JPEG_MAX_NUM_YCC_BYTES,&memParams); |
从上面代码可以看出:
需要4块连续内存,即CMEM,如下:
EXTERNAL_DATA_MEM_SIZE: 16*1024 = 16384
RINGBUF_SIZE: 1024*4096 = 4194304
JPEG_MAX_NUM_JPEG_BYTES: 3*1280*960 = 3686400
JPEG_MAX_NUM_YCC_BYTES: 3*1280*960 = 3686400
3. 写loadmodules.sh脚本
#!/bin/sh rmmod cmemk 2>/dev/null rmmod irqk 2>/dev/null rmmod edmak 2>/dev/null rmmod dm365mmap 2>/dev/null # Pools configuration #insmod cmemk.ko phys_start=0x85000000 phys_end=0x88000000 pools=6x4096,2x8192,1x11908,2x13184,1x2697152,6x4096,1x30720,3x81920, 1x3185664,64x56,1x320,1x640,1x81920,1x6650880,2x608,1x296,1x28,2x24,23x1548288,1x154288,2x3686400 allowOverlap=1 phys_start_1=0x00001000 phys_end_1=0x00008000 pools_1=1x28672 #上面注释的是demo演示程序中的配置,下面是根据分析写的3个pool,虽然物理地址不需要那么多,先写着。 insmod cmemk.ko phys_start=0x85000000 phys_end=0x88000000 pools=1x16384,1x4194304,2x3686400 insmod irqk.ko insmod edmak.ko insmod dm365mmap.ko |
4. 准备运行
4.1. 修改Testvecs.cfg文件
2 ./TestVecs/Config/Testparams.cfg ./TestVecs/Input/frida_720x480.jpeg ./TestVecs/Input/frida_720x480_dec.yuv |
而Testparams.cfg文件中的宽度和长度分别是720x480,所以不用修改。
4.2. 修改源代码并进行编译
修改jpgdTestApp.c的第261行代码如下:
Int8 *fileCfgName = "./TestVecs/Config/Testvecs.cfg"; Int8 *fileLogName = "./TestVecs/"; |
先执行make clean
再make
注:直接make不行,因为有几个c文件的时间戳是未来的,就不编译了。
最后会生成jpgdec-r可执行文件。
4.3. 所需文件
如果在ARM端运行,则需要的文件如下:
Testparams.cfg Testvecs.cfg JPG文件
下面是本人的文件结构:
myJpgDec
|-jpgdec-r
|-TestVecs
| |-Config
| | |-Testparams.cfg
| | |-Testvecs.cfg
| |-Input
| | |-frida_720x480.jpeg
| |-Output
| |-module
| | |-cmemk.ko
| | |-dm365mmap.ko
| | |-edmak.ko
| | |-irqk.ko
| | |-loadmodules.sh
注:如果你不到cmemk.ko、dm365mmap.ko、edmak.ko、irqk.ko等4个文件,启动365板子,在demo演示程序中就有,直接拿来用就可以了。但是loadmodules.s件需修改过,见第3章。
5. 开始运行
如何在365板子上运行,有几种方法:
1. 把myJpgDec打包,通过网络(tftp)下载下去,在板子上解压,然后运行。
2. 考虑到nandflash的大小只有128MB,启动板子,然后用df -h命令查看,可用的也就37MB左右,所以不建议在flash上运行。那么有两种方法:
1) 在U盘或SD卡上运行
2) 挂载nfs
下面分别介绍两种方式的挂载:
resizeby1. 挂载U盘
插入U盘,默认的Linux内核中有驱动,所以能自动识别出来。但是会一直停在那里,用(CTRL+C)退出。
然后使用下面命令进行查看:
# fdisk -l /dev/sda
本人2G的朗科U盘,显示如下:
Disk /dev/sda: 2003 MB, 2003828736 bytes
...
注:试过有些U盘显示的是Disk /dev/sda1:
下面根据上面的显示,进行挂载:
# mount -t msdos /dev/sda /mnt/usb (fat16格式)
# mount -t vfat /dev/sda /mnt/usb (fat32格式)
# mount -t ext2 /dev/sda /mnt/usb (ext2格式)
2. 挂载NFS
命令如下:
# mount -t nfs 192.168.1.109:/opt/nfs /nfsclient/
如果出现下列错误:
mount: RPC: Program not registered
请重启Linux服务器端的nfsserver:
# /etc/init.d/nfsserver restart
关于Linux服务器端的NFSServer建立,这里不讲。
运行比较简单:(如挂载U盘)
# mount -t vfat /dev/sda /mnt/usb
# cd /mnt/usb/myJpgDec/
# cd module
# ./loadmodules.sh
# cd ../
# ./jpgdec-r
6. 进行200万像素的JPEG图片解码
因工作需要,需要对200万像素和500万像素的JPG图片进行编解码。
200万像素的图片大小为1600x1200。
500万像素的图片大小为2448x2048。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论