在ffmpeg中添加轉碼器

來源:互聯網
上載者:User

標籤:style   code   http   ext   color   com   

本文基於ffmpeg-2.2,添加基於QSV(Intel Media SDK / Quick Sync Video)的系列轉碼器qsvavc_enc、qsvavc_dec、qsvmpeg2_dec、 qsvvc1_dec,通過一個命令列參數--enable-qsv開啟和關閉。
1. 在libavcodec目錄添加相應的代碼實現
可參考hevc.c, libx265.c。如qsvdec.c,qsvenc.c。檔案名稱可以隨意起,實現中注意下面紅字標出的地方需注意。ff_qsvavc_decoder/ff_qsvavc_encoder是全域變數,在libavcodec/allcodecs.c中調用REGISTER_ENCDEC宏註冊轉碼器時會引用此全域變數,因此要保值一致。.name項影響到ffmpeg命令列參數-vcodec的名稱。
AVCodec ff_qsvavc_decoder = {    .name           = "qsvavc",    .long_name      = NULL_IF_CONFIG_SMALL("H.264 / AVC Decoder via Intel Media SDK / Quick Sync Video (QSV)"),    .type           = AVMEDIA_TYPE_VIDEO,    .id             = AV_CODEC_ID_H264,    .priv_data_size = sizeof(qsvContext),    .init           = qsv_decode_init_avc,    .close          = qsv_decode_close,    .decode         = qsv_decode_frame,    .flush          = qsv_decode_flush,    .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_TRUNCATED,};
2. 在libavcodec/allcodecs.c中添加轉碼器的註冊REGISTER_ENCODER(QSVAVC,            qsvavc);REGISTER_DECODER(QSVAVC,            qsvavc);REGISTER_DECODER(QSVMPEG2,          qsvmpeg2);REGISTER_DECODER(QSVVC1,            qsvvc1);
allcodecs.c定義了REGISTER_ENCDEC,REGISTER_DECODER,REGISTER_ENCODER三個宏,用於註冊編碼解碼器,僅編碼器,僅解碼器。查看REGISTER_DECODER的宏定義可以看到,先引用全域的ff_xxx_decoder變數,然後調用avcodec_register()函數添加到解碼器列表中。
#define REGISTER_DECODER(X, x)                                          \    {                                                                   \        extern AVCodec ff_##x##_decoder;                                \        if (CONFIG_##X##_DECODER)                                       \            avcodec_register(&ff_##x##_decoder);                        \    }
3. 在libavcodec/Makefile中添加目標檔案將.c檔案名稱替換為.oOBJS-$(CONFIG_QSV)              += qsvdec.oOBJS-$(CONFIG_QSV)              += qsvenc.o或OBJS-$(CONFIG_QSVAVC_DECODER)              += qsvdec.oOBJS-$(CONFIG_QSVAVC_ENCODER)              += qsvenc.o$(CONFIG_XXX)在./configure時產生的config.mak中定義。
4. 修改configure檔案,使轉碼器可以在./configure時禁用和啟用這個步驟是網上一些文章中沒有的。
搜尋show_help()函數,添加./configure --help時的協助顯示,非必須。--enable-qsv           enable codecs via Intel Media SDK
在EXTERNAL_LIBRARY_LIST變數中添加qsv,否則./configure --enable-qsv會提示沒有這個選項。另外,./configure會根據此產生config.h的#define CONFIG_QSV 1和config.mak的CONFIG_QSV=yes。
添加依賴關係,將qsvavc_decoder/qsvavc_encoder和--enable-qsv的配置項關聯起來。可以搜尋“libx264_encoder_deps”,在後面添加。qsvavc_decoder_deps="qsv"qsvavc_encoder_deps="qsv"qsvmpeg2_decoder_deps="qsv"qsvvc1_decoder_deps="qsv"
添加依賴庫的檢查。可以搜尋“enabled libx264”在後面添加。enabled qsv             && { check_lib mfxvideo.h MFXInit -lmfxhw64 -lva -lva-drm ||                               die "ERROR: Intel Media SDK not found"; }
5. configure時相關宏定義和環境變數的產生config.h#define CONFIG_QSV 1#define CONFIG_QSVAVC_DECODER 1#define CONFIG_QSVMPEG2_DECODER 1#define CONFIG_QSVVC1_DECODER 1#define CONFIG_BINTEXT_DECODER 1
config.makCONFIG_QSV=yesCONFIG_QSVAVC_DECODER=yesCONFIG_QSVMPEG2_DECODER=yesCONFIG_QSVVC1_DECODER=yesCONFIG_BINTEXT_DECODER=yes
$ALL_COMPONENTS -> $DECODER_LIST -> find_things() 通過sed提取allcodecs.c中的編碼解碼器,添加到$ALL_COMPONENTS列表中。
configure -> check_deps() $ALL_COMPONENTS 預設為yes -> do_check_deps()根據qsvavc_decoder_deps的依賴關係檢測,disable不符合依賴關係的。如qsvavc_decoder的依賴設定為qsvavc_decoder_deps="qsv",configure時不添加--enable-qsv參數,qsvavc_decoder的值先設定為yes,do_check_deps()時檢測不滿足依賴關係,將qsvavc_decoder的值改為no。
configure -> print_config() 讀取$ALL_COMPONENTS每項的值,在config.h或config.mak中產生相應的宏定義或環境變數。如qsvavc_decoder項的值為no,產生#define CONFIG_QSVAVC_DECODER 0,config.mak中的CONFIG_QSVAVC_DECODER=yes被注掉。map ‘eval echo "$v \${$v:-no}"‘ "[email protected]"
如果qsvavc_decoder_deps="qsv"沒有被正確添加,會產生#define CONFIG_QSVAVC_DECODER 1和CONFIG_QSVAVC_DECODER=yes,而導致相應模組被誤編譯,但關聯庫和標頭檔的搜尋路徑未添加,從而會導致編譯錯誤。





來自為知筆記(Wiz)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.