• ffmpeg Win8移植记(二)


    接着上回说,http://www.cnblogs.com/zjjcy/p/3384517.html

    上回移植了ffmpeg在ARM上面,只是纯C的代码,没有做汇编的优化。因为ffmpeg的ARM汇编是GNU风格的,微软自带的汇编编译器armasm不支持这样风格的汇编语法。

    于是就想到两个解决方案,一种是改写GNU风格的汇编到标准的ARM汇编格式,二是用GCC工具编译,然后再转换编译后的文件,由elf格式到微软支持的COFF格式。

    我对GCC不是很熟,就采用了第一种方案,第一种也是最麻烦的方案

    特别感谢 这位大神 http://www.cnblogs.com/zcmmwbd/p/windows-phone-8-armasm-guide.html#2842650 他全程指导了我如何迁移,我本来不懂汇编,大神很耐心的给我讲解,让我甚为感动。

    因此,我觉得应该把迁移的结果公开出去,俗话说积德行善,我也图个新年的好彩头,大家请在这个地址下载

    https://ffmpegwinrtarm.codeplex.com/

    接着说说编译过程

    1. 把这些文件覆盖到 ffmpeg-2.1
    2. 用管理员运行VS2013 ARM的console,然后用这个console运行msys
    3. Config 的命令

    ./configure --toolchain=msvc

    --disable-programs

    --disable-network

    --disable-protocols

    --extra-cflags="-D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE -D_M_ARM -DWINAPI_FAMILY=WINAPI_FAMILY_APP"

    --enable-cross-compile

    --target-os=win32

    --arch=arm

    --as=armasm

    --cpu=armv7

    --disable-yasm

    --extra-ldflags="-MACHINE:ARM"

    --disable-dxva2

    --disable-inline-asm

             4. 修改config.mak 和config.h文件

                       启用 HAVE_NEON

              5. make             

        在make的过程中会遇到 AS libavocodec/arm/aacpdsp_neon.o 类似的错误,这个是因为armasm不能接受额外的参数。

        这个时候要用   VS13 ARM的console cd到对应文件夹libavocodec/arm 然后运行 build.bat

        运行成功后继续 make, 在libavutil 和 libswresample 也会遇到同上的问题。

       6. 最后编译成功make install

    第二种方案,我没有试过,是ARM给出的解决方案,objcopy 可以帮助转换,就是先用linux的工具编译出这些neon的.o文件,然后转一下,然后再链接到winrt的ffmpeg里面。

    这里说说我所修改的地方,首先config文件里面有会as的检查,但是armasm不能完成这样的检查,我就把对应的代码注释掉了。在编译的时候,工具链会给armasm传很多参数,这些参数都是不支持的,但是中途会停掉,然后调用build的脚本,这个脚本的目的就是把汇编的代码编译成.o文件,有了这些.o文件的话,再去make,编译器就可以链接进去了。

    在代码转换的过程中,一个是对应指令,对应语法的转换,这个大家可以参照我转换的结果来看,另一方面就是数据的对齐。大神说,在THUMB语法中,数据的对对齐被自动+1,所以数据段要放在 AREA .rodata, DATA, ARM下面,这样编译才能正确。

    最后,今天是2013年的最后一天,我也很高兴能在今天搞定这个问题,可以过一个好年。也祝大家在新的一年里,家庭圆满,事业有成。

  • 相关阅读:
    二叉树的下一个节点
    二叉树的对称
    CString,string和char*
    二叉平衡树
    二叉树的深度
    必应首页图片下载
    Git报错:fatal: remote origin already exists.
    sublime text3 自定义代码片段
    atom自定义C++代码片段
    vscode 自定义代码片段(snippets)
  • 原文地址:https://www.cnblogs.com/zjjcy/p/3499848.html
Copyright © 2020-2023  润新知