FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
ac3_parser.c
Go to the documentation of this file.
1
/*
2
* AC-3 parser
3
* Copyright (c) 2003 Fabrice Bellard
4
* Copyright (c) 2003 Michael Niedermayer
5
*
6
* This file is part of FFmpeg.
7
*
8
* FFmpeg is free software; you can redistribute it and/or
9
* modify it under the terms of the GNU Lesser General Public
10
* License as published by the Free Software Foundation; either
11
* version 2.1 of the License, or (at your option) any later version.
12
*
13
* FFmpeg is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
* Lesser General Public License for more details.
17
*
18
* You should have received a copy of the GNU Lesser General Public
19
* License along with FFmpeg; if not, write to the Free Software
20
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
*/
22
23
#include "
libavutil/channel_layout.h
"
24
#include "
parser.h
"
25
#include "
ac3_parser.h
"
26
#include "
aac_ac3_parser.h
"
27
#include "
get_bits.h
"
28
29
30
#define AC3_HEADER_SIZE 7
31
32
33
static
const
uint8_t
eac3_blocks
[4] = {
34
1, 2, 3, 6
35
};
36
37
/**
38
* Table for center mix levels
39
* reference: Section 5.4.2.4 cmixlev
40
*/
41
static
const
uint8_t
center_levels
[4] = { 4, 5, 6, 5 };
42
43
/**
44
* Table for surround mix levels
45
* reference: Section 5.4.2.5 surmixlev
46
*/
47
static
const
uint8_t
surround_levels
[4] = { 4, 6, 7, 6 };
48
49
50
int
avpriv_ac3_parse_header2
(
GetBitContext
*gbc,
AC3HeaderInfo
**phdr)
51
{
52
int
frame_size_code;
53
AC3HeaderInfo
*hdr;
54
55
if
(!*phdr)
56
*phdr =
av_mallocz
(
sizeof
(
AC3HeaderInfo
));
57
if
(!*phdr)
58
return
AVERROR
(ENOMEM);
59
hdr = *phdr;
60
61
memset(hdr, 0,
sizeof
(*hdr));
62
63
hdr->
sync_word
=
get_bits
(gbc, 16);
64
if
(hdr->
sync_word
!= 0x0B77)
65
return
AAC_AC3_PARSE_ERROR_SYNC
;
66
67
/* read ahead to bsid to distinguish between AC-3 and E-AC-3 */
68
hdr->
bitstream_id
=
show_bits_long
(gbc, 29) & 0x1F;
69
if
(hdr->
bitstream_id
> 16)
70
return
AAC_AC3_PARSE_ERROR_BSID
;
71
72
hdr->
num_blocks
= 6;
73
74
/* set default mix levels */
75
hdr->
center_mix_level
= 5;
// -4.5dB
76
hdr->
surround_mix_level
= 6;
// -6.0dB
77
78
/* set default dolby surround mode */
79
hdr->
dolby_surround_mode
=
AC3_DSURMOD_NOTINDICATED
;
80
81
if
(hdr->
bitstream_id
<= 10) {
82
/* Normal AC-3 */
83
hdr->
crc1
=
get_bits
(gbc, 16);
84
hdr->
sr_code
=
get_bits
(gbc, 2);
85
if
(hdr->
sr_code
== 3)
86
return
AAC_AC3_PARSE_ERROR_SAMPLE_RATE
;
87
88
frame_size_code =
get_bits
(gbc, 6);
89
if
(frame_size_code > 37)
90
return
AAC_AC3_PARSE_ERROR_FRAME_SIZE
;
91
92
skip_bits
(gbc, 5);
// skip bsid, already got it
93
94
hdr->
bitstream_mode
=
get_bits
(gbc, 3);
95
hdr->
channel_mode
=
get_bits
(gbc, 3);
96
97
if
(hdr->
channel_mode
==
AC3_CHMODE_STEREO
) {
98
hdr->
dolby_surround_mode
=
get_bits
(gbc, 2);
99
}
else
{
100
if
((hdr->
channel_mode
& 1) && hdr->
channel_mode
!=
AC3_CHMODE_MONO
)
101
hdr-> center_mix_level =
center_levels
[
get_bits
(gbc, 2)];
102
if
(hdr->
channel_mode
& 4)
103
hdr->
surround_mix_level
=
surround_levels
[
get_bits
(gbc, 2)];
104
}
105
hdr->
lfe_on
=
get_bits1
(gbc);
106
107
hdr->
sr_shift
=
FFMAX
(hdr->
bitstream_id
, 8) - 8;
108
hdr->
sample_rate
=
ff_ac3_sample_rate_tab
[hdr->
sr_code
] >> hdr->
sr_shift
;
109
hdr->
bit_rate
= (
ff_ac3_bitrate_tab
[frame_size_code>>1] * 1000) >> hdr->
sr_shift
;
110
hdr->
channels
=
ff_ac3_channels_tab
[hdr->
channel_mode
] + hdr->
lfe_on
;
111
hdr->
frame_size
=
ff_ac3_frame_size_tab
[frame_size_code][hdr->
sr_code
] * 2;
112
hdr->
frame_type
=
EAC3_FRAME_TYPE_AC3_CONVERT
;
//EAC3_FRAME_TYPE_INDEPENDENT;
113
hdr->
substreamid
= 0;
114
}
else
{
115
/* Enhanced AC-3 */
116
hdr->
crc1
= 0;
117
hdr->
frame_type
=
get_bits
(gbc, 2);
118
if
(hdr->
frame_type
==
EAC3_FRAME_TYPE_RESERVED
)
119
return
AAC_AC3_PARSE_ERROR_FRAME_TYPE
;
120
121
hdr->
substreamid
=
get_bits
(gbc, 3);
122
123
hdr->
frame_size
= (
get_bits
(gbc, 11) + 1) << 1;
124
if
(hdr->
frame_size
<
AC3_HEADER_SIZE
)
125
return
AAC_AC3_PARSE_ERROR_FRAME_SIZE
;
126
127
hdr->
sr_code
=
get_bits
(gbc, 2);
128
if
(hdr->
sr_code
== 3) {
129
int
sr_code2 =
get_bits
(gbc, 2);
130
if
(sr_code2 == 3)
131
return
AAC_AC3_PARSE_ERROR_SAMPLE_RATE
;
132
hdr->
sample_rate
=
ff_ac3_sample_rate_tab
[sr_code2] / 2;
133
hdr->
sr_shift
= 1;
134
}
else
{
135
hdr->
num_blocks
=
eac3_blocks
[
get_bits
(gbc, 2)];
136
hdr->
sample_rate
=
ff_ac3_sample_rate_tab
[hdr->
sr_code
];
137
hdr->
sr_shift
= 0;
138
}
139
140
hdr->
channel_mode
=
get_bits
(gbc, 3);
141
hdr->
lfe_on
=
get_bits1
(gbc);
142
143
hdr->
bit_rate
= (uint32_t)(8.0 * hdr->
frame_size
* hdr->
sample_rate
/
144
(hdr->
num_blocks
* 256.0));
145
hdr->
channels
=
ff_ac3_channels_tab
[hdr->
channel_mode
] + hdr->
lfe_on
;
146
}
147
hdr->
channel_layout
=
avpriv_ac3_channel_layout_tab
[hdr->
channel_mode
];
148
if
(hdr->
lfe_on
)
149
hdr->
channel_layout
|=
AV_CH_LOW_FREQUENCY
;
150
151
return
0;
152
}
153
154
int
avpriv_ac3_parse_header
(
GetBitContext
*gbc,
AC3HeaderInfo
*hdr)
155
{
156
AC3HeaderInfo
tmp, *ptmp = &tmp;
157
int
ret
=
avpriv_ac3_parse_header2
(gbc, &ptmp);
158
159
memcpy(hdr, ptmp, ((intptr_t)&tmp.
channel_layout
) - ((intptr_t)&tmp) +
sizeof
(uint64_t));
160
return
ret
;
161
}
162
163
static
int
ac3_sync
(uint64_t
state
,
AACAC3ParseContext
*hdr_info,
164
int
*need_next_header,
int
*new_frame_start)
165
{
166
int
err;
167
union
{
168
uint64_t u64;
169
uint8_t
u8[8];
170
} tmp = {
av_be2ne64
(state) };
171
AC3HeaderInfo
hdr, *phdr = &hdr;
172
GetBitContext
gbc;
173
174
init_get_bits
(&gbc, tmp.u8+8-
AC3_HEADER_SIZE
, 54);
175
err =
avpriv_ac3_parse_header2
(&gbc, &phdr);
176
177
if
(err < 0)
178
return
0;
179
180
hdr_info->
sample_rate
= hdr.
sample_rate
;
181
hdr_info->
bit_rate
= hdr.
bit_rate
;
182
hdr_info->
channels
= hdr.
channels
;
183
hdr_info->
channel_layout
= hdr.
channel_layout
;
184
hdr_info->
samples
= hdr.
num_blocks
* 256;
185
hdr_info->
service_type
= hdr.
bitstream_mode
;
186
if
(hdr.
bitstream_mode
== 0x7 && hdr.
channels
> 1)
187
hdr_info->
service_type
=
AV_AUDIO_SERVICE_TYPE_KARAOKE
;
188
if
(hdr.
bitstream_id
>10)
189
hdr_info->
codec_id
=
AV_CODEC_ID_EAC3
;
190
else
if
(hdr_info->
codec_id
==
AV_CODEC_ID_NONE
)
191
hdr_info->
codec_id
=
AV_CODEC_ID_AC3
;
192
193
*need_next_header = (hdr.
frame_type
!=
EAC3_FRAME_TYPE_AC3_CONVERT
);
194
*new_frame_start = (hdr.
frame_type
!=
EAC3_FRAME_TYPE_DEPENDENT
);
195
return
hdr.
frame_size
;
196
}
197
198
static
av_cold
int
ac3_parse_init
(
AVCodecParserContext
*
s1
)
199
{
200
AACAC3ParseContext
*
s
= s1->
priv_data
;
201
s->
header_size
=
AC3_HEADER_SIZE
;
202
s->
sync
=
ac3_sync
;
203
return
0;
204
}
205
206
207
AVCodecParser
ff_ac3_parser
= {
208
.
codec_ids
= {
AV_CODEC_ID_AC3
,
AV_CODEC_ID_EAC3
},
209
.priv_data_size =
sizeof
(
AACAC3ParseContext
),
210
.parser_init =
ac3_parse_init
,
211
.parser_parse =
ff_aac_ac3_parse
,
212
.parser_close =
ff_parse_close
,
213
};
Generated on Sun Jul 20 2014 23:05:42 for FFmpeg by
1.8.2