Rexdf

The devil is in the Details.

LFP文件格式解析

| Comments

经过一番折腾,在我的64位Win8上面也装上了GSTreamer的Python绑定,然后就开始玩behnam-python-lfp-reader,之后经过搜索,发现了一个标准C语言版本的,和一个用php类写的版本。

1.lfptools

当然先clone下来

git clone git://github.com/nrpatel/lfptools.git

然后进入MingW

cd /e/work/lfptools/
make

成功编译 lfptools 现在就分析下源代码了 main函数进入之后解析命令行第一个参数,并调用lfp_create打开,过程大约就是,算出文件长度并填入表中(二进制到位中间转换过一次),然后整个按照二进制文件读取出来。 接着便是调用lfp_file_check检测是否是lfp格式的文件,lfp格式文件开头标志为0x89, 0x4C, 0x46, 0x50, 0x0D, 0x0A, 0x1A, 0x0A。 下一步就是解析lfp文件了,lfp数据是一块一块的,每块都有一个魔术头3+1byte,然后就是块的长度,这是一个32bit的整数,而且大端方式,转换成正常整数即是数据块长度,之后就是45bit SHA1+35bit Blank,接下去就是声明长度的块数据了。数据块识别好以后就是识别数据块的类型,首先寻找一个“”包含的字符串,从处理上看,应该包括以下几种类型: LFP_RAW_IMAGE应该就是普通的图片格式了,调用converted_image函数处理,似乎就是把38bit的数据转换成如下的两个16位数据。 image LFP_JSON 数据名字,假设其他不是”imageRef”标识的 LFP_DEPTH_LUT 深度信息,是48bit一个32位的float格式。用”depth”(包括引号)标识 LFP_LUT 是Lytro第二版本有的,用”lut”(包括引号)标识 LFP_JPEG 是JPEG格式数据,用”image”(包括引号)标识 LFP_BLOCK_OF_IMAGES 这个是H264块,用”blockOfImagesRef”(包括引号)标识

2.behnam-python-lfp-reader

git clone git://github.com/behnam/python-lfp-reader.git

主要是装Gstreamer的Python绑定比较麻烦,不能用google code的10.7那个OSSBuild,要用2012的那个,而且不能同时安装这个两个。不过奇怪的是在XP系统上那么快,为何在我的系统上几乎要几分钟来执行import gst命令。左键换焦点,中键全聚焦,右键小幅度变化视角。对于代码的分析,没有太大的欲望。所以也就只是调试下这个项目代码而已。 lfp reader

3.Lytro: Image Viewer

git clone git://github.com/maxvw/php-lytro.git

这个是php版本的,本来打算放到博客空间上面的,但是才发现博客是采用php5.2,开了tips问了下,说是不可以,要我买VPS可以自己折腾,想想这个空间大约6月份就到期了,就不续费好了。回到这个软件上了,这个是用php实现的,用了namespace等,用OO的思想实现的,图片进行缓存。 imageviewer经过一番折腾,在我的64位Win8上面也装上了GSTreamer的Python绑定,然后就开始玩behnam-python-lfp-reader,之后经过搜索,发现了一个标准C语言版本的,和一个用php类写的版本。

1.lfptools

当然先clone下来

git clone git://github.com/nrpatel/lfptools.git

然后进入MingW

cd /e/work/lfptools/
make

成功编译 lfptools lfptools2 现在就分析下源代码了 main函数进入之后解析命令行第一个参数,并调用lfp_create打开,过程大约就是,算出文件长度并填入表中(二进制到位中间转换过一次),然后整个按照二进制文件读取出来。 接着便是调用lfp_file_check检测是否是lfp格式的文件,lfp格式文件开头标志为0x89, 0x4C, 0x46, 0x50, 0x0D, 0x0A, 0x1A, 0x0A。 下一步就是解析lfp文件了,lfp数据是一块一块的,每块都有一个魔术头3+1byte,然后就是块的长度,这是一个32bit的整数,而且大端方式,转换成正常整数即是数据块长度,之后就是45bit SHA1+35bit Blank,接下去就是声明长度的块数据了。数据块识别好以后就是识别数据块的类型,首先寻找一个“”包含的字符串,从处理上看,应该包括以下几种类型: LFP_RAW_IMAGE应该就是普通的图片格式了,调用converted_image函数处理,似乎就是把38bit的数据转换成如下的两个16位数据。 image LFP_JSON 数据名字,假设其他不是”imageRef”标识的 LFP_DEPTH_LUT 深度信息,是48bit一个32位的float格式。用”depth”(包括引号)标识 LFP_LUT 是Lytro第二版本有的,用”lut”(包括引号)标识 LFP_JPEG 是JPEG格式数据,用”image”(包括引号)标识 LFP_BLOCK_OF_IMAGES 这个是H264块,用”blockOfImagesRef”(包括引号)标识

2.behnam-python-lfp-reader

git clone git://github.com/behnam/python-lfp-reader.git

主要是装Gstreamer的Python绑定比较麻烦,不能用google code的10.7那个OSSBuild,要用2012的那个,而且不能同时安装这个两个。不过奇怪的是在XP系统上那么快,为何在我的系统上几乎要几分钟来执行import gst命令。左键换焦点,中键全聚焦,右键小幅度变化视角。对于代码的分析,没有太大的欲望。所以也就只是调试下这个项目代码而已。 lfp reader

3.Lytro: Image Viewer

git clone git://github.com/maxvw/php-lytro.git

这个是php版本的,本来打算放到博客空间上面的,但是才发现博客是采用php5.2,开了tips问了下,说是不可以,要我买VPS可以自己折腾,想想这个空间大约6月份就到期了,就不续费好了。回到这个软件上了,这个是用php实现的,用了namespace等,用OO的思想实现的,图片进行缓存。

Comments