1. 程式人生 > >參照ffmpeg重新寫makefile檔案提取prores編解碼庫

參照ffmpeg重新寫makefile檔案提取prores編解碼庫

我們知道,ffmpeg原始碼是在linux底下開發出來的,而如果我們要在windows底下進行ffmpeg相關程式碼的修改和優化的話,則是需要藉助mingw,mingw中提供了msys編譯環境,這樣的話,你修改和優化後的ffmpeg程式碼如果要在windows下應用的話,則可以通過編譯生成相關的dll和lib庫進行引用,達到最大化利用ffmpeg效能的目的。

接下來,以自己近期做的prores編解碼器程式碼修改優化部分過程為例,來說明下如何在windows平臺上通過重寫makefile檔案,重新編譯生成新的prores編解碼庫。有的人可能會問,為什麼不直接在vs2013平臺上進行修改並編譯好庫,這樣不也可以編譯得到相應的dll和lib庫嗎?當然是可以的,不過由於visual studio平臺在編譯ffmpeg部分程式碼過程中並不支援部分編譯選項,比如AT&T彙編優化,因此在visual studio平臺上編譯出的庫也就不支援AT&T彙編優化,從而影響了ffmpeg進行相關流媒體處理的效能。那可能又有一部分人會問,那你直接在linux上進行開發不就行了麼?當然也是可以的,只是筆者習慣了在windows下進行開發,雖說筆者電腦上也裝了一個linux的虛擬機器,不過老是切來切去的也不方便,所以乾脆就直接在mingw上倒騰了,反正功能和linux基本一樣。

好了,接下來開始上乾貨了。。。

1、  先上ffmpeg官網下載ffmpeg原始碼,分別在library.mak和common.mak的圖1和圖2位置處增加這兩條語句:echo-e "$(YASM) $(YASMFLAGS) -I $(<D)/ -o [email protected]$<\n">>asmout.log和echo -e "$($(1)) $($(1)FLAGS) $($(1)_DEPFLAGS) $($(1)_C)$($(1)_O) $<\n">>output.log,然後分別採用mingw 32位和64位,按32位和64位編譯得到dll和lib庫,其中32位的configure選項為:./configure–enable-shared, 64位的configure選項為:./configure –arch=x86-64 –enable-shared,編譯完成後,可以在libavutil,libavcodec等資料夾中看到各個.c文件被編譯得到了.o和.d檔案,其中.d檔案就是代表把這個.c文件編譯成.o文件需要的依賴檔案。比如,我這裡修改優化後需要編譯的有proresdec2.c文件,那麼我們可以檢視proresdec2.d檔案中的依賴文件有哪些,如下圖3


圖1


圖2


圖3

接下來儲存好ffmpeg一級目錄下的config.h以及config.asm兩個檔案,將32位和64位下分別編譯得到的這兩個config檔案分別儲存到config_x86和config_x64中。

2、  在vs2013中,新建兩個工程,這裡我自己命名為BaseLib和 ProResCodec,將步驟一後得到的ffmpeg重新make clean一下,然後將ffmpeg中的libavutil和libavcodec兩個原始碼資料夾複製到自己的vs工程目錄下,並在兩個工程屬性中,將libavutil和libavcodec中標頭檔案全部包含進去。接下來重新利用vs編譯器和msys一起編譯ffmpeg,此時32位的configure選項為:./configure –enable-shared –toolchain=msvc, 64位的configure選項為:./configure–arch=x86-64 –enable-shared –toolchain=msvc,重新編譯後,可得到新的config.h和config.asm,將32位和64位下分別編譯得到的這兩個config檔案分別儲存到config_x86和config_x64中,將這兩個資料夾也複製到vs工程目錄下,並根據不同的vs平臺包含進專案BaseLib和ProResCodec中去。將proresdec2.c文件加入到ProResCodec工程,編譯連結,發現有些函式沒有定義或者連結不了,肯定還需要其他.c檔案加入進來,根據函式名在libavutil和libavcodec資料夾中查詢,逐個將相應的.c檔案加入,直至最後兩個工程專案都可以完全編譯連結通過。

這一步主要是為了下一步進行makefile編寫時需要哪些檔案加入mingw編譯提供參考。

