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小时内删除。