欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
ffplayer分析

 ffplayer分析

在《Ffplay視頻播放流程》文章中我給出了一個(gè)ffplay的函數調用關(guān)系圖,在分析代碼上會(huì )有不小的幫助。那么本文就詳細的描述如何從源碼中一步步的得到我們想要的函數調用關(guān)系圖。

前置條件

下載ffmpeg源碼

安裝graphviz:sudo>http://www.gson.org/egypt/

編譯整個(gè)ffmepg

我采用的是默認配置+直接編譯的方式,即./configure &&>ffmpeg$ makeCC ffplay.oLD ffplay_gCP ffplaySTRIP ffplay
我們從上述輸出中可以看到,編譯ffplay主要有四步:編譯(CC),鏈接(LD),重命名(CP),去除符號表操作(STRIP),其中編譯階段是我們重點(diǎn)要分析的,因為編譯是對源碼的直接分析和處理。

生成RTL文件

確定了需要在編譯ffplay的步驟后,我們在makefile中找到具體的編譯函數:

define COMPILE
       $(call $(1)DEP,$(1))
       $($(1)) $($(1)FLAGS) $($(1)_DEPFLAGS) $($(1)_C) $($(1)_O) $<
endef

因為是編譯ffplay.c文件,即此處的$(1)指的是CC,對應的$($(1)FLAGS)就是$(CCFLAGS),而CCFLAGS的定義中包含$(CFLAGS),即按照egypt中的說(shuō)明,我們在$(CFLAGS)的定義中添加-fdump-rtl-expand參數即可在make的時(shí)候成成RTL文件:

CFLAGS     += $(ECFLAGS) -fdump-rtl-expand
并且在COMPILE函數中將$($(1)FLAGS)的值打印出來(lái),那么再次修改ffplay.c并編譯后的輸出如下:

-I. -I./ -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -std=c99 -fomit-frame-pointer -pthread -D_GNU_SOURCE=1 -D_REENTRANT -I/usr/include/SDL -g -Wdeclaration-after-statement -Wall -Wno-parentheses -Wno-switch -Wno-format-zero-length -Wdisabled-optimization -Wpointer-arith -Wredundant-decls -Wno-pointer-sign -Wwrite-strings -Wtype-limits -Wundef -Wmissing-prototypes -Wno-pointer-to-int-cast -Wstrict-prototypes -O3 -fno-math-errno -fno-signed-zeros -fno-tree-vectorize -Werror=implicit-function-declaration -Werror=missing-prototypes -Werror=return-type -Werror=vla  -fdump-rtl-expand -D_GNU_SOURCE=1 -D_REENTRANT -I/usr/include/SDL
CC	ffplay.o
LD	ffplay_g
CP	ffplay
STRIP	ffplay

并且在當前目錄下生成ffplay.c.144r.expand文件,即我們需要的RTL文件。

生成DOT文件

生成完RTL文件后,我們可以使用現成的一個(gè)工具來(lái)分析它:egypt,具體命令如下:

egypt ffplay.c.144r.expand > ffplay.dot

生成函數調用圖

有了dot文件,使用graphviz提供的工具就可以直接生成圖形了:

dot ffplay.dot -Tpng -o ffplay.png
其中ffplay.dot是輸入文件,-Tpng表示生成png格式的文件,-o>

文件有點(diǎn)大,請自行保存下來(lái)進(jìn)行查看。

ffplay調用流程圖

去除編譯優(yōu)化

這個(gè)圖看上去有些奇怪,比如在main函數中非常顯眼的event_loop函數,哪里去了呢?

神奇之處就在于CFLAYGS中的-O3參數,gcc的man手冊中如是說(shuō):

[plain] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. -O3 Optimize yet more.  -O3 turns on all optimizations specified by -O2  
  2.     and also turns on the -finline-functions, -funswitch-loops,  
  3.     -fpredictive-commoning, -fgcse-after-reload, -ftree-vectorize and  
  4.     -fipa-cp-clone options.  
我們發(fā)現-O3是在-O2優(yōu)化的基礎上,又添加了一系列的優(yōu)化參數。那么同理,-O2優(yōu)化肯定也是在-O1優(yōu)化基礎上新增一些優(yōu)化參數。

因此,為了保持生成的RTL文件和源代碼保持一致性,我們去除所有的編譯優(yōu)化選項,即在config.mak文件中,從CFLAGS定義中刪除-O3字符串:

[plain] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. CFLAGS=   -std=c99 -fomit-frame-pointer -pthread -D_GNU_SOURCE=1 -D_REENTRANT -I/usr/include/SDL -g -Wdeclaration-after-statement -Wall -Wno-parentheses -Wno-switch -Wno-format-zero-length -Wdisabled-optimization -Wpointer-arith -Wredundant-decls -Wno-pointer-sign -Wwrite-strings -Wtype-limits -Wundef -Wmissing-prototypes -Wno-pointer-to-int-cast -Wstrict-prototypes <span style="color:#FF0000;"><del>-O3 </del></span>-fno-math-errno -fno-signed-zeros -fno-tree-vectorize -Werror=implicit-function-declaration -Werror=missing-prototypes -Werror=return-type -Werror=vla  
然后重新修改編譯ffplay.c,并生成RTL文件和png圖片。生成的圖形如下:

未優(yōu)化的函數調用流程圖

哇塞,通過(guò)這兩個(gè)圖形對比,我們發(fā)現編譯優(yōu)化選項做了多大的工作啊,或者說(shuō)原始代碼為了可閱讀行,是多么的爛??!

手動(dòng)調整

未優(yōu)化的函數調用關(guān)系圖太復雜了,在分析問(wèn)題時(shí),感覺(jué)有些老虎吃刺猬無(wú)處下嘴??!

那么我們就可以手動(dòng)打開(kāi)剛才處理RTL后生成的dot文件,比如去除一些孤立的點(diǎn),去除一些細節處理等等。最后,我們得到一個(gè)比較概要的函數調用關(guān)系圖。

函數調用關(guān)系概要圖

PS:和上述圖片對應的dot文件如下:

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
gcc警告選項匯總
GCC常用參數
談?wù)凮bjective警告
gcc編譯器參數
Xcode 警告消除小記
source insight 不能跳轉到函數 symblo not found
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久