ffmpeg 註冊編解碼器
學習資料
https://blog.csdn.net/u011686167/article/details/121723790
https://blog.csdn.net/ddddfang/article/details/89330895
針對FFMPEG 5.0版本,其它版本的軟體命名上會有差異。
註冊FFCodec
註冊管理
- libavcodec/codec_internal.h
- libavcodec/allcodecs.c
- libavcodec/codec.h 對外使用的標頭檔案,封裝了具體是應用介面, 關鍵資料結構 AVCodec
ffmpeg5.0在編譯時自動生成編解碼陣列。儲存在libavcodec\odec_list.c中,該檔案在編譯之後才會看到。
而且並非所有支援的編解碼器都會在該陣列中,取決於configure中是否開啟了對該編解碼的支援。
呼叫ff_thread_once單例執行緒進行註冊,只執行一次。在呼叫find_codec()方法時會呼叫av_codec_interate()完成註冊.
ffmpeg支援按照名字或者ID查詢支援的編解碼器,但最終都會呼叫av_codec_interate()來查詢編解碼陣列.
支援列表
在libavcodec/allcodecs.c中註冊目前支援的所有編解碼器。
以HEVC為例FFMPEG提供了包含mediacodec,v4l2,vaapi,videotoolbox在內的多種編解碼實現方式。
可以看到x265也是採用類似方式來支援的,目前x265只有編碼.
- extern FFCodec ff_libx265_encoder;
- extern const FFCodec ff_hevc_decoder;
- extern const FFCodec ff_hevc_qsv_decoder;
- extern const FFCodec ff_hevc_rkmpp_decoder;
- extern const FFCodec ff_hevc_v4l2m2m_decoder;
- extern const FFCodec ff_hevc_amf_encoder;
- extern const FFCodec ff_hevc_cuvid_decoder;
- extern const FFCodec ff_hevc_mediacodec_decoder;
- extern const FFCodec ff_hevc_mf_encoder;
- extern const FFCodec ff_hevc_nvenc_encoder;
- extern const FFCodec ff_hevc_qsv_encoder;
- extern const FFCodec ff_hevc_v4l2m2m_encoder;
- extern const FFCodec ff_hevc_vaapi_encoder;
- extern const FFCodec ff_hevc_videotoolbox_encoder;
新增編解碼器
以vaapi hevc encoder為例,在libavcodec目錄下有vaapi_encode_h265.c編碼器實現
最終以FFCodec結構體方式封裝實現相應的編碼功能.
以x265 encoder為例,在libavcodec目錄下有libx265.c
最終也是以FFCodec結構方式封裝實現相應的編碼功能
編譯配置
Makefile
libavcodec\Makefile加入對新增加的編解碼的編譯支援。如VAAPI HEVC和libx265
- OBJS-$(CONFIG_HEVC_VAAPI_ENCODER) += vaapi_encode_h265.o h265_profile_level.o
- OBJS-$(CONFIG_LIBX265_ENCODER) += libx265.o
configure
configure中加入新加編解碼的編譯選擇和編譯依賴. 如libx265
- --enable-libx265 enable HEVC encoding via x265 [no]
- libx265_encoder_deps="libx265"
註冊AVCodecParser
註冊管理:
- libavcodec/parsers.c 用於管理註冊AVCodecParser
- libavcodec/avcodec.h 關鍵資料結構和介面函式,這裡不區分內外
- libavcodec/parser.c 資料包解析的關鍵介面函式實現
- libavcodec/xxxx_parser.c 每一個支援的parser的具體實現
和編解碼一樣,AVCodecParser用於解析資料包,提供av_parser_iterate()來獲取指定的資料包解析,該方法位於libavcodec/parsers.c,
也是使用陣列進行儲存。這裡使用的是parser_list陣列,在編譯期自動生成保存於libavcodec/parser_list.c檔案, 該檔案也是在編譯之後才會看到。
在AVCodecParserContext *av_parser_init(int codec_id)函式中檢查是否支援codec_id, 如果支援再完成AVCodecParserContext分配以及parser初始化。
支援列表:
- extern const AVCodecParser ff_aac_parser;
- extern const AVCodecParser ff_aac_latm_parser;
- extern const AVCodecParser ff_ac3_parser;
- extern const AVCodecParser ff_adx_parser;
- extern const AVCodecParser ff_amr_parser;
- extern const AVCodecParser ff_av1_parser;
- extern const AVCodecParser ff_avs2_parser;
- extern const AVCodecParser ff_avs3_parser;
- extern const AVCodecParser ff_bmp_parser;
- extern const AVCodecParser ff_cavsvideo_parser;
- extern const AVCodecParser ff_cook_parser;
- extern const AVCodecParser ff_cri_parser;
- extern const AVCodecParser ff_dca_parser;
- extern const AVCodecParser ff_dirac_parser;
- extern const AVCodecParser ff_dnxhd_parser;
- extern const AVCodecParser ff_dolby_e_parser;
- extern const AVCodecParser ff_dpx_parser;
- extern const AVCodecParser ff_dvaudio_parser;
- extern const AVCodecParser ff_dvbsub_parser;
- extern const AVCodecParser ff_dvdsub_parser;
- extern const AVCodecParser ff_dvd_nav_parser;
- extern const AVCodecParser ff_flac_parser;
- extern const AVCodecParser ff_g723_1_parser;
- extern const AVCodecParser ff_g729_parser;
- extern const AVCodecParser ff_gif_parser;
- extern const AVCodecParser ff_gsm_parser;
- extern const AVCodecParser ff_h261_parser;
- extern const AVCodecParser ff_h263_parser;
- extern const AVCodecParser ff_h264_parser;
- extern const AVCodecParser ff_hevc_parser;
- extern const AVCodecParser ff_ipu_parser;
- extern const AVCodecParser ff_jpeg2000_parser;
- extern const AVCodecParser ff_mjpeg_parser;
- extern const AVCodecParser ff_mlp_parser;
- extern const AVCodecParser ff_mpeg4video_parser;
- extern const AVCodecParser ff_mpegaudio_parser;
- extern const AVCodecParser ff_mpegvideo_parser;
- extern const AVCodecParser ff_opus_parser;
- extern const AVCodecParser ff_png_parser;
- extern const AVCodecParser ff_pnm_parser;
- extern const AVCodecParser ff_rv30_parser;
- extern const AVCodecParser ff_rv40_parser;
- extern const AVCodecParser ff_sbc_parser;
- extern const AVCodecParser ff_sipr_parser;
- extern const AVCodecParser ff_tak_parser;
- extern const AVCodecParser ff_vc1_parser;
- extern const AVCodecParser ff_vorbis_parser;
- extern const AVCodecParser ff_vp3_parser;
- extern const AVCodecParser ff_vp8_parser;
- extern const AVCodecParser ff_vp9_parser;
- extern const AVCodecParser ff_webp_parser;
- extern const AVCodecParser ff_xbm_parser;
- extern const AVCodecParser ff_xma_parser;
註冊FFBitStreamFilter
註冊管理:
- libavcodec/bsf_internal.h 內部關鍵資料結構FFBitStreamFilter
- libavcodec/bitstream_filters.c 用於管理註冊FFBitStreamFilter
- libavcodec/bsf.h 對外使用的標頭檔案,封裝了具體是應用介面
- libavcodec/bsf.c 位元流濾波介面具體實現
和編解碼一樣,AVBitStreamFilter用於位元流濾波,提供av_bsf_iterate()來獲取指定的濾波器,該方法位於libavcodec/bitstream_filters.c,
也是使用陣列進行儲存。這裡使用的是bitstream_filters陣列,在編譯期自動生成保存於libavcodec/bsf_list.c檔案, 該檔案也是在編譯之後才會看到。
支援列表:
- extern const FFBitStreamFilter ff_aac_adtstoasc_bsf;
- extern const FFBitStreamFilter ff_av1_frame_merge_bsf;
- extern const FFBitStreamFilter ff_av1_frame_split_bsf;
- extern const FFBitStreamFilter ff_av1_metadata_bsf;
- extern const FFBitStreamFilter ff_chomp_bsf;
- extern const FFBitStreamFilter ff_dump_extradata_bsf;
- extern const FFBitStreamFilter ff_dca_core_bsf;
- extern const FFBitStreamFilter ff_dv_error_marker_bsf;
- extern const FFBitStreamFilter ff_eac3_core_bsf;
- extern const FFBitStreamFilter ff_extract_extradata_bsf;
- extern const FFBitStreamFilter ff_filter_units_bsf;
- extern const FFBitStreamFilter ff_h264_metadata_bsf;
- extern const FFBitStreamFilter ff_h264_mp4toannexb_bsf;
- extern const FFBitStreamFilter ff_h264_redundant_pps_bsf;
- extern const FFBitStreamFilter ff_hapqa_extract_bsf;
- extern const FFBitStreamFilter ff_hevc_metadata_bsf;
- extern const FFBitStreamFilter ff_hevc_mp4toannexb_bsf;
- extern const FFBitStreamFilter ff_imx_dump_header_bsf;
- extern const FFBitStreamFilter ff_mjpeg2jpeg_bsf;
- extern const FFBitStreamFilter ff_mjpega_dump_header_bsf;
- extern const FFBitStreamFilter ff_mp3_header_decompress_bsf;
- extern const FFBitStreamFilter ff_mpeg2_metadata_bsf;
- extern const FFBitStreamFilter ff_mpeg4_unpack_bframes_bsf;
- extern const FFBitStreamFilter ff_mov2textsub_bsf;
- extern const FFBitStreamFilter ff_noise_bsf;
- extern const FFBitStreamFilter ff_null_bsf;
- extern const FFBitStreamFilter ff_opus_metadata_bsf;
- extern const FFBitStreamFilter ff_pcm_rechunk_bsf;
- extern const FFBitStreamFilter ff_pgs_frame_merge_bsf;
- extern const FFBitStreamFilter ff_prores_metadata_bsf;
- extern const FFBitStreamFilter ff_remove_extradata_bsf;
- extern const FFBitStreamFilter ff_setts_bsf;
- extern const FFBitStreamFilter ff_text2movsub_bsf;
- extern const FFBitStreamFilter ff_trace_headers_bsf;
- extern const FFBitStreamFilter ff_truehd_core_bsf;
- extern const FFBitStreamFilter ff_vp9_metadata_bsf;
- extern const FFBitStreamFilter ff_vp9_raw_reorder_bsf;
- extern const FFBitStreamFilter ff_vp9_superframe_bsf;
- extern const FFBitStreamFilter ff_vp9_superframe_split_bsf;
2022-05-18