Недавно я попытался обновить библиотеки 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!'
Это меня немного удивило. Как это работает? Разве подпрограмма не получает только значение аргумента? Как он узнает свой адрес?