ffmpeg 原始碼簡單分析 : av_register_all()
此前寫了好幾篇ffmpeg原始碼分析文章,列表如下:
============================
前一陣子看了一下ffmpeg的原始碼,並且做了一些註釋,在此貼出來以作備忘。
本文分析一下ffmpeg註冊複用器,編碼器等的函式av_register_all()。該函式在所有基於ffmpeg的應用程式中幾乎都是第一個被呼叫的。只有呼叫了該函式,才能使用複用器,編碼器等。
可見解複用器註冊都是用
REGISTER_DEMUXER (X,x)
例如:
REGISTER_DEMUXER (AAC, aac)
可見複用器
註冊都是用REGISTER_MUXER (X,x))
例如:
REGISTER_MUXER (ADTS, adts)
既有解複用器又有複用器的話,可以用
REGISTER_MUXDEMUX (X,x));
例如:
REGISTER_MUXDEMUX (AC3, ac3);
我們來看一下巨集的定義,這裡以解複用器為例:
- #define REGISTER_DEMUXER(X,x) { \
- extern AVInputFormat ff_##x##_demuxer; \
-
if(CONFIG_##X##_DEMUXER) av_register_input_format(&ff_##x##_demuxer); }
注意:define裡面的##可能不太常見,它的含義就是拼接兩個字串,比如#define Conn(x,y) x##y
那麼
int n = Conn(123,456); 結果就是n=123456;
我們以REGISTER_DEMUXER (AAC, aac)為例,則它等效於
- extern AVInputFormat ff_aac_demuxer;
- if(CONFIG_AAC_DEMUXER) av_register_input_format(&ff_aac_demuxer);
從上面這段程式碼我們可以看出,真正註冊的函式是av_register_input_format(&ff_aac_demuxer),那我就看看這個和函式的作用,檢視一下av_register_input_format()的程式碼:
- void av_register_input_format(AVInputFormat *format)
- {
- AVInputFormat **p;
- p = &first_iformat;
- while (*p != NULL) p = &(*p)->next;
- *p = format;
- format->next = NULL;
- }
這段程式碼是比較容易理解的,首先先提一點,first_iformat是個什麼東東呢?其實它是Input Format連結串列的頭部地址,是一個全域性靜態變數,定義如下:
- /** head of registered input format linked list */
- static AVInputFormat *first_iformat = NULL;
至此REGISTER_DEMUXER (X, x)分析完畢。
同理,複用器道理是一樣的,只是註冊函式改為av_register_output_format();
既有解複用器又有複用器的話,有一個巨集定義:
- #define REGISTER_MUXDEMUX(X,x) REGISTER_MUXER(X,x); REGISTER_DEMUXER(X,x)
可見是分別註冊了複用器和解複用器。
此外還有網路協議的註冊,註冊函式為ffurl_register_protocol(),在此不再詳述。
下面貼出它的原始碼(allformats.c)
- /*
- *雷霄驊
- *[email protected]
- *中國傳媒大學/數字電視技術
- */
- /*
- * Register all the formats and protocols
- * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
- #include "avformat.h"
- #include "rtp.h"
- #include "rdt.h"
- #include "url.h"
- //定義的巨集?巨集的速度會快一點?註冊AVOutputFormat
- //define中,#用來把引數轉換成字串,##則用來連線前後兩個引數,把它們變成一個字串。
- //感覺有點像JAva中的EL,可以隨意拼接字串
- #define REGISTER_MUXER(X,x) { \
- extern AVOutputFormat ff_##x##_muxer; \
- if(CONFIG_##X##_MUXER) av_register_output_format(&ff_##x##_muxer); }
- //定義的巨集?巨集的速度會快一點?註冊AVInputFormat
- #define REGISTER_DEMUXER(X,x) { \
- extern AVInputFormat ff_##x##_demuxer; \
- if(CONFIG_##X##_DEMUXER) av_register_input_format(&ff_##x##_demuxer); }
- //註冊函式av_register_input_format
- //定義的巨集?巨集的速度會快一點?兩個一起註冊!
- #define REGISTER_MUXDEMUX(X,x) REGISTER_MUXER(X,x); REGISTER_DEMUXER(X,x)
- //定義的巨集?巨集的速度會快一點?註冊URLProtocol
- //extern URLProtocol ff_##x##_protocol;
- //在librtmp中,對應的就是ff_rtmp_protocol
- //這樣就把librtmp整合起來了
- //由此可見URLProtocol的名字是固定的
- #define REGISTER_PROTOCOL(X,x) { \
- extern URLProtocol ff_##x##_protocol; \
- if(CONFIG_##X##_PROTOCOL) ffurl_register_protocol(&ff_##x##_protocol, sizeof(ff_##x##_protocol)); }
- //註冊函式ffurl_register_protocol
- void av_register_all(void)
- {
- staticint initialized;
- if (initialized)
- return;
- initialized = 1;
- //註冊所有的codec
- avcodec_register_all();
- //註冊所有的MUXER(複用器和解複用器)
- /* (de)muxers */
- REGISTER_MUXER (A64, a64);
- REGISTER_DEMUXER (AAC, aac);
- REGISTER_MUXDEMUX (AC3, ac3);
- REGISTER_DEMUXER (ACT, act);
- REGISTER_DEMUXER (ADF, adf);
- REGISTER_MUXER (ADTS, adts);
- REGISTER_MUXDEMUX (ADX, adx);
- REGISTER_DEMUXER (AEA, aea);
- REGISTER_MUXDEMUX (AIFF, aiff);
- REGISTER_MUXDEMUX (AMR, amr);
- REGISTER_DEMUXER (ANM, anm);
- REGISTER_DEMUXER (APC, apc);
- REGISTER_DEMUXER (APE, ape);
- REGISTER_DEMUXER (APPLEHTTP, applehttp);
- REGISTER_MUXDEMUX (ASF, asf);
- REGISTER_MUXDEMUX (ASS, ass);
- REGISTER_MUXER (ASF_STREAM, asf_stream);
- REGISTER_MUXDEMUX (AU, au);
- REGISTER_MUXDEMUX (AVI, avi);
- REGISTER_DEMUXER (AVISYNTH, avisynth);
- REGISTER_MUXER (AVM2, avm2);
- REGISTER_DEMUXER (AVS, avs);
- REGISTER_DEMUXER (BETHSOFTVID, bethsoftvid);
- REGISTER_DEMUXER (BFI, bfi);
- REGISTER_DEMUXER (BINTEXT, bintext);
- REGISTER_DEMUXER (BINK, bink);
- REGISTER_MUXDEMUX (BIT, bit);
- REGISTER_DEMUXER (BMV, bmv);
- REGISTER_DEMUXER (C93, c93);
- REGISTER_MUXDEMUX (CAF, caf);
- REGISTER_MUXDEMUX (CAVSVIDEO, cavsvideo);
- REGISTER_DEMUXER (CDG, cdg);
- REGISTER_MUXER (CRC, crc);
- REGISTER_MUXDEMUX (DAUD, daud);
- REGISTER_DEMUXER (DFA, dfa);
- REGISTER_MUXDEMUX (DIRAC, dirac);
- REGISTER_MUXDEMUX (DNXHD, dnxhd);
- REGISTER_DEMUXER (DSICIN, dsicin);
- REGISTER_MUXDEMUX (DTS, dts);
- REGISTER_MUXDEMUX (DV, dv);
-
相關推薦
ffmpeg 原始碼簡單分析 : av_register_all()
此前寫了好幾篇ffmpeg原始碼分析文章,列表如下: ============================ 前一陣子看了一下ffmpeg的原始碼,並且做了一些註釋,在此貼出來以作備忘。 本文分析一下ffmpeg註冊
ffmpeg 原始碼簡單分析 : av_read_frame()
此前寫了好幾篇ffmpeg原始碼分析文章,列表如下: ============================ ffmpeg中的av_read_frame()的作用是讀取碼流中的音訊若干幀或者視訊一幀。例如,解碼視訊的時
FFmpeg原始碼簡單分析:makefile
=====================================================FFmpeg的庫函式原始碼分析文章列表:【架構圖】【通用】【解碼】【編碼】【其它】【指令碼】【H.264】================================
FFmpeg原始碼簡單分析:結構體成員管理系統-AVClass
=====================================================FFmpeg的庫函式原始碼分析文章列表:【架構圖】【通用】【解碼】【編碼】【其它】【指令碼】【H.264】================================
FFmpeg原始碼簡單分析:avcodec_open2()
=====================================================FFmpeg的庫函式原始碼分析文章列表:【架構圖】【通用】【解碼】【編碼】【其它】【指令碼】【H.264】================================
FFmpeg原始碼簡單分析:avformat_close_input()
=====================================================FFmpeg的庫函式原始碼分析文章列表:【架構圖】【通用】【解碼】【編碼】【其它】【指令碼】【H.264】================================
FFmpeg原始碼簡單分析:av_write_frame()
=====================================================FFmpeg的庫函式原始碼分析文章列表:【架構圖】【通用】【解碼】【編碼】【其它】【指令碼】【H.264】================================
FFmpeg原始碼簡單分析:常見結構體的初始化和銷燬(AVFormatContext,AVFrame等)
=====================================================FFmpeg的庫函式原始碼分析文章列表:【架構圖】【通用】【解碼】【編碼】【其它】【指令碼】【H.264】================================
FFmpeg原始碼簡單分析:記憶體的分配和釋放(av_malloc()、av_free()等)
=====================================================FFmpeg的庫函式原始碼分析文章列表:【架構圖】【通用】【解碼】【編碼】【其它】【指令碼】【H.264】================================
FFmpeg原始碼簡單分析:avcodec_encode_video()
=====================================================FFmpeg的庫函式原始碼分析文章列表:【架構圖】【通用】【解碼】【編碼】【其它】【指令碼】【H.264】================================
FFmpeg原始碼簡單分析:configure
=====================================================FFmpeg的庫函式原始碼分析文章列表:【架構圖】【通用】【解碼】【編碼】【其它】【指令碼】【H.264】================================
FFmpeg的H.264解碼器原始碼簡單分析:概述
=====================================================H.264原始碼分析文章列表:【編碼 - x264】【解碼 - libavcodec H.264 解碼器】================================
FFmpeg的HEVC解碼器原始碼簡單分析:CTU解碼(CTU Decode)部分-TU
=====================================================HEVC原始碼分析文章列表:【解碼 -libavcodec HEVC 解碼器】==============================================
FFmpeg的H.264解碼器原始碼簡單分析:解碼器主幹部分
=====================================================H.264原始碼分析文章列表:【編碼 - x264】【解碼 - libavcodec H.264 解碼器】================================
FFmpeg的H.264解碼器原始碼簡單分析:熵解碼(Entropy Decoding)部分
=====================================================H.264原始碼分析文章列表:【編碼 - x264】【解碼 - libavcodec H.264 解碼器】================================
H264編碼器5( x264原始碼簡單分析:x264_slice_write() 與H264 編碼簡介)
x264原始碼簡單分析:x264_slice_write() 來自:https://blog.csdn.net/leixiaohua1020/article/details/45536607 H264 編碼簡介 https://blo
H264編碼器4( x264原始碼簡單分析:概述)
來自:https://blog.csdn.net/leixiaohua1020/article/details/45536607 ===================================================== H.264原始碼分析文章列表:
FFmpeg原始碼簡單分析 avio open2
=====================================================FFmpeg的庫函式原始碼分析文章列表:【架構圖】【通用】【解碼】【編碼】【其它】【指令碼】【H.264】=================================
FFmpeg原始碼簡單分析 avcodec encode video
=====================================================FFmpeg的庫函式原始碼分析文章列表:【架構圖】【通用】【解碼】【編碼】【其它】【指令碼】【H.264】=================================
FFmpeg源代碼簡單分析:常見結構體的初始化和銷毀(AVFormatContext,AVFrame等)
new init _array border 代碼 alloc ecc .com VC 結構體 初始化 銷毀 AVFormatContext avformat_alloc_context() avfo