Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Generate ADTS header (Fluendo)
- //
- // http://wiki.multimedia.cx/index.php?title=ADTS
- // http://wiki.multimedia.cx/?title=Understanding_AAC
- // http://wiki.multimedia.cx/index.php?title=MPEG-4_Audio
- void GenerateADTS(int data_length)
- {
- int obj_type = 2 - 1; // AAC LC
- int length = data_length + 7;
- int rate_idx = 0;
- if (samplerate == 22050)
- rate_idx = 7;
- else if (samplerate == 44100)
- rate_idx = 4;
- else {
- fprintf(stderr, "[-] Unhandled sample rate %ld!\n", samplerate);
- exit(-1);
- }
- memset(adts_header, 0, 7);
- /* Sync point over a full byte */
- adts_header[0] = 0xFF;
- /* Sync point continued over first 4 bits + static 4 bits
- * (ID, layer, protection)*/
- adts_header[1] = 0xF1; // CRC is absent
- /* Object type over first 2 bits */
- adts_header[2] = obj_type << 6;
- /* rate index over next 4 bits */
- adts_header[2] |= (rate_idx << 2);
- /* channels over last 2 bits */
- adts_header[2] |= (channels & 0x4) >> 2;
- /* channels continued over next 2 bits + 4 bits at zero */
- adts_header[3] = (channels & 0x3) << 6;
- /* frame size over last 2 bits */
- adts_header[3] |= (length & 0x1800) >> 11;
- /* frame size continued over full byte */
- adts_header[4] = (length & 0x1FF8) >> 3;
- /* frame size continued first 3 bits */
- adts_header[5] = (length & 0x7) << 5;
- /* buffer fullness (0x7FF for VBR) over 5 last bits*/
- // adts_header[5] |= 0x1F;
- adts_header[5] |= 0x00; // CBR
- /* buffer fullness (0x7FF for VBR) continued over 6 first bits + 2 zeros for
- * number of raw data blocks */
- // adts_header[6] = 0xFC;
- adts_header[6] = 0x00; // CBR
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement