关于摄像头的两个缓冲区

小马   2009-9-22 16:43 楼主
在三星6410BSP中,有个OV9650的摄像头模组驱动代码,在s3c6410_camera.h中有对于两个缓冲区的定义:一个是用来捕捉静态及动态视频的,一个是用于预览的。

#define MAX_HW_FRAMES                                     4

#define CAPTURE_BUFFER_SIZE       1966080        //  ( 1280*1024*3/2 )
#define PREVIEW_BUFFER_SIZE       614400         //  ( 320*240*2  )  * MAX_HW_FRAMES


那位大侠能够解释下这两个SIZE的来历?? 也就是后面注释中的那几个数都是怎么回事啊?
另外,MAX_HW_FRAMES 是由那里决定的?为什么是4

回复评论 (18)

不明白。。查下电路。。

也许会有发现
点赞  2009-9-22 17:30
YUV 个一个字节就是 x3;隔行没帧只有1/2
请看S3C6410X_UM_Rev1.10_080822.pdf 20-10页,我是这样理解的。
点赞  2009-9-22 17:46
YUV 各一个字节就是 x3;隔行每帧只有1/2
请看S3C6410X_UM_Rev1.10_080822.pdf 20-10页,我是这样理解的。

点赞  2009-9-22 17:48
再看20-16 有奇偶场之分,就是除以2
不知理解对否
点赞  2009-9-22 17:56
引用: 引用 2 楼 myearth 的回复:
YUV 个一个字节就是 x3;隔行没帧只有1/2
请看S3C6410X_UM_Rev1.10_080822.pdf 20-10页,我是这样理解的。

貌似YUV数据就是一个像素占1.5个字节吧,一帧的大小就是 分辨率X1.5
点赞  2009-9-22 18:47
引用: 引用 5 楼 rockursoul 的回复:
引用 2 楼 myearth 的回复:
YUV 个一个字节就是 x3;隔行没帧只有1/2
请看S3C6410X_UM_Rev1.10_080822.pdf 20-10页,我是这样理解的。

貌似YUV数据就是一个像素占1.5个字节吧,一帧的大小就是 分辨率X1.5


驱动里从不会有.5个字节的,第一次听说;再看看datasheet吧
点赞  2009-9-23 08:49
#define MAX_HW_FRAMES    4
#define PREVIEW_BUFFER_SIZE      614400        //  ( 320*240*2  )  * MAX_HW_FRAMES


PREVIEW模式下,输出图像的大小是长320宽240共320*240个象素点,每个象素点时16个bits(2个bytes)所以一幅图片的需要320*240*2bytes的空间大小,然后这个模式下面有4个DMA buffer,所以MAX_HW_FRAMES 为 4,综合算一下PREVIEW就要( 320*240*2  )  * MAX_HW_FRAMES 这么大的空间。
点赞  2009-9-23 10:28
#define CAPTURE_BUFFER_SIZE      1966080        //  ( 1280*1024*3/2 )

CAPTURE模式下要根据你的CAPTURE的数据格式来的,像YUV422,YUV411什么的。
按照你上面写的好像是YUV411,按照这种格式来说存储的6个字节可以表示4个象素点(16个bits),也就是每个象素点需要6/4=1.5个bytes。
由于你的CAPTURE可以支持最大1280*1024个像素,所以空间大小是1280*1024*3/2。

存储格式我记得不清楚了,你自己查下YCBCR,YUV这些概念就了解了,上面的只是我的印象。
点赞  2009-9-23 10:34
up
点赞  2009-9-23 10:34
要你先看看你的摄像头采集上来的数据格式是什么。。一般是yuv422,或者yuv420.。。。。看你用什么摄像头了。。看看摄像头的参数设置
点赞  2009-9-23 13:47
引用: 引用 7 楼 abo77281 的回复:
#define MAX_HW_FRAMES? ? 4
#define PREVIEW_BUFFER_SIZE? ? ? 614400? ? ? ? //? ( 320*240*2? )? * MAX_HW_FRAMES

PREVIEW模式下,输出图像的大小是长320宽240共320*240个象素点,每个象素点时16个bits(2个bytes)所以一幅图片的需要320*240*2bytes的空间大小,然后这个模式下面有4个DMA buffer,所以MAX_HW_FRAMES 为 4,综合算一下PREVIEW就要( 320*240*2? )? * MAX_HW_FRAMES 这么大的空间。


刚才又看了下Datasheet,如果一个像素点占2个字节,这样的格式要么是RGB16,要么是YUV422。
点赞  2009-9-23 15:26
引用: 引用 8 楼 abo77281 的回复:
#define CAPTURE_BUFFER_SIZE? ? ? 1966080? ? ? ? //? ( 1280*1024*3/2 )

CAPTURE模式下要根据你的CAPTURE的数据格式来的,像YUV422,YUV411什么的。
按照你上面写的好像是YUV411,按照这种格式来说存储的6个字节可以表示4个象素点(16个bits),也就是每个象素点需要6/4=1.5个bytes。
由于你的CAPTURE可以支持最大1280*1024个像素,所以空间大小是1280*1024*3/2。

存储格式我记得不清楚了,你自己查下YCBCR,YUV这些概念就了解了,上面的只是我的印象。


这里,有两种可能:
1 YUV411,4个水平方向的像素需要6个字节存储,也就是每个像素1.5个字节;
2 YUV420, 2X2个像素需要6个字节存储,也就是每个像素1.5个字节。
点赞  2009-9-23 15:31
没有说1个像素是1.5个字节的。。yuv411的意思就是4个Y使用一个U一个v,一个像素就对应这一个Y,一般都是以块来计算的,这里是个像素就是一块了。就是说4个像素6个字节。。其他的类似
点赞  2009-9-23 16:45
终结者来了,要弄清楚YUV采样格式,看完下面的东东就明白了。
另外说下JPEG编码一般只支持YUV420的,估计你的capturesize应该指的是YUV420数据的容量


  1. YUV主要的采样格式
  2. 主要的采样格式有YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和 YCbCr 4:4:4。其中YCbCr 4:1:1 比较常用,其含义为:每个点保存一个 8bit 的亮度值(也就是Y值), 每 2x2 个点保存一个 Cr 和Cb 值, 图像在肉眼中的感觉不会起太大的变化。所以, 原来用 RGB(R,G,B 都是 8bit unsigned) 模型, 4 个点需要 8x3=24 bites(如下图第一个图). 而现在仅需要 8+(8/4)+(8/4)=12bites, 平均每个点占12bites(如下图第二个图)。这样就把图像的数据压缩了一半。
  3.     上边仅给出了理论上的示例,在实际数据存储中是有可能是不同的,下面给出几种具体的存储形式:
  4. 1.    YUV 4:4:4
  5. YUV三个信道的抽样率相同,因此在生成的图像里,每个象素的三个分量信息完整(每个分量通常8比特),经过8比特量化之后,未经压缩的每个像素占用3个字节。
  6. 下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
  7. 存放的码流为:        Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
  8. 2.   YUV 4:2:2
  9.       每个色差信道的抽样率是亮度信道的一半,所以水平方向的色度抽样率只是4:4:4的一半。对非压缩的8比特量化的图像来说,每个由两个水平方向相邻的像素组成的宏像素需要占用4字节内存。
  10. 下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
  11. 存放的码流为:        Y0 U0 Y1 V1 Y2 U2 Y3 V3
  12. 映射出像素点为:  [Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3]
  13. 3.   YUV 4:1:1
  14. 4:1:1的色度抽样,是在水平方向上对色度进行4:1抽样。对于低端用户和消费类产品这仍然是可以接受的。对非压缩的8比特量化的视频来说,每个由4个水平方向相邻的像素组成的宏像素需要占用6字节内存
  15. 下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
  16. 存放的码流为:        Y0 U0 Y1 Y2 V2 Y3
  17. 映射出像素点为:  [Y0 U0 V2] [Y1 U0 V2] [Y2 U0 V2] [Y3 U0 V2]
  18. 4.   YUV4:2:0
  19.      4:2:0并不意味着只有Y,Cb而没有Cr分量。它指得是对每行扫描线来说,只有一种色度分量以2:1的抽样率存储。相邻的扫描行存储不同的色度分量,也就是说,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0...以此类推。对每个色度分量来说,水平方向和竖直方向的抽样率都是2:1,所以可以说色度的抽样率是4:1。对非压缩的8比特量化的视频来说,每个由2x2个2行2列相邻的像素组成的宏像素需要占用6字节内存。
  20. 下面八个像素为:  [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
  21.                           [Y4 U4 V4] [Y5 U5 V5] [Y6 U6 V6] [Y7 U7 V7]
  22. 存放的码流为:     Y0 U0 Y1 Y2 U2 Y3
  23.                           Y4 V4 Y5 Y6 V6 Y7
  24. 映射出的像素点为:[Y0 U0 V4] [Y1 U0 V4] [Y2 U2 V6] [Y3 U2 V6]
  25.                            [Y4 U0 V4] [Y6 U0 V4] [Y7 U2 V6] [Y8 U2 V6]


点赞  2009-9-23 17:38
引用: 引用 11 楼 lbqhope 的回复:
引用 7 楼 abo77281 的回复:
#define MAX_HW_FRAMES? ? 4
#define PREVIEW_BUFFER_SIZE? ? ? 614400? ? ? ? //? ( 320*240*2? )? * MAX_HW_FRAMES

PREVIEW模式下,输出图像的大小是长320宽240共320*240个象素点,每个象素点时16个bits(2个bytes)所以一幅图片的需要320*240*2bytes的空间大小,然后这个模式下面有4个DMA buffer,所以MAX_HW_FRAMES 为 4,综合算一下PREVIEW就要( 320*240*2? )? * MAX_HW_FRAMES 这么大的空间。



刚才又看了下Datasheet,如果一个像素点占2个字节,这样的格式要么是RGB16,要么是YUV422。


按照你的code,应该是preview模式下面用得RGB16。
点赞  2009-9-23 17:44
引用: 引用 13 楼 unsway123 的回复:
没有说1个像素是1.5个字节的。。yuv411的意思就是4个Y使用一个U一个v,一个像素就对应这一个Y,一般都是以块来计算的,这里是个像素就是一块了。就是说4个像素6个字节。。其他的类似



说1个像素是1.5bytes是不专业的,可能会误导一些人,呵呵,不过这样能清楚地说明怎么算的空间大小。
点赞  2009-9-23 17:47
总之,开辟空间的大小要根据数据格式来算。
点赞  2009-9-23 17:48
引用: 引用 16 楼 abo77281 的回复:
引用 13 楼 unsway123 的回复:
没有说1个像素是1.5个字节的。。yuv411的意思就是4个Y使用一个U一个v,一个像素就对应这一个Y,一般都是以块来计算的,这里是个像素就是一块了。就是说4个像素6个字节。。其他的类似



说1个像素是1.5bytes是不专业的,可能会误导一些人,呵呵,不过这样能清楚地说明怎么算的空间大小。


对的,只能是说相当于每个像素1.5Bytes, 实际上420和411是4个像素组成的一个像素块占用6个Bytes.

RockurSoul那个说明都解释清楚了。
开开心心结贴了。
点赞  2009-9-23 21:51
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复