FFMPEG中分配圖像內存以及初始化的函數用法

前面分析了ffmpeg中結構體AVFrame的使用方法,在網上看到一些相關的其他內容,整理以下。

一、ffmpeg中av_image_alloc()是這樣定義的。此函數的功能是按照指定的寬、高、像素格式來分析圖像內存。

參數說明:

  1. pointers[4]:保存圖像通道的地址。如果是RGB,則前三個指針分別指向R,G,B的內存地址。第四個指針保留不用

  2. linesizes[4]:保存圖像每個通道的內存對齊的步長,即一行的對齊內存的寬度,此值大小等於圖像寬度。

  3. w: 要申請內存的圖像寬度。

  4. h: 要申請內存的圖像高度。

  5. pix_fmt: 要申請內存的圖像的像素格式。

  6. align: 用於內存對齊的值。

  7. 返回值:所申請的內存空間的總大小。如果是負值,表示申請失敗。

FFMPEG在使用AVFrame保存解碼後的yuv圖片和圖片參數,其yuv存儲格式是yuv420sp,先存y值,然後是uv值。那麼有效的通道數只有2。但是如果解碼後的yuv值有顏色空間的轉換,比如rgb,那麼圖片數據的存儲通道數是3。

二、另一種同樣功能的函數調用方法

  1. int image_buf_size = av_image_get_buffer_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height, 1); //計算指定像素格式、圖像寬、高所需要的對齊的內存大小

  2. out_buffer = (unsigned char *)av_malloc(image_buf_size); //分配指定大小的內存空間

av_image_get_buffer_size()函數的作用是通過指定像素格式、圖像寬、圖像高來計算所需的內存大小。

重點說明一個參數align:此參數是設定內存對齊的對齊數,也就是按多大的字節進行內存對齊。比如設置爲1,表示按1字節對齊,那麼得到的結果就是與實際的內存大小一樣。再比如設置爲4,表示按4字節對齊。也就是內存的起始地址必須是4的整倍數。

ffmpeg中關於av_image_fill_array()函數的定義:

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內存時指定的對齊字節數。

(3)調用方法總結

通過以上實例可以看到,(a)計算所需內存大小av_image_get_bufferz_size() --> (b) 按計算的內存大小申請所需內存 av_malloc()  --> (c) 對申請的內存進行格式化 av_image_fill_arrays();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章