这与ffmpeg 0.7有关(是的,我知道它已经过时了,但数据访问应该类似)。
我正在编写一个libavfilter来从每个帧中提取亮度数据。在draw_slice()函数中,我可以访问AVFilterLink结构,这反过来使我能够访问具有uint8_t * data []指针的AVFilterBufferRef结构。对于PIX_FMT_YUV420P类型,我认为数据[0],数据[1],数据[2]分别指Y U V通道。
我的问题是,使用指向数据[0](亮度平面)的指针,我该如何解释数据? pixfmt.h头文件声明:
PIX_FMT_YUV420P,///<平面YUV 4:2:0,12bpp,(每2x2 Y样品1 Cr和Cb样品)
这是否意味着我必须每2个字节解释亮度平面数据?另外,指针指向的值的数据类型究竟是什么 - int,float等?
提前致谢
答案 0 :(得分:0)
是数据[0]是亮度。每个像素是8位(一个字节)。但你必须大踏步走。
所以要查看循环中的每个像素:
uint8_t pixval;
for(int y = 0 ; y < height; ++y )
{
for(int x = 0 ; x < width; ++x )
{
pixval = data[0][x+(y*stride)];
}
}
(显然,你可以优化它)
U和V平面是Y平面分辨率的四分之一(高度的一半和宽度的一半)。所以每个字节是4个像素(2宽2高)。