int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align);

一、int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align);

函数的作用是通过指定像素格式、图像宽、图像高来计算所需的内存大小

重点说明一个参数align:此参数是设定内存对齐的对齐数,也就是按多大的字节进行内存对齐。比如设置为1,表示按1字节对齐,那么得到的结果就是与实际的内存大小一样。再比如设置为4,表示按4字节对齐。也就是内存的起始地址必须是4的整倍数。

二、av_image_alloc()是这样定义的。此函数的功能是按照指定的宽、高、像素格式来分析图像内存。

int av_image_alloc(uint8_t *pointers[4], int linesizes[4],  int w, int h, enum AVPixelFormat pix_fmt, int align);

pointers[4]:保存图像通道的地址。如果是RGB,则前三个指针分别指向R,G,B的内存地址。第四个指针保留不用 linesizes[4]:保存图像每个通道的内存对齐的步长,即一行的对齐内存的宽度,此值大小等于图像宽度。

  w:                 要申请内存的图像宽度。

  h:                  要申请内存的图像高度。

  pix_fmt:        要申请内存的图像的像素格式。

  align:            用于内存对齐的值。

  返回值:所申请的内存空间的总大小。如果是负值,表示申请失败。

三、int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4],                         const uint8_t *src,  enum AVPixelFormat pix_fmt, int width, int height, int align);

av_image_fill_arrays()函数自身不具备内存申请的功能,此函数类似于格式化已经申请的内存,即通过av_malloc()函数申请的内存空间。

再者,av_image_fill_arrays()中参数具体说明:

  dst_data[4]:        [out]对申请的内存格式化为三个通道后,分别保存其地址

  dst_linesize[4]:        [out]格式化的内存的步长(即内存对齐后的宽度)

  *src:        [in]av_alloc()函数申请的内存地址。

 pix_fmt:    [in] 申请 src内存时的像素格式

width:        [in]申请src内存时指定的宽度

height:        [in]申请scr内存时指定的高度

align:        [in]申请src内存时指定的对齐字节数。

通过以上实例可以看到,(a)计算所需内存大小av_image_get_bufferz_size() --> (b) 按计算的内存大小申请所需内存 av_malloc()  --> (c) 对申请的内存进行格式化 av_image_fill_arrays();

 

rtsp://admin:gzzxsy00@192.168.3.64:554/h264/ch1/main/av_stream

rtsp://admin:admin12345@192.168.10.101:554/h264/ch1/main/av_stream

上一篇:ffmpeg编解码demo


下一篇:摄像头直播