Компиляция и создание тонкой версии avconv/ffmpeg для STM32F4-Discovery — архитектура armv7 thumb 1/2

Это моя первая попытка обратиться за помощью в Stack Overflow.

Мой проект: используя STM32F4-Discovery с чипом STM32F407VGT6 с FPv4-SP и настройкой периферийных устройств камеры/ЖК-дисплея, мне нужно записывать видео в формате QVGA и выводить в сжатый формат MPEG-4 с соотношением сторон не менее 25:1.

Я определил нужную библиотеку кодеков (avconv, если только ffmpeg не окажется более пригодным для использования) и сейчас пытаюсь создать параметры компилятора, чтобы получить облегченную версию, которая сможет выполняться на чипе в ANSI-C. и архитектура большого пальца.

Эта плата имеет очень ограниченное пространство (192 КБ SRAM и 1 МБ флэш-памяти — есть возможность расширения, но было бы предпочтительнее использовать только то, что у меня есть), и в настоящее время «основной» исполняемый файл любой библиотеки превышает 1 МБ.

Судя по выводу с различными решениями, которые я пробовал, не похоже, что многие параметры компилятора успешно применяются к сборке. Итак, мои вопросы:

1) Возможно ли вообще скомпилировать любую библиотеку в желаемое пространство, используя только декодеры rawvideo, кодировщики mpeg4 и самые простые утилиты? Если нет, то есть ли примерная оценка того, сколько потребуется?

2) Я провел много часов в Интернете, и, похоже, никто не пытался это сделать - есть ли кто-нибудь, кто может сказать мне обратное?

У меня есть сценарий настройки/сборки для тех, кто хочет взглянуть и посмотреть, не пропустил ли я что-то основное. Просто спросите, и я отправлю его по электронной почте, я не хочу загромождать ветку больше, чем уже сделал мой, казалось бы, многословный запрос.

Я бы предположил, что ни одна из библиотек, вероятно, не сломана. Я пытался это сделать на Ubuntu 12.04 32-бит.

Я стажер-программист и буду очень признателен за любую доступную помощь.

И последний вопрос: если мое решение окажется неработоспособным, существует ли другая библиотека сжатия mpeg4 с открытым исходным кодом, которую можно легко скомпилировать для встроенной архитектуры набора ARMv7E-M/Thumb?

РЕДАКТИРОВАТЬ: Вот команда сборки, ранее не включенная.

#!/bin/bash

NDK=~/Desktop/android-ndk-r9
PLATFORM=~/Desktop/gcc-arm-none-eabi-4_7-2013q2
PREBUILT=~/Desktop/gcc-arm-none-eabi-4_7-2013q2/arm-none-eabi
function build_one
{
./configure --target-os=symbian \
    --prefix=$PREFIX \
    --disable-everything \
    --enable-cross-compile \
    --disable-shared \
    --enable-static \
    --enable-small \
  #  --disable-asm \
    --enable-thumb \
    --extra-libs="-lgcc" \
    --arch=armv7e-m \
    --cc=$PREBUILT/bin/gcc \
    --cross-prefix=$PREBUILT/bin \
    --nm=$PREBUILT/bin/nm \
    --sysroot=$PLATFORM \
    --extra-cflags=" -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -mthumb-interwork -finline-limit=300 $OPTIMIZE_CFLAGS -I/usr/local/include" \
--extra-ldflags="-Wl,-rpath-link=$PLATFORM/arm-none-eabi/lib/armv7e-m -L $PLATFORM/arm-none-eabi/lib/armv7e-m -nostdlib -lc -lm -ldl -llog -L/usr/local/lib " \
--enable-gpl \
   # --enable-libx264 \
    --enable-demuxer=mov \
    --enable-demuxer=h264 \
    --disable-ffplay \
    --disable-ffserver \
    --disable-ffprobe \
    --enable-protocol=file \
    --enable-avformat \
    --enable-avcodec \
    --enable-decoder=rawvideo \
    --enable-decoder=mjpeg \
    --enable-decoder=h263 \
    --enable-decoder=mpeg4 \
    --enable-decoder=h264 \
    --enable-encoder=mjpeg \
    --enable-encoder=h263 \
    --enable-encoder=mpeg4 \
    --enable-encoder=h264 \
    --enable-parser=h264 \
    --disable-network \
    --enable-zlib \
    --disable-avfilter \
    --disable-avdevice \
    $ADDITIONAL_CONFIGURE_FLAG

make clean
make -j4 install
$PREBUILT/bin/ar d libavcodec/libavcodec.a inverse.o
$PREBUILT/bin/ld -rpath-link=$PLATFORM/arm-none-eabi/lib/armv7e-m -L$PLATFORM/arm-none-eabi/lib/armv7e-m  -soname libffmpeg.so -shared -Bshareable -nostdlib -Bdynamic --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker $PREBUILT../lib/gcc/arm-none-eabi/4.7.4/armv7e-m/libgcc.a
}

CPU=armv7e-m
OPTIMIZE_CFLAGS="-mfloat-abi=hard -mfpu=vfpv4 -march=$CPU "
PREFIX=./android/$CPU
ADDITIONAL_CONFIGURE_FLAG=
build_one

Это сценарий, который я получил и изменил. Первоначально он был успешно построен для ARMv7-a, который не будет выполняться на чипе ARMv7e-m (плата обнаружения).


person Jack Sanchez    schedule 20.08.2013    source источник


Ответы (1)


Сначала возникли вопросы:

Какие параметры компилятора вы используете? Важно правильно их настроить, чтобы включить правильные библиотеки и поддержку операций с плавающей запятой. Можете ли вы опубликовать свои команды сборки? Вы разделяете этапы компиляции и компоновки?

Вы используете newlib или newlib-nano? Вы можете сэкономить место с помощью newlib-nano.

Вы работаете с голым железом или с RTOS?

person reign_man    schedule 22.08.2013
comment
Во-первых, я ценю ответ. Я добавлю свои команды сборки в редактирование моего исходного сообщения, чтобы не загромождать этот комментарий. Теперь я считаю, что моя проблема заключается в архитектуре. Когда я скомпилировал и попытался связать общие библиотеки с рабочей станции IAR, я получил сообщение об ошибке. Этот код был скомпилирован для ARMv7-a.. ..не может работать на ARMv7e-m.. После попытки грубой силы с использованием других наборов инструментов я считаю, проблема заключается в том, что исходный код не может быть собран для моей целевой платформы. Также я встроенный нуб, я думаю, что использую RTOS. После просмотра я не думаю, что использовал newlib. - person Jack Sanchez; 26.08.2013
comment
Какой набор инструментов вы используете? Вам нужно использовать кросс-компилятор, который может собрать для коры головного мозга m4. - person reign_man; 26.08.2013
comment
Скорее всего, эти общие библиотеки скомпилированы для ARMv7-a, если полученный вами скрипт сборки предназначен для ARMv7-a. Вам нужно будет пересобрать библиотеки и компилятор для поддержки ARMv7e-m. - person reign_man; 26.08.2013
comment
Да, изначально скрипт сборки был настроен для ARMv7-a, однако я получил цепочку инструментов (gcc-arm-none-eabi-4_7-2013q2), которая была задокументирована для компиляции для ARMv7e-m. Я настроил сценарий для того, что, как я понял, был правильным набором параметров для параметров FPU, параметров Thumb, а также для конкретной архитектуры, однако моя IDE по-прежнему сообщала мне, что сборка предназначена для ARMv7-a. - person Jack Sanchez; 26.08.2013
comment
Извините за долгое ожидание. Вы загрузили готовые двоичные файлы компилятора? Вам нужно пересобрать свои библиотеки для ARMv7-a, и если вы загрузили только готовые двоичные файлы компилятора, у вас их не будет. - person reign_man; 29.08.2013
comment
launchpad.net/gcc-arm-embedded Вы можете получить исходный код цепочки инструментов, поддерживаемой ARM. здесь. Это то, что я использую, и я знаю, что это работает для stm32f4. Просто скачайте исходный пакет и следуйте инструкциям. - person reign_man; 29.08.2013