FFmpeg开发指南
来自SylixOS-wiki
(版本间的差异)
Jiaojinxing (讨论 | 贡献) |
Jiaojinxing (讨论 | 贡献) |
||
第13行: | 第13行: | ||
:进入 ffmpeg 目录: | :进入 ffmpeg 目录: | ||
cd ffmpeg | cd ffmpeg | ||
− | |||
− | |||
==修改 configure== | ==修改 configure== |
2014年7月15日 (二) 15:34的版本
目录 |
下载 ffmpeg
- 在 linux 环境下操作。
- 进入 sylixos 工作空间:
cd /home/user/sylixos_workspace
- 下载 ffmpeg:
git config --global core.autocrlf false git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
- 进入 ffmpeg 目录:
cd ffmpeg
修改 configure
- 屏蔽 check_cflags -Wredundant-decls 避免过多报警。
- 屏蔽 check_cflags -Wstrict-prototypes 避免过多报警。
- 修改 if test_ldflags -Wl,--version-script,$TMPV; then 为 if false ; then
- 修改 ln_s="ln -s -f" 为 ln_s="cp -p"
- 屏蔽 die "C compiler test failed." 跳过编译器测试失败。
增加环境变量
开源版工具链环境变量
export CFLAGS="-mcpu=arm920t -fPIC -DSYLIXOS \ -DSYLIXOS_LIB -fsigned-char -fno-short-enums -I../libsylixos/SylixOS -I../libsylixos/SylixOS/include \ -I../libsylixos/SylixOS/include/inet -I../libsylixos/SylixOS/include/inet/ipv4 \ -I../libsylixos/SylixOS/include/inet/ipv6 -I../libcextern/libcextern/include" export CXXFLAGS=$CFLAGS export LDFLAGS="-mcpu=arm920t -fPIC -shared" export ASFLAGS="-mcpu=arm920t -fPIC -x assembler-with-cpp"
商业版工具链环境变量
- armv7-a系列处理器环境变量:
export CFLAGS="-march=armv7-a -mcpu=cortex-a8 -mfloat-abi=softfp -mfpu=neon -fPIC -DSYLIXOS \ -DSYLIXOS_LIB -fsigned-char -fno-short-enums -I../libsylixos/SylixOS -I../libsylixos/SylixOS/include \ -I../libsylixos/SylixOS/include/inet -I../libsylixos/SylixOS/include/inet/ipv4 \ -I../libsylixos/SylixOS/include/inet/ipv6 -I../libcextern/libcextern/include" export CXXFLAGS=$CFLAGS export LDFLAGS="-march=armv7-a -mcpu=cortex-a8 -mfloat-abi=softfp -mfpu=neon -fPIC -shared" export ASFLAGS="-march=armv7-a -mcpu=cortex-a8 -mfloat-abi=softfp -mfpu=neon -fPIC -x assembler-with-cpp"
- armv4系列处理器环境变量:
export CFLAGS="-mcpu=arm920t -fPIC -DSYLIXOS \ -DSYLIXOS_LIB -fsigned-char -fno-short-enums -I../libsylixos/SylixOS -I../libsylixos/SylixOS/include \ -I../libsylixos/SylixOS/include/inet -I../libsylixos/SylixOS/include/inet/ipv4 \ -I../libsylixos/SylixOS/include/inet/ipv6 -I../libcextern/libcextern/include" export CXXFLAGS=$CFLAGS export LDFLAGS="-mcpu=arm920t -fPIC -shared" export ASFLAGS="-mcpu=arm920t -fPIC -x assembler-with-cpp"
配置
开源版工具链配置
./configure --arch=armv4 --cpu=arm920t --target-os=none --cross-prefix=arm-none-eabi- \ --enable-shared --disable-static --disable-doc \ --extra-libs='-nostdlib -L../libsylixos/Debug -L../libcextern/Debug -lcextern -ldsohandle -lstdc++ -lvpmpdm -lm -lgcc'
商业版工具链配置
- armv7-a系列处理器配置:
./configure --arch=armv7-a --cpu=cortex-a8 --target-os=none --cross-prefix=arm-sylixos-eabi- \ --enable-shared --disable-static --disable-doc \ --extra-libs='-nostdlib -L../libsylixos/Debug -L../libcextern/Debug -lcextern -ldsohandle -lstdc++ -lvpmpdm -lm -lgcc'
- armv4系列处理器配置:
./configure --arch=armv4 --cpu=arm920t --target-os=none --cross-prefix=arm-sylixos-eabi- \ --enable-shared --disable-static --disable-doc \ --extra-libs='-nostdlib -L../libsylixos/Debug -L../libcextern/Debug -lcextern -ldsohandle -lstdc++ -lvpmpdm -lm -lgcc'
- 如果出现 bash: ./configure: /bin/sh^M: bad interpreter: No such file or directory 错误,请用 vim 将 configure 的换行符修改为 unix 格式,vim 命令为 :set ff=unix。
- 将会生成 config.h config.mak doc/config.texi libavutil/avconfig.h 文件。
修改代码
- 1. config.h 修改:
- 将如下的 HAVE_XXX 定义为 0:
//#define HAVE_IO_H 1 #define HAVE_IO_H 0
//#define HAVE_FLT_LIM 1 #define HAVE_FLT_LIM 0
//#define HAVE_FORK 1 #define HAVE_FORK 0
//#define HAVE_GLOB 1 #define HAVE_GLOB 0
//#define HAVE_MACH_ABSOLUTE_TIME 1 #define HAVE_MACH_ABSOLUTE_TIME 0
//#define HAVE_SYSCTL 1 #define HAVE_SYSCTL 0
- 并增加 closesocket 定义:
#define closesocket close
- 2. h264_parser.c 修改:
- 在 static void close(...) 前加入:
#ifdef SYLIXOS_LIB #define close h264_close #endif
- 3. lxfdec.c 修改:
- 在 static int sync(...) 前加入:
#ifdef SYLIXOS_LIB #define sync __sync #endif
- 4. rmdec.c 修改:
- 在 static int sync(...) 前加入:
#ifdef SYLIXOS_LIB #define sync __sync #endif
- 5. atomic_gcc.h 修改:
#ifdef SYLIXOS #define avpriv_atomic_int_get atomic_int_get_gcc static inline int atomic_int_get_gcc(volatile int *ptr) { INTREG reg; int val; API_AtomicLock(®); val = *ptr; API_AtomicUnlock(reg); return val; } #define avpriv_atomic_int_set atomic_int_set_gcc static inline void atomic_int_set_gcc(volatile int *ptr, int val) { INTREG reg; API_AtomicLock(®); *ptr = val; API_AtomicUnlock(reg); } #define avpriv_atomic_int_add_and_fetch atomic_int_add_and_fetch_gcc static inline int atomic_int_add_and_fetch_gcc(volatile int *ptr, int inc) { INTREG reg; int val; API_AtomicLock(®); val = *ptr = *ptr + inc; API_AtomicUnlock(reg); return val; } #define avpriv_atomic_ptr_cas atomic_ptr_cas_gcc static inline void *atomic_ptr_cas_gcc(void * volatile *ptr, void *oldval, void *newval) { INTREG reg; void *val; API_AtomicLock(®); val = *ptr; if (val == oldval) { *ptr = newval; } API_AtomicUnlock(reg); return val; } #else 原有的函数定义,略。 #endif
编译
make