[ffmpeg] AVOption

在ffmpeg中,常使用AVOption的API來進行參數設置。AVOption的API主要分爲設置參數以及提取參數兩種,不管是哪種API都主要分爲兩大步驟:html

  1. 尋找出參數所在的內存位置。
  2. 若是是設置參數,就先把參數轉換爲正確的數據類型,而後把參數寫入內存位置;若是是提取參數,就先從內存位置提取出參數,而後把參數轉換爲輸出所需的數據類型。

本文主要討論第一步,即定位參數所在的內存位置(av_opt_find2)。數組

 

可被進行參數查找的結構

在調用av_opt_set這一類函數的時候,會傳入一個結構體,如AVCodecContext,AVFormatContext,AVFilterContext,SwrContext,SwsContext等。這些是能夠被用於參數查找的結構體,這些結構體都有一個特徵:以AVClass做爲結構體的頭部函數

AVClass主要做用有兩個:提供用於參數查找所必須的材料;指示所在的結構體相關的log顯示樣式(如log level,log顏色等)。spa

AVClass中用於參數查找所必須的材料有兩個:指針

option 用於保存描述參數項的列表,即AVOption數組。
child_next 若是所查找的結構體中存在可被進行參數查找的子結構體,那麼child_next函數應該返回指向該子結構體的指針,如此一來就能夠經過子結構體進行參數查找。

 

image

 

 

定位參數所在的內存地址

在定位參數內存地址的時候都會用到AVOption,其中在定位時用到的AVOption中比較重要的成員有:orm

name 參數名稱,用於與av_opt_set所輸入的參數名稱進行匹配,若是名稱相同則表示成功找到該參數。
offset 參數所在位置與目標結構體頭部的位置差。

image

定位參數的內存地址能夠分爲兩個步驟:htm

  1. 定位結構體時。去查看該結構體中指向的option列表,若是列表中有與輸入的名稱同名的參數,則代表匹配成功,那麼該option列表所在的結構體就是咱們所定位的結構體。若是在調用av_opt_set的時候指定了AV_OPT_SEARCH_CHILDREN,還會遞歸地去查找子結構體中的option列表。
  2. 在獲得了目標結構體的地址後,加上option中的offset後就能獲得目標參數的內存地址。
相關文章
相關標籤/搜索