aboutsummaryrefslogtreecommitdiff
path: root/Src/aacdec/ADTSHeader.c
blob: 8e68327088780d17fbcfd12e12441de5a03d844e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include "ADTSHeader.h"
#include <bfc/error.h>

enum
{
	ADTS_NOT_PROTECTED=1,
	ADTS_PROTECTED=0,
	ADTS_SYNC = 0xFFF,
	ADTS_MAIN = 0x00,
	ADTS_LC = 0x01,
	ADTS_SSR = 0x10,
	ADTS_LTP = 0x11,
};


int nsaac_adts_parse(nsaac_adts_header_t header, const uint8_t *buffer)
{
	unsigned int syncword = (buffer[0] << 4) | (buffer[1] >> 4);
	unsigned int layer;
	unsigned int sample_rate_index;
	if (syncword != ADTS_SYNC)
		return NErr_LostSynchronization;

	header->syncword = syncword;
	header->id = (buffer[1] >> 3) & 1;
	layer = (buffer[1] >> 1) & 3;
	if (layer != 0)
		return NErr_WrongFormat;
	header->layer = layer;	
	header->protection = (buffer[1]) & 1;
	header->profile = (buffer[2] >> 6) & 3;
	sample_rate_index = (buffer[2] >> 2) & 0xF;
	if (sample_rate_index == 15)
		return NErr_UnsupportedFormat; // might actually be OK if we can separately signal the sample rate

	if (sample_rate_index > 13)
		return NErr_Reserved;

	header->sample_rate_index = sample_rate_index;
	header->private_bit = (buffer[2] >> 1) & 1;
	header->channel_configuration = ((buffer[2] & 1) << 2) | ((buffer[3] >> 6) & 3);
	header->original = (buffer[3] >> 5) &1;
	header->home = (buffer[3] >> 4) &1;

	//copyright_identification_bit = (buffer[3] >> 3) & 1;
	//copyright_identification_start = (buffer[3] >> 2) & 1;
	header->frame_length = ((buffer[3] & 3) << 11) | (buffer[4]<<3) | ((buffer[5] >> 5) & 7);
	header->buffer_fullness = ((buffer[5] & 0x1F) << 6) | (buffer[6] >> 2);
	header->num_data_blocks = buffer[6]  & 3;
	return NErr_Success;
}


static const unsigned int aac_sratetab[] =
{
	96000,
	88200,
	64000,
	48000,
	44100,
	32000,
	24000,
	22050,
	16000,
	12000,
	11025,
	8000,
	7350,
};

unsigned int nsaac_adts_get_samplerate(nsaac_adts_header_t header)
{
	return aac_sratetab[header->sample_rate_index];
}

int nsaac_adts_match(nsaac_adts_header_t header1, nsaac_adts_header_t header2)
{
	if (header1->id != header2->id)
		return NErr_False;

	if (header1->profile != header2->profile)
		return NErr_False;

	if (header1->sample_rate_index != header2->sample_rate_index)
		return NErr_False;

	if (header1->channel_configuration != header2->channel_configuration)
		return NErr_False;

	return NErr_True;
}

int nsaac_adts_get_channel_count(nsaac_adts_header_t header)
{
	switch(header->channel_configuration)
	{
	case 7:
		return 8;
	default:
		return header->channel_configuration;
	}
}

size_t nsaac_adts_get_header_size(nsaac_adts_header_t header)
{
	if (header->protection == ADTS_PROTECTED)
		return 9;
	else
		return 7;
}