Проблема портирования в libFLAC с использованием Adobe Alchemy - PullRequest
3 голосов
/ 16 мая 2011

Я пытаюсь портировать кодировщик FLAC с помощью Adobe Alchemy для использования во флэш-памяти, но не могу понять, где проблема.
Я использую Alchemy для Cygwin на Windows. Он правильно установлен и настроен.
Ниже приведены шаги, которые я выполнил для переноса кодера FLAC:

  1. Загрузить последнюю версию источников FLAC (1.2.1)
  2. Настройка источников FLAC (./configure --enable-static=true --enable-shared=false) с включенной алхимией (alc-on перед настройкой)
  3. Компилировать libFLAC с включенной алхимией (make в папке src / libFLAC)
  4. Копирование файлов заголовков и скомпилированной статической библиотеки (libFLAC.a) в папки алхимии ($ {ACLHEMY_HOME} / usr / local / include и $ {ACLHEMY_HOME} / usr / local / lib соответственно)
  5. Наконец, скомпилируйте SWC следующим образом:
    gcc encodeflac.c -O3 -Wall -swc -lFLAC -o encodeflac.swc<br/> или (что угодно)
    gcc encodeflac.c -O3 -Wall -swc -lflac -o encodeflac.swc<br/>

encodeflac.c - это модифицированная версия примера, включенная в исходные коды FLAC (examples / c / encode / file / main.c) и адаптированная для работы с ActionScript ByteArrays.

SWC будет компилироваться без предупреждений или ошибок. Но окончательный размер SWC составляет всего 85 КБ, а размер статической библиотеки (libFLAC.a) составляет около 1 МБ! Также не работает кодировка. При попытке использовать его в AS я получаю следующую ошибку:
[Fault] exception, information=Undefined sym: <em>FLAC</em>_stream_encoder_new

Значит ли это, что статическая библиотека не включена в swc? Почему?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 03 февраля 2012

Мне потребовалось некоторое время, но мне удалось отследить ошибку привязки к этому назначению в строке 956 в stream_encoder.c (версия 1.2.1):

encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_wide

Кажется, на самом деле есть чем занятьсяс именем символа широкого метода.Еще не нашли хорошего решения.Я исправлю свой ответ, когда я сделаю.Обратите внимание, что это проблема только в том случае, если размер блока слишком велик (более 4096 при 16 битах), что по умолчанию никогда не имеет место, поэтому вы можете смело комментировать назначение и не иметь дело с реальной проблемой ...

И напоследок: когда вы на самом деле используете библиотеку Flac и получаете только нули, проверьте макрос SWAP_BE_WORD_TO_HOST в bitwriter.c.По какой-то причине ntohl только возвращает нули.Попробуйте определить свой собственный подменщик порядка байтов следующим образом:

#define SWAP_BE_WORD_TO_HOST(x) (x<<24|(x&0x0000FF00)<<8|(x&0x00FF0000)>>8|x>>24)

Надеюсь, это поможет любому, кто пытается заставить библиотеку Flac скомпилироваться в алхимии.

1 голос
/ 16 мая 2011

Алхимический компоновщик swc не имеет очень хороших отчетов об ошибках, что затрудняет его отладку.Происходит то, что компоновщик не находит библиотеку.Как это исправить:

  1. gcc чувствителен к регистру.Вы должны использовать -lFLAC (не -lflac)
  2. Алхимия нуждается в файле FLAC.l.bc, который был сгенерирован при сборке libFLAC.a

К сожалению, чтобы получить его для реальной ссылкив итоге выдает ошибку во время компоновки:

Cannot yet select: 0x198b960: i32 = ConstantPool < i64 6881500230622117888> 0
0   llc                                 0x00636dfe _ZNSt8_Rb_treeIN4llvm3sys4PathES2_St9_IdentityIS2_ESt4lessIS2_ESaIS2_EE13insert_uniqueERKS2_ + 6078
1   llc                                 0x006373a2 _ZNSt8_Rb_treeIN4llvm3sys4PathES2_St9_IdentityIS2_ESt4lessIS2_ESaIS2_EE13insert_uniqueERKS2_ + 7522
2   libSystem.B.dylib                   0x9402f2bb _sigtramp + 43
3   ???                                 0xffffffff 0x0 + 4294967295
4   libSystem.B.dylib                   0x940a323a raise + 26
5   libSystem.B.dylib                   0x940af679 abort + 73
6   llc                                 0x002f862b _ZN98_GLOBAL__N__Volumes_data_dev_FlaCC_llvm_2.1_lib_Target_AVM2_AVM2ISelDAGToDAG.cpp_00000000_F04616B616AVM2DAGToDAGISel10SelectCodeEN4llvm9SDOperandE + 187
7   llc                                 0x002fa193 _ZN98_GLOBAL__N__Volumes_data_dev_FlaCC_llvm_2.1_lib_Target_AVM2_AVM2ISelDAGToDAG.cpp_00000000_F04616B616AVM2DAGToDAGISel10SelectRootEN4llvm9SDOperandE + 819
8   llc                                 0x002e6a2c _ZN4llvm19X86_64TargetMachineD0Ev + 65116
9   llc                                 0x003de4ca _ZN4llvm11StoreSDNodeD1Ev + 1610
10  llc                                 0x0040d3fe _ZN4llvm11StoreSDNodeD1Ev + 193918
11  llc                                 0x0040f92e _ZN4llvm11StoreSDNodeD1Ev + 203438
12  llc                                 0x005d1926 _ZN4llvm12FunctionPassD1Ev + 20998
13  llc                                 0x005d1f3a _ZN4llvm12FunctionPassD1Ev + 22554
14  llc                                 0x005d20c5 _ZN4llvm12FunctionPassD1Ev + 22949
15  llc                                 0x00002e44 _mh_execute_header + 7748
16  llc                                 0x00001f36 _mh_execute_header + 3894
17  ???                                 0x00000006 0x0 + 6

Я видел эту же ошибку при попытке собрать libFLAC (v1.2.1) в целом (не только библиотеку).Эта ошибка происходит, когда есть некоторый код на C, который создает байт-код LLVM, который не может обработать Alchemy.(Неясно, является ли это проблемой с тем, что производит LLVM, или ошибкой в ​​Алхимии.)

Вы должны выяснить, где находится код, вызывающий нарушение, и изменить его на то, что нравится Алхимии (фактически не меняя логику!).Кажется, я помню, что у кого-то была похожая проблема с ffmpeg: http://forums.adobe.com/message/2905914#2905914

...