2016-03-10 5 views
1

Я пытаюсь декодировать бит-поток, который я получил от Apple IPhone для профиля Bluetooth A2DP.Декодирование потока 2,4 бит AAC-LC LATM для a2dp

Согласно Apple, структура должна быть

Bitstream structure

Образец битового потока у меня есть

| 80 60 00 01 00 06 3c ab 00 00 00 00 | 47 FC 00 00 b0 90 80 03 00 20 20 66 00 01 98 00 0d e1 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1c

Первые четыре байта - L2CAP, следующие 12 - AVDTP. Но я не могу декодировать остальные байты. Незлая помощь.

Я видел ISO 14496-3, которые определяют AudioMuxElement, но все же я не могу связать его с байтами.

ответ

2

В последнее время у меня такая же проблема. Поскольку декодирование битового потока на листе бумаги не очень удобно, я создал простой decoder (для целей отладки) на основе эталонной реализации ISO/IEC 14496-3.

Правильно декодированный поток от вопроса:

useSameStreamMux:1    = 0 => 0 
audioMuxVersion:1    = 1 => 1 
audioMuxVersionA:1    = 0 => 0 
bytesForValue:2    = 00 => 0 
valueTmp:8      = 11111111 => 255 (taraBufferFullness) 
allStreamsSameTimeFraming:1 = 1 => 1 
numSubFrames:6     = 000000 => 0 
numProgram:4     = 0000 => 0 
numLayer:3      = 000 => 0 
bytesForValue:2    = 00 => 0 
valueTmp:8      = 00010110 => 22 (ascLen) 
audioObjectType:5    = 00010 => 2 
samplingFrequencyIndex:4  = 0100 => 4 
channelConfiguration:4   = 0010 => 2 
frameLengthFlag:1    = 0 => 0 
dependsOnCoreCoder:1   = 0 => 0 
extensionFlag:1    = 0 => 0 
fillBits:6      = 000000 => 0 
frameLengthType:3    = 000 => 0 
latmBufferFullness:8   = 11000000 => 192 
otherDataPresent:1    = 0 => 0 
crcCheckPresent:1    = 0 => 0 
tmp:8       = 00100000 => 32 (MuxSlotLengthBytes) 
payload:8      = 00100000 => 32 
... 
payload:8      = 00011100 => 28 
byteAlign:0     = 0 => 0 
1

«ИСО/МЭК 14496-3, подраздел 1: Главная, Раздел 1.6: Интерфейс к 14496-1» - это подходящее место для поиска.

Первый взгляд на AudioSyncStream():

AudioSyncStream() 
{ 
    while(nextbits()==0x2B7)  // 11-bits 
    { 
     audioMuxLengthBytes;   // 13-bit 
     AudioMuxElement(1);   // proceed to decode AudioMuxElement 
    } 
} 

LATM должен начать withg 11-разрядное синхрослова: syncword==(2B7)hex==(1010110111)bin. Это не похоже на ваш поток: (47FC)hex==(0100011111111100)bin, первые 11 бит - (01000111111)bin.

+0

Проблемы я столкнулся также в том, что я не могу найти синхрослов. Возможно ли передавать LATM без LOAS? Также я не могу понять, что такое первые 9 байт после заголовка AVDTP, 47 fc 00 00 b0 90 80 03 00 20. Следующий байт «20» обозначил длину. – VinayChoudhary99

0

Я был в состоянии декодировать заголовок следующим образом:

Use same stream config  = 0 (1 bit) 

StreamMuxConfig():

AudioMuxVersion    = 1 (1 bit) 
AudioMuxVersionA    = 0 (1 bit) 
LATM value Temp Bytes  = 00 (2 bit) 
Fullness value    = 1111 1111 (8 Bit) 
AllStreamsUseSameTimeFrame = 1 (1 bit) 
numSubFrames     = 000000 (6 bits) 
num program     = 0000 (4 bits) 
num layer     = 000 (3 bits) 
use same config    = 0 (1 bit) 
Fill + other bits   = 0000 1010 0 (9 bits) 

AudioSpecificConfig():

Object Type (aac)   = 00010 (5 bits) 
Sample Type     = 0100 (4 bits) 
Channel      = 0010 (4 bits) 
GAS specific config   = 000 (3 bits) 

Похоже, у меня был старше версия спецификации. Правильная версия Spec для поиска - ISO/IEC 14496-3: 2005. Также есть ошибки опечатки в директиве Apple по разработке дизайна Bluetooth (это относится к несуществующим документам 13818-3: 2005!).