3、  參考網路資料《跟我一起學makefile》(http://blog.csdn.net/haoel/article/details/2886/)資料,熟悉makefile書寫規則和一般技巧。重新建立新的資料夾,將第一步中得到的config_x86和config_x64資料夾複製到新的資料夾目錄下,且將ffmpeg中的原始碼資料夾libavutil和libavcodec複製到新的資料夾目錄下,分別在兩個資料夾中新建makefile文件,根據步驟二中的兩個專案BaseLib和ProResCodec下分別包含的.c檔案分別書寫libavutil和libavcodec中的兩個makefile檔案,其中我自己32位的兩個makefile檔案參考如下:

Libavutil中makefile:

vpath %.c ../compat/msvcrt:../compat:x86
vpath %.h ../config:../:../compat/msvcrt:x86

define_macro = -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1 \
								-D__printf__=__gnu_printf__ -DHAVE_AV_CONFIG_H -std=c99 -fomit-frame-pointer -I/mingw/include/SDL -D_GNU_SOURCE=1 \
								-Dmain=SDL_main -g -Wdeclaration-after-statement -Wall -Wdisabled-optimization -Wpointer-arith -Wredundant-decls \
								-Wwrite-strings -Wtype-limits -Wundef -Wmissing-prototypes -Wno-pointer-to-int-cast -Wstrict-prototypes -Wno-parentheses \
								-Wno-switch -Wno-format-zero-length -Wno-pointer-sign -O3 -fno-math-errno -fno-signed-zeros -fno-tree-vectorize \
								-Werror=return-type -Werror=vla -Wno-maybe-uninitialized  -MMD \
								

objectlist = avstring.o \
							bprint.o \
							buffer.o \
							channel_layout.o \
							cpu.o \
							dict.o \
							error.o \
							eval.o \
							fifo.o \
							file_open.o \
							frame.o \
							imgutils.o \
							intmath.o \
							log.o \
							log2_tab.o \
							mathematics.o \
							mem.o \
							opt.o \
							parseutils.o \
							pixdesc.o \
							random_seed.o \
							rational.o \
							samplefmt.o \
							sha.o \
							snprintf.o \
							strtod.o \
							time.o \
							utils.o \
							x86/cpu.o \
							x86/cpuid.o \
							x86/emms.o \
							#x86/float_dsp.o \
							#x86/float_dsp_init.o \
							#x86/lls.o \
							#x86/lls_init.o \
							#x86/x86inc.o \
							#x86/x86util.o

dll : $(objectlist)
	gcc -shared -o BaseLib.dll $(objectlist) -Wl,--out-implib,BaseLib.a -O3
def : $(objectlist)
	dlltool -z BaseLib.def --export-all-symbols $(objectlist)
lib : $(objectlist)
	dlltool -k --dllname BaseLib.dll --output-lib BaseLib.lib --def BaseLib.def


avstring.o :  avstring.c
	gcc -c avstring.c -I../config -I.. $(define_macro)
bprint.o : bprint.c
	gcc -c bprint.c -I../config -I../ $(define_macro)
buffer.o : buffer.c
	gcc -c buffer.c -I../config -I../ $(define_macro)
channel_layout.o : channel_layout.c
	gcc -c channel_layout.c -I../config -I../ $(define_macro)
cpu.o : cpu.c
	gcc -c cpu.c -I../config -I../ $(define_macro)
dict.o : dict.c
	gcc -c dict.c -I../config -I../ $(define_macro)
error.o : error.c
	gcc -c error.c -I../config -I../ $(define_macro)
eval.o : eval.c
	gcc -c eval.c -I../config -I../ $(define_macro)
fifo.o : fifo.c
	gcc -c fifo.c -I../config -I../ $(define_macro)
file_open.o : file_open.c
	gcc -c file_open.c -I../config -I../ $(define_macro)
frame.o : frame.c
	gcc -c frame.c -I../config -I../ $(define_macro)
imgutils.o : imgutils.c
	gcc -c imgutils.c -I../config -I../ $(define_macro)
intmath.o : intmath.c
	gcc -c intmath.c -I../config -I../ $(define_macro)
log.o : log.c
	gcc -c log.c -I../config -I../ $(define_macro)
log2_tab.o : log2_tab.c
	gcc -c log2_tab.c -I../config -I../ $(define_macro)
mathematics.o : mathematics.c
	gcc -c mathematics.c -I../config -I../ $(define_macro)
mem.o : mem.c
	gcc -c mem.c -I../config -I../ $(define_macro)
opt.o : opt.c
	gcc -c opt.c -I../config -I../ $(define_macro)
parseutils.o : parseutils.c
	gcc -c parseutils.c -I../config -I../ $(define_macro)
pixdesc.o : pixdesc.c
	gcc -c pixdesc.c -I../config -I../ $(define_macro)
random_seed.o : random_seed.c internal.h
	gcc -c random_seed.c -I../config -I../ $(define_macro)
rational.o : rational.c
	gcc -c rational.c -I../config -I../ $(define_macro)
samplefmt.o : samplefmt.c
	gcc -c samplefmt.c -I../config -I../ $(define_macro)
sha.o : sha.c
	gcc -c sha.c -I../config -I../ $(define_macro)
snprintf.o : snprintf.c
	gcc -c snprintf.c -o snprintf.o -I../ $(define_macro)
strtod.o : strtod.c 
	gcc -c strtod.c -o strtod.o -I../ $(define_macro)
time.o : time.c
	gcc -c time.c -I../config -I../ $(define_macro)
utils.o : utils.c
	gcc -c utils.c -I../config -I../ $(define_macro)
x86/cpu.o : x86/cpu.c
	gcc -o x86/cpu.o -c x86/cpu.c -I../ -I../config $(define_macro)

x86/cpuid.o : x86/cpuid.asm
	yasm -o x86/cpuid.o x86/cpuid.asm -I../config -P config.asm -I../ -f win32 -DPREFIX -O3
x86/emms.o : x86/emms.asm
	yasm -o x86/emms.o x86/emms.asm -I../config -P config.asm -I../ -f win32 -DPREFIX -O3
#x86/float_dsp.o : x86/float_dsp.asm
	#yasm -o x86/float_dsp.o x86/float_dsp.asm -I../config -P config.asm -I../ -f win32 -DPREFIX -O3
#x86/float_dsp_init.o : x86/float_dsp_init.c
	#gcc -std=c99 -o x86/float_dsp_init.o -c x86/float_dsp_init.c -I../ -I../config -O3
#x86/lls.o : x86/lls.asm
	#yasm -o x86/lls.o x86/lls.asm -I../config -P config.asm -I../ -f win32 -DPREFIX -O3
#x86/lls_init.o : x86/lls_init.c
	#gcc -o x86/lls_init.o -c x86/lls_init.c -I../ -I../config -O3
#x86/x86inc.o : x86/x86inc.asm
	#yasm -o x86/x86inc.o x86/x86inc.asm -I../config -P config.asm -I../ -f win32 -DPREFIX -O3
#x86/x86util.o : x86/x86util.asm
	#yasm -o x86/x86util.o x86/x86util.asm -I../config -P config.asm -I../ -f win32 -DPREFIX -O3

.PHONY : ALL 
all : dll def lib
clean :
	-rm BaseLib.dll BaseLib.a BaseLib.def BaseLib.lib *.o *.d x86/*.o x86/*.d


Libavcodec中makefile:

define_macro = -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1 \
								-D__printf__=__gnu_printf__ -DHAVE_AV_CONFIG_H -std=c99 -fomit-frame-pointer -I/mingw/include/SDL -D_GNU_SOURCE=1 \
								-Dmain=SDL_main -g -Wdeclaration-after-statement -Wall -Wdisabled-optimization -Wpointer-arith -Wredundant-decls \
								-Wwrite-strings -Wtype-limits -Wundef -Wmissing-prototypes -Wno-pointer-to-int-cast -Wstrict-prototypes -Wno-parentheses \
								-Wno-switch -Wno-format-zero-length -Wno-pointer-sign -O3 -fno-math-errno -fno-signed-zeros -fno-tree-vectorize \
								-Werror=return-type -Werror=vla -Wno-maybe-uninitialized  -MMD \

objectlist = avpacket.o \
							codec_desc.o \
							dsputil.o \
							error_resilience.o \
							faandct.o \
							faanidct.o \
							frame_thread_encoder.o \
							h261.o \
							h261data.o \
							h263.o \
							h264chroma.o \
							h264qpel.o \
							hpeldsp.o \
							imgconvert.o \
							jfdctfst.o \
							jfdctint.o \
							jrevdct.o \
							mathtables.o \
							mpeg4video.o \
							mpegvideo.o \
							mpegvideo_motion.o \
							msmpeg4data.o \
							options.o \
							proresregister.o \
							proresdata.o \
							proresdec_lgpl.o \
							proresdec2.o \
							proresdsp.o \
							proresenc_anatoliy.o \
							proresenc_kostya.o \
							pthread.o \
							pthread_frame.o \
							pthread_slice.o \
							simple_idct.o \
							snow.o \
							snow_dwt.o \
							utils.o \
							videodsp.o \
							wmv2.o \
							wmv2dsp.o \
							x86/constants.o \
							x86/deinterlace.o \
							x86/diracdsp_yasm.o \
							x86/dsputil.o \
							x86/dsputil_init.o \
							x86/dsputil_mmx.o \
							x86/dsputil_x86.o \
							x86/dsputilenc.o \
							x86/dsputilenc_mmx.o \
							x86/fdct.o \
							x86/fpel.o \
							x86/fpel_mmx.o \
							x86/h264_chromamc.o \
							x86/h264_chromamc_10bit.o \
							x86/h264_deblock.o \
							x86/h264_deblock_10bit.o \
							x86/h264_qpel.o \
							x86/h264_qpel_8bit.o \
							x86/h264_qpel_10bit.o \
							x86/h264chroma_init.o \
							x86/hpeldsp.o \
							x86/hpeldsp_init.o \
							x86/hpeldsp_mmx.o \
							x86/idct_mmx_xvid.o \
							x86/idct_sse2_xvid.o \
							x86/motion_est.o \
							x86/mpeg4qpel.o \
							x86/mpegvideo.o \
							x86/proresdsp_init.o \
							x86/qpel.o \
							x86/rnd_mmx.o \
							x86/simple_idct.o \
							x86/snowdsp.o \
							x86/videodsp.o \
							x86/videodsp_init.o \

							
dll : $(objectlist)
	gcc -shared -o ProResCodec.dll $(objectlist) -Wl,--out-implib,ProResCodec.a -L../libavutil -lBaseLib -L../lib -llibiconv-2 -O3
def : $(objectlist)
	dlltool -z ProResCodec.def --export-all-symbols $(objectlist)
lib : $(objectlist)
	dlltool -k --dllname ProResCodec.dll --output-lib ProResCodec.lib --def ProResCodec.def

avpacket.o : avpacket.c
	gcc -c avpacket.c -I../config -I../ $(define_macro)
codec_desc.o : codec_desc.c
	gcc -c codec_desc.c -I../config -I../ $(define_macro)
dsputil.o : dsputil.c dsputil.h dsputil_template.c bit_depth_template.c
	gcc -std=c99 -c dsputil.c -I../config -I../ $(define_macro)
error_resilience.o : error_resilience.c
	gcc -c error_resilience.c -I../config -I../ $(define_macro)
faandct.o : faandct.c
	gcc -c faandct.c -I../config -I../ $(define_macro)
faanidct.o : faanidct.c
	gcc -c faanidct.c -I../config -I../ $(define_macro)
frame_thread_encoder.o : frame_thread_encoder.c
	gcc -c frame_thread_encoder.c -I../config -I../ $(define_macro)
h261.o : h261.c
	gcc -c h261.c -I../config -I../ $(define_macro)
h261data.o : h261data.c
	gcc -c h261data.c -I../config -I../ $(define_macro)
h263.o : h263.c
	gcc -c h263.c -I../config -I../ $(define_macro)
h264chroma.o : h264chroma.c
	gcc -c h264chroma.c -I../config -I../ $(define_macro)
h264qpel.o : h264qpel.c
	gcc -c h264qpel.c -I../config -I../ $(define_macro)
hpeldsp.o : hpeldsp.c
	gcc -c hpeldsp.c -I../config -I../ $(define_macro)
imgconvert.o : imgconvert.c
	gcc -c imgconvert.c -I../config -I../ $(define_macro)
jfdctfst.o : jfdctfst.c
	gcc -c jfdctfst.c -I../config -I../ $(define_macro)
jfdctint.o : jfdctint.c
	gcc -c jfdctint.c -I../config -I../ $(define_macro)
jrevdct.o : jrevdct.c
	gcc -c jrevdct.c -I../config -I../ $(define_macro)
mathtables.o : mathtables.c
	gcc -c mathtables.c -I../config -I../ $(define_macro)
mpeg4video.o : mpeg4video.c
	gcc -c mpeg4video.c -I../config -I../ $(define_macro)
mpegvideo.o : mpegvideo.c
	gcc -c mpegvideo.c -I../config -I../ $(define_macro)
mpegvideo_motion.o : mpegvideo_motion.c
	gcc -c mpegvideo_motion.c -I../config -I../ $(define_macro)
msmpeg4data.o : msmpeg4data.c
	gcc -c msmpeg4data.c -I../config -I../ $(define_macro)
options.o : options.c
	gcc -c options.c -I../config -I../ $(define_macro)
proresregister.o : proresregister.c
	gcc -c proresregister.c -I../config -I../ $(define_macro)
proresdata.o : proresdata.c
	gcc -c proresdata.c -I../config -I../ $(define_macro)
proresdec_lgpl.o : proresdec_lgpl.c
	gcc -c proresdec_lgpl.c -I../config -I../ $(define_macro)
proresdec2.o : proresdec2.c
	gcc -c proresdec2.c -I../config -I../ $(define_macro)
proresdsp.o : proresdsp.c
	gcc -c proresdsp.c -I../config -I../ $(define_macro)
proresenc_anatoliy.o : proresenc_anatoliy.c
	gcc -c proresenc_anatoliy.c -I../config -I../ $(define_macro)
proresenc_kostya.o : proresenc_kostya.c
	gcc -c proresenc_kostya.c -I../config -I../ $(define_macro)
pthread.o : pthread.c
	gcc -c pthread.c -I../config -I../ $(define_macro)
pthread_frame.o : pthread_frame.c
	gcc -c pthread_frame.c -I../config -I../ $(define_macro)
pthread_slice.o : pthread_slice.c
	gcc -c pthread_slice.c -I../config -I../ $(define_macro)
simple_idct.o : simple_idct.c
	gcc -c simple_idct.c -I../config -I../ $(define_macro)
snow.o : snow.c
	gcc -c snow.c -I../config -I../ $(define_macro)
snow_dwt.o : snow_dwt.c
	gcc -c snow_dwt.c -I../config -I../ $(define_macro)
utils.o : utils.c
	gcc -std=c99 -c utils.c -I../config -I../ $(define_macro)
videodsp.o : videodsp.c
	gcc -c videodsp.c -I../config -I../ $(define_macro)
wmv2.o : wmv2.c
	gcc -c wmv2.c -I../config -I../ $(define_macro)
wmv2dsp.o : wmv2dsp.c
	gcc -c wmv2dsp.c -I../config -I../ $(define_macro)
	
x86/constants.o : x86/constants.c
	gcc -o x86/constants.o -c x86/constants.c -I../config -I../ -O3
x86/deinterlace.o : x86/deinterlace.asm
	yasm -o x86/deinterlace.o x86/deinterlace.asm -I../config -P config.asm -I../ -f win32 -DPREFIX -O3
x86/diracdsp_yasm.o : x86/diracdsp_yasm.asm
	yasm -o x86/diracdsp_yasm.o x86/diracdsp_yasm.asm -I../config -P config.asm -I../ -f win32 -DPREFIX -O3
x86/dsputil.o : x86/dsputil.asm
	yasm -o x86/dsputil.o x86/dsputil.asm -I../config -P config.asm -I../ -f win32 -DPREFIX -O3
x86/dsputil_init.o : x86/dsputil_init.c
	gcc -o x86/dsputil_init.o -c x86/dsputil_init.c -I../config -I../ -O3
x86/dsputilenc.o : x86/dsputilenc.asm
	yasm -o x86/dsputilenc.o x86/dsputilenc.asm -I../config -P config.asm -I../ -f win32 -DPREFIX -O3
x86/dsputilenc_mmx.o : x86/dsputilenc_mmx.c
	gcc -o x86/dsputilenc_mmx.o -c x86/dsputilenc_mmx.c -I../config -I../ -O3
x86/fpel.o : x86/fpel.asm
	yasm -o x86/fpel.o x86/fpel.asm -I../config -P config.asm -I../ -f win32 -DPREFIX -O3
x86/fpel_mmx.o : x86/fpel_mmx.c
	gcc -o x86/fpel_mmx.o -c x86/fpel_mmx.c -I../config -I../ -O3
x86/h264_chromamc.o : x86/h264_chromamc.asm
	yasm -o x86/h264_chromamc.o x86/h264_chromamc.asm -I../config -P config.asm -I../ -f win32 -DPREFIX -O3
x86/h264_chromamc_10bit.o : x86/h264_chromamc_10bit.asm
	yasm -o x86/h264_chromamc_10bit.o x86/h264_chromamc_10bit.asm -I../config -P config.asm -I../ -f win32 -DPREFIX -O3
x86/h264_deblock.o : x86/h264_deblock.asm
	yasm -o x86/h264_deblock.o x86/h264_deblock.asm -I../config -P config.asm -I../ -f win32 -DPREFIX -O3
x86/h264_deblock_10bit.o : x86/h264_deblock_10bit.asm
	yasm -o x86/h264_deblock_10bit.o x86/h264_deblock_10bit.asm -I../config -P config.asm -I../ -f win32 -DPREFIX -O3
x86/h264_qpel.o : x86/h264_qpel.c
	gcc -o x86/h264_qpel.o -c x86/h264_qpel.c -I../config -I../ -O3
x86/h264_qpel_8bit.o : x86/h264_qpel_8bit.asm
	yasm -o x86/h264_qpel_8bit.o x86/h264_qpel_8bit.asm -I../config -P config.asm -I../ -f win32 -DPREFIX -O3
x86/h264_qpel_10bit.o : x86/h264_qpel_10bit.asm
	yasm -o x86/h264_qpel_10bit.o x86/h264_qpel_10bit.asm -I../config -P config.asm -I../ -f win32 -DPREFIX -O3
x86/h264chroma_init.o : x86/h264chroma_init.c
	gcc -o x86/h264chroma_init.o -c x86/h264chroma_init.c -I../config -I../ -O3
x86/hpeldsp.o : x86/hpeldsp.asm
	yasm -o x86/hpeldsp.o x86/hpeldsp.asm -I../config -P config.asm -I../ -f win32 -DPREFIX -O3
x86/hpeldsp_init.o : x86/hpeldsp_init.c
	gcc -o x86/hpeldsp_init.o -c x86/hpeldsp_init.c -I../config -I../ -O3
x86/motion_est.o : x86/motion_est.c
	gcc -o x86/motion_est.o -c x86/motion_est.c -I../config -I../ -O3
x86/mpeg4qpel.o : x86/mpeg4qpel.asm
	yasm -o x86/mpeg4qpel.o x86/mpeg4qpel.asm -I../config -P config.asm -I../ -f win32 -DPREFIX -O3
x86/mpegvideo.o : x86/mpegvideo.c
	gcc -o x86/mpegvideo.o -c x86/mpegvideo.c -I../config -I../ -O3
x86/proresdsp_init.o : x86/proresdsp_init.c
	gcc -o x86/proresdsp_init.o -c x86/proresdsp_init.c -I../config -I../ -O3
x86/qpel.o : x86/qpel.asm
	yasm -o x86/qpel.o x86/qpel.asm -I../config -P config.asm -I../ -f win32 -DPREFIX -O3
x86/snowdsp.o : x86/snowdsp.c
	gcc -o x86/snowdsp.o -c x86/snowdsp.c -I../config -I../ -O3
x86/videodsp.o : x86/videodsp.asm
	yasm -o x86/videodsp.o x86/videodsp.asm -I../config -P config.asm -I../ -f win32 -DPREFIX -O3
x86/videodsp_init.o : x86/videodsp_init.c
	gcc -o x86/videodsp_init.o -c x86/videodsp_init.c -I../config -I../ -O3
x86/dsputil_mmx.o : x86/dsputil_mmx.c
	gcc -o x86/dsputil_mmx.o -c x86/dsputil_mmx.c -I../config -I../ -O3
x86/idct_mmx_xvid.o : x86/idct_mmx_xvid.c
	gcc -o x86/idct_mmx_xvid.o -c x86/idct_mmx_xvid.c -I../config -I../ -O3
x86/idct_sse2_xvid.o : x86/idct_sse2_xvid.c
	gcc -o x86/idct_sse2_xvid.o -c x86/idct_sse2_xvid.c -I../config -I../	-O3
x86/simple_idct.o : x86/simple_idct.c
	gcc -o x86/simple_idct.o -c x86/simple_idct.c -I../config -I../ -O3
x86/fdct.o : x86/fdct.c
	gcc -o x86/fdct.o -c x86/fdct.c -I../config -I../ -O3
x86/hpeldsp_mmx.o : x86/hpeldsp_mmx.c
	gcc -o x86/hpeldsp_mmx.o -c x86/hpeldsp_mmx.c -I../config -I../ -O3
x86/dsputil_x86.o : x86/dsputil_x86.c
	gcc -o x86/dsputil_x86.o -c x86/dsputil_x86.c -I../config -I../ -O3
x86/rnd_mmx.o : x86/rnd_mmx.c
	gcc -o x86/rnd_mmx.o -c x86/rnd_mmx.c -I../config -I../ -O3


.PHONY : ALL 
all : dll def lib
clean :
	-rm ProResCodec.dll ProResCodec.a ProResCodec.def ProResCodec.lib *.o *.d x86/*.o

其中define_macro就是在第一步中output.log中打印出的編譯選項,而x86資料夾下的.c檔案的編譯選項則是在asmout.log中打印出的編譯選項。

4、  最後,在libavutil和libavcodec同級目錄下,再新建一個makefile檔案,用於先後引導libavutil和libavcodec中的兩個makefile編譯,具體makefile內容如下:

MAKE := make all
CLEAN := make clean
INSTALLDIR := OutDll
LIBDLL := libavutil/BaseLib.lib libavutil/BaseLib.dll libavcodec/ProResCodec.lib libavcodec/ProResCodec.dll

all : 
	cd libavutil && $(MAKE)
	cd libavcodec && $(MAKE)
clean :
	cd libavutil && $(CLEAN)
	cd libavcodec && $(CLEAN)
install :
	cp $(LIBDLL) $(INSTALLDIR)
.PHONY : all clean 

5、  我的各層級的目錄關係如下圖4:


圖4

以上是我優化修改prores編解碼器的第一步,編譯出的prores編解碼庫相比開始的ffmpeg編解碼庫要小很多,因為這裡只需要prores編解碼功能,關於後續具體如何修改,優化,精細提取prores編解碼器,這裡不做詳解,有興趣的也可以私信給我,歡迎批評指正~

相關推薦

參照ffmpeg重新makefile檔案提取prores解碼

我們知道,ffmpeg原始碼是在linux底下開發出來的,而如果我們要在windows底下進行ffmpeg相關程式碼的修改和優化的話,則是需要藉助mingw,mingw中提供了msys編譯環境,這樣的話,你修改和優化後的ffmpeg程式碼如果要在windows下應用的話,則

java 按位元組讀二進位制檔案(Base64編碼解碼

最近在做專案時遇到這樣一個需求:依次讀取本地資料夾裡所有檔案的內容,轉為JSON,傳送到ActiveMQ的訊息佇列, 然後從MQ的訊息佇列上獲取檔案的資訊,依次寫到本地。常見的檔案型別,比如.txt 和.png等檔案的讀寫並不難。但是,我剛才所提到的需求,如果用常規的方法去讀寫,比如按位元組讀取檔案內容

FFmpeg視頻解碼,無法解析的外部符號、找不到inttypes.h文件的問題

detail program targe image types lib 包含 mage 程序 ffmpeg報錯,link2019,無法解析的外部符號。 以下嘗試: 在檢查 包含目錄、庫目錄、鏈接器輸入和系統環境變量 均設置無誤的情況下,包含的文件要寫成以下形式: ex

對Apple ProRes解碼器的學習

        Apple ProRes編解碼器可以充分利用多核處理,並具有快速、降低解析度的解碼模式,而且都支援全解析度的任意幀尺寸(SD、HD、2K、4K和5K),其對每一幀都是獨立於任何其他幀進行編碼解碼的,這樣可以提供最佳編輯效能和靈活性。 A

Android 引入 FFMpeg 並列印解碼

在編譯完 Android 平臺下的 FFMpeg 庫之後,我們接下來接入到 AndroidStudio 工程中。我們驗證的目的是想在 AndroidStudio 控制檯中列印 FFMpeg 所有支援的編解碼庫資訊,下面我們來一步一步的實現這個過程。 要完成這個功能主要有以下 2 步:

樹莓派x264和ffmpeg編譯(用於支援GPU硬體解碼

FFmpeg是一套開源的音視訊編解碼庫,有非常強大的功能,包括視訊採集功能、視訊格式轉換等。視訊編解碼是一個非常消耗系統資源的過程,而樹莓派自帶了H.264的硬體編解碼器,本文講介紹在樹莓派上配置FFmpeg使其支援硬體編解碼器並編譯安裝的過程,所使用到的所有庫檔案,包括x

MP3檔案結構及解碼流程

  AGENDA     * MP3簡介     * MP3檔案結構        ——Tag_v2(ID3v2)標籤幀        ——資料幀        ——Tag_v1(ID3v1)標籤幀     *MP3編解碼流程     *MP3檔案的播放流程 一、MP3簡介:

跟我一起Makefile:使用make更新函式檔案

轉載: 使用make更新函式庫檔案 函式庫檔案也就是對Object檔案(程式編譯的中間檔案)的打包檔案。在Unix下,一般是由命令"ar"來完成打包工作。 函式庫檔案的成員 一個函式庫檔案由多個檔案組成。你可以以如下格式指定函式庫檔案及其組成: archi

從0開始一個通用的Makefile檔案

     什麼是Makefile檔案       一個工程中的原始檔不計其數,其按型別、功能、模組分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,

使用FFMPEG從MP4封裝中提取視訊流到H264檔案

命令列: ffmpeg -i 20130312_133313.mp4 -codec copy -bsf: h264_mp4toannexb -f h264 20130312_133313.264 說明:  -i 20130312_133313.mp4 :是輸入的MP4檔

使用FFMPEG從MP4封裝中提取視訊流到.264檔案

命令列: ffmpeg -i 20130312_133313.mp4 -codec copy -bsf: h264_mp4toannexb -f h264 20130312_133313.264 說明:  -i 20130312_133313.mp4 :是輸入的MP4檔案

[C/C++]_[從netbeans裡提取的通用構建C++專案的Makefile檔案]

1.有了這個配置檔案,你可以用任何ide或文字編輯器,除了不支援makefile的ide。 2.makefile的好處不用說吧,不依賴ide,如果g++或ide更新了的話makefile什麼都不需要做。但是基於專案檔案的編譯配置就難了,比如vs2010專案如果想用vs20

一步一步Makefile(2):shell命令,萬用字元*和%區別,檔案路徑搜尋vpath VPATH

#################6:Makefile中也可以插入shell命令################ variable=main.o test1.o test2.o main:$(variable)         cc -o main $(variable)

跟我一起Makefile(七)

awk 註意事項 ack ref 個人 c語言 分開 數據庫 特性 make 的運行——————一般來說,最簡單的就是直接在命令行下輸入make命令,make命令會找當前目錄的makefile來執行,一切都是自動的。但也有時你也許只想讓make重編譯某些文件,而不是整個工程

跟我一起Makefile(四)

比較 命令解釋 例子 exec 上層 tab鍵 file 順序 變量傳遞 書寫命令————每條規則中的命令和操作系統Shell的命令行是一致的。make會一按順序一條一條的執行命令,每條命令的開頭必須以[Tab]鍵開頭,除非,命令是緊跟在依賴規則後面的分號後的。在命令行之間

跟我一起Makefile(三)

image 函數名 headers 波浪 用法 日期 最好 頭文件 哪些 書寫規則————規則包含兩個部分,一個是依賴關系,一個是生成目標的方法。在Makefile中,規則的順序是很重要的,因為,Makefile中只應該有一個最終目標,其它的目標都是被這個目標所連帶出來的,

跟我一起Makefile:使用函數

ref pos weibo blank log vdi make linu wiki 跟我一起寫Makefile:使用函數 兩個排版不一樣 書籍下載 書籍下載跟我一起寫Makefile:使用函數

重新了一邊三級菜單,加了一些自己的理解

提示 風箏 北京 汽車 png gpo 現實 span break menu = { ‘北京‘:{ ‘海澱‘:{ ‘五道口‘:{ ‘soho‘:{}, ‘網易‘

【轉】跟我一起 Makefile

軟件 linux下 是我 main c++ class 情況 如果 反斜杠 概述—— 什麽是makefile?或許很多Winodws的程序員都不知道這個東西,因為那些Windows的IDE都為你做了這個工作,但我覺得要作一個好的和professional的程序員,makef

第二十篇-如何配置檔案

配置檔案不同的格式所用不同函式,可能可以優化 WriteData.java package com.example.aimee.logtest; import android.os.Build; import android.support.annotation.RequiresA