2012年3月5日 星期一

[ffmpeg] 由 0.8.7 昇級至 0.9 的 linking error on osx

由於舊的 swscale 在轉換 yuv 至 rgb 時,在某些 format 會產生一條綠色的矩形在底部。這個情況已經透過由 AVFrame 內的 data 抓出來,用 swscale 之外的工具驗證過了。但單純地將 yuv 轉成 png 是沒有那個綠色的矩形的。在回報 bug 或是要試著自行修復前,當然得做一點『標準動作』:

  • 確認下一個 stable 版是否也有同樣的問題
  • 確認 repo 上最新的狀態是否也有同樣的問題
目前採用的是 ffmpeg 0.8.7 加上我們自己的 patch,由 git fetch 後,我們能看到還有 0.8.8, 0.8.9 再來就進入了 0.9 版。我選擇了 0.9 版作為我們預計要使用的 stable 版本,利用 cherry-pick 簡單地 patch 需要的檔案後,編譯一切正常。但進入 xcode 編譯 Application 時發生了問題:


Undefined symbols for architecture x86_64:
"_kVDADecoderConfiguration_Height", referenced from:
_ff_vda_create_decoder in libavcodec.a(vda.o)
"_kVDADecoderConfiguration_Width", referenced from:
_ff_vda_create_decoder in libavcodec.a(vda.o)
"_kVDADecoderConfiguration_SourceFormat", referenced from:
_ff_vda_create_decoder in libavcodec.a(vda.o)
"_kVDADecoderConfiguration_avcCData", referenced from:
_ff_vda_create_decoder in libavcodec.a(vda.o)
"_kCVPixelBufferPixelFormatTypeKey", referenced from:
_ff_vda_create_decoder in libavcodec.a(vda.o)
"_kCVPixelBufferIOSurfacePropertiesKey", referenced from:
_ff_vda_create_decoder in libavcodec.a(vda.o)
"_VDADecoderCreate", referenced from:
_ff_vda_create_decoder in libavcodec.a(vda.o)
"_VDADecoderDecode", referenced from:
_ff_vda_decoder_decode in libavcodec.a(vda.o)
"_CVPixelBufferRelease", referenced from:
_ff_vda_release_vda_frame in libavcodec.a(vda.o)
_ff_vda_destroy_decoder in libavcodec.a(vda.o)
"_VDADecoderDestroy", referenced from:
_ff_vda_destroy_decoder in libavcodec.a(vda.o)
"_CVPixelBufferGetPixelFormatType", referenced from:
_vda_decoder_callback in libavcodec.a(vda.o)
"_CVPixelBufferRetain", referenced from:
_vda_decoder_callback in libavcodec.a(vda.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

有某些 symbol 找不到。查了一下 changelog,原來 0.9 版還多了 vda 的加速技能。既然在 ffmpeg 編譯時沒有問題,那應該就是 xcode 的設定需要改變,透過這些 symbol 名稱,找出了我們缺少了二個 framework:
加上這二個 framework 後,我們就能編譯正常並且使用具有 VDA 加速效果的 ffmpeg。

沒有留言:

張貼留言