AAC
Extra data have 16 bits:
Audio object type - normally 5 bits, but 11 bits if AOT_ESCAPE
Sampling index - 4 bits
if (Sampling index == 15)
Sample rate - 24 bits
Channel configuration - 4 bits
last reserved- 3 bits
Audio object type - normally 5 bits, but 11 bits if AOT_ESCAPE
Sampling index - 4 bits
if (Sampling index == 15)
Sample rate - 24 bits
Channel configuration - 4 bits
last reserved- 3 bits
For exmpale: "Low Complexity Sampling frequency 44100Hz, 1 channel mono":
AOT_LC == 2 -> 00010
AOT_LC == 2 -> 00010
44.1kHz == 4 -> 0100
44.1kHz == 4 -> 0100 48kHz == 3 -> 0011
mono == 1 -> 0001
so extra data:
00010 0100 0001 000 ->0x12 0x8
00010 0011 0001 000 ->0x11 0x88
44.1kHz == 4 -> 0100 48kHz == 3 -> 0011
mono == 1 -> 0001
so extra data:
00010 0100 0001 000 ->0x12 0x8
00010 0011 0001 000 ->0x11 0x88
_audio->codecpar->extradata_size = 2; _audio->codecpar->extradata = (uint8_t*)malloc(2); SetAudioExtraData(stream.sampleRate(), channelNum, _audio->codecpar->extradata);
static void SetAudioExtraData(int sampleRate, int channelNum, uint8_t *pExtradata)
{
switch(sampleRate){
case 8000:
pExtradata[0] = 0x15;
if(channelNum == 1)
pExtradata[1] = 0x88;
else
pExtradata[1] = 0x90;
break;
case 16000:
pExtradata[0] = 0x14;
if(channelNum == 1)
pExtradata[1] = 0x8;
else
pExtradata[1] = 0x10;
break;
case 32000:
pExtradata[0] = 0x12;
if(channelNum == 1)
pExtradata[1] = 0x88;
else
pExtradata[1] = 0x90;
break;
case 44100:
pExtradata[0] = 0x12;
if(channelNum == 1)
pExtradata[1] = 0x8;
else
pExtradata[1] = 0x10;
break;
case 48000:
pExtradata[0] = 0x11;
if(channelNum == 1)
pExtradata[1] = 0x88;
else
pExtradata[1] = 0x90;
break;
default://current avaac_enc sampling rate = 44100, channel = 1
pExtradata[0] = 0x12;
if(channelNum == 1)
pExtradata[1] = 0x8;
else
pExtradata[1] = 0x10;
break;
}
}
H.264/H.265
H.264 -> SPS + PPS with start code
H.265 -> VPS + SPS + PPS with start code
pCodecContext->extradata = (uint8_t*)av_malloc(extraDataSize); pCodecContext->extradata_size = extraDataSize; memcpy(pCodecContext->extradata, stream.header().data(), extraDataSize);