JPEG codec 用来compresses original raw image以及decompresses original JPEG image。这个硬件电路执行compression/decompression需要的所有功能:离散余弦变换,量化和霍夫曼编码。
编码功能:
输入raw image: 格式为YCbCr4:2:2, RGB565
输出的JPEG文件: Baseline JPEG,颜色空间为YCbCr4:2:2或者YCbCr4:2:0
不支持progressive模式
解码功能:
输入JPEG文件:Baseline JPEG,颜色空间为YCbCr4:4:4, YCbCr4:2:2, YCbCr4:2:0,gray
输出raw image: YCbCr4:2:2,YCbCr4:2:0
不支持progressive 模式
预留的内存空间定义在arch/arm/mach-s5pv210/mach-smdkc110.c
#define S5PV210_VIDEO_SAMSUNG_MEMSIZE_JPEG (8192 * SZ_1K)
S5PV210的JPEC codec 驱动在drivers/media/video/samsung/jpeg_v2/下,JEPG codec驱动使用预留的内存存放编解码的输入和输出图像,JPEG codec支持原始图像和thumbnail同时编解码,因此所需预留内存空间要满足main frame, thumbnail frame, main stream, thumbnail stream的内存需求
394 s3c_jpeg_limits.max_main_width = pdata->max_main_width;
395 s3c_jpeg_limits.max_main_height = pdata->max_main_height;
396 s3c_jpeg_limits.max_thumb_width = pdata->max_thumb_width;
397 s3c_jpeg_limits.max_thumb_height = pdata->max_thumb_height;
398
399 main_pixels = s3c_jpeg_limits.max_main_width *
400 s3c_jpeg_limits.max_main_height;
401 thumb_pixels = s3c_jpeg_limits.max_thumb_width *
402 s3c_jpeg_limits.max_thumb_height;
403
404 s3c_jpeg_bufinfo.main_stream_size = ALIGN(main_pixels, PAGE_SIZE);
405 /* Assuming JPEG V2 uses YCBCR422 output format */
406 s3c_jpeg_bufinfo.main_frame_size = ALIGN(main_pixels * 2, PAGE_SIZE);
407
408 s3c_jpeg_bufinfo.thumb_stream_size = ALIGN(thumb_pixels, PAGE_SIZE);
409 s3c_jpeg_bufinfo.thumb_frame_size = ALIGN(thumb_pixels * 2, PAGE_SIZE);
410
411 s3c_jpeg_bufinfo.total_buf_size = s3c_jpeg_bufinfo.main_stream_size +
412 s3c_jpeg_bufinfo.thumb_stream_size +
413 s3c_jpeg_bufinfo.main_frame_size +
414 s3c_jpeg_bufinfo.thumb_frame_size;
从上面代码我们可以得到如下预留内存计算公式
Reserved mem size = main_stream_size + thumb_stream_size + main_frame_size + thumb_frame_size
= ALIGN(main_pixels, PAGE_SIZE) + ALIGN(main_pixels * 2, PAGE_SIZE) + ALIGN(thumb_pixels, PAGE_SIZE) + ALIGN(thumb_pixels * 2, PAGE_SIZE)
= ALIGN(pdata->max_main_width * pdata->max_main_height, PAGE_SIZE) + ALIGN(pdata->max_main_width * pdata->max_main_height *2, PAGE_SIZE)
+ ALIGN(pdata->max_thumb_width * pdata->max_thumb_height, PAGE_SIZE) + ALIGN(pdata->max_thumb_width * pdata->max_thumb_height *2, PAGE_SIZE)
pdata->max_thumb_width,pdata->max_thumb_height,pdata->max_main_width, pdata->max_main_height的定义是项目相关的,是系统需要编解码的原始图片width,height以及thumbnail图片的宽高。
定义在arch/arm/mach-s5pv210/mach-smdkc110.c中
#ifdef CONFIG_VIDEO_JPEG_V2
static struct s3c_platform_jpeg jpeg_plat __initdata = {
.max_main_width = 800,
.max_main_height = 480,
.max_thumb_width = 320,
.max_thumb_height = 240,
};
#endif
因此可得到JPEG codec预留内存的大小
ALIGN(800*480, PAGE_SIZE) + ALIGN(800*480*2, PAGE_SIZE) + ALIGN(320*240, PAGE_SIZE) + ALIGN(320*240*2, PAGE_SIZE) = 1352KB