Проблема компиляции ffmpeg: avcodec_find_decoder всегда возвращает null

Недавно я попытался обновить библиотеки ffmpeg, которые я использую в своем приложении Mac OS X, загрузив и скомпилировав ffmpeg из исходного кода.

Мой код правильно работает с предварительно скомпилированные библиотеки той же версии для Windows. В Mac OS X кажется, что библиотека работает (она может открыть файл и найти используемые потоки и кодеки), но когда доходит до avcodec_find_decoder, эта функция всегда возвращает значение null.

Код работал со старой версией библиотека (скомпилирована год назад в Mac OS X 10.5)

Я настроил fmpeg, используя

./configure --extra-cflags="-arch i386" --extra-ldflags='-arch i386' --arch=x86_32 --target-os=darwin --enable-cross-compile --disable-indev=jack --enable-shared --disable-static

Я проверил config.mak, и, похоже, в нем включены декодеры для типов файлов, которые я пробовал (ogg, vorbis, avi, мкв, ...) он никогда не может изменить свое значение вне подпрограммы. То есть: мой $ x = 100; foo ($ x); # ничего не зная о foo (), я ...

Я всегда был уверен, что если я передам подпрограмме Perl простой скаляр, он никогда не сможет изменить свое значение вне подпрограммы. То есть:

my $x = 100;
foo($x);
# without knowing anything about foo(), I'm sure $x still == 100

Итак, если я хочу, чтобы foo () изменил x , я должен передать ему ссылку на x .

Затем я обнаружил out это не тот случай:

sub foo {
 $_[0] = 'CHANGED!';
}
my $x = 100;
foo($x);
print $x, "\n"; # prints 'CHANGED!'

То же самое касается элементов массива:

my @arr = (1,2,3);
print $arr[0], "\n"; # prints '1'
foo($arr[0]);
print $arr[0], "\n"; # prints 'CHANGED!'

Это меня немного удивило. Как это работает? Разве подпрограмма не получает только значение аргумента? Как он узнает свой адрес?

10
задан David B 3 November 2010 в 20:42
поделиться