由於舊的 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_64clang: 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。
沒有留言:
張貼留言