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_header
(
GetBitContext
*gbc,
AC3HeaderInfo
*hdr)
51
{
52
int
frame_size_code;
53
54
memset(hdr, 0,
sizeof
(*hdr));
55
56
hdr->
sync_word
=
get_bits
(gbc, 16);
57
if
(hdr->
sync_word
!= 0x0B77)
58
return
AAC_AC3_PARSE_ERROR_SYNC
;
59
60
/* read ahead to bsid to distinguish between AC-3 and E-AC-3 */
61
hdr->
bitstream_id
=
show_bits_long
(gbc, 29) & 0x1F;
62
if
(hdr->
bitstream_id
> 16)
63
return
AAC_AC3_PARSE_ERROR_BSID
;
64
65
hdr->
num_blocks
= 6;
66
67
/* set default mix levels */
68
hdr->
center_mix_level
= 5;
// -4.5dB
69
hdr->
surround_mix_level
= 6;
// -6.0dB
70
71
if
(hdr->
bitstream_id
<= 10) {
72
/* Normal AC-3 */
73
hdr->
crc1
=
get_bits
(gbc, 16);
74
hdr->
sr_code
=
get_bits
(gbc, 2);
75
if
(hdr->
sr_code
== 3)
76
return
AAC_AC3_PARSE_ERROR_SAMPLE_RATE
;
77
78
frame_size_code =
get_bits
(gbc, 6);
79
if
(frame_size_code > 37)
80
return
AAC_AC3_PARSE_ERROR_FRAME_SIZE
;
81
82
skip_bits
(gbc, 5);
// skip bsid, already got it
83
84
hdr->
bitstream_mode
=
get_bits
(gbc, 3);
85
hdr->
channel_mode
=
get_bits
(gbc, 3);
86
87
if
(hdr->
channel_mode
==
AC3_CHMODE_STEREO
) {
88
skip_bits
(gbc, 2);
// skip dsurmod
89
}
else
{
90
if
((hdr->
channel_mode
& 1) && hdr->
channel_mode
!=
AC3_CHMODE_MONO
)
91
hdr-> center_mix_level =
center_levels
[
get_bits
(gbc, 2)];
92
if
(hdr->
channel_mode
& 4)
93
hdr->
surround_mix_level
=
surround_levels
[
get_bits
(gbc, 2)];
94
}
95
hdr->
lfe_on
=
get_bits1
(gbc);
96
97
hdr->
sr_shift
=
FFMAX
(hdr->
bitstream_id
, 8) - 8;
98
hdr->
sample_rate
=
ff_ac3_sample_rate_tab
[hdr->
sr_code
] >> hdr->
sr_shift
;
99
hdr->
bit_rate
= (
ff_ac3_bitrate_tab
[frame_size_code>>1] * 1000) >> hdr->
sr_shift
;
100
hdr->
channels
=
ff_ac3_channels_tab
[hdr->
channel_mode
] + hdr->
lfe_on
;
101
hdr->
frame_size
=
ff_ac3_frame_size_tab
[frame_size_code][hdr->
sr_code
] * 2;
102
hdr->
frame_type
=
EAC3_FRAME_TYPE_AC3_CONVERT
;
//EAC3_FRAME_TYPE_INDEPENDENT;
103
hdr->
substreamid
= 0;
104
}
else
{
105
/* Enhanced AC-3 */
106
hdr->
crc1
= 0;
107
hdr->
frame_type
=
get_bits
(gbc, 2);
108
if
(hdr->
frame_type
==
EAC3_FRAME_TYPE_RESERVED
)
109
return
AAC_AC3_PARSE_ERROR_FRAME_TYPE
;
110
111
hdr->
substreamid
=
get_bits
(gbc, 3);
112
113
hdr->
frame_size
= (
get_bits
(gbc, 11) + 1) << 1;
114
if
(hdr->
frame_size
<
AC3_HEADER_SIZE
)
115
return
AAC_AC3_PARSE_ERROR_FRAME_SIZE
;
116
117
hdr->
sr_code
=
get_bits
(gbc, 2);
118
if
(hdr->
sr_code
== 3) {
119
int
sr_code2 =
get_bits
(gbc, 2);
120
if
(sr_code2 == 3)
121
return
AAC_AC3_PARSE_ERROR_SAMPLE_RATE
;
122
hdr->
sample_rate
=
ff_ac3_sample_rate_tab
[sr_code2] / 2;
123
hdr->
sr_shift
= 1;
124
}
else
{
125
hdr->
num_blocks
=
eac3_blocks
[
get_bits
(gbc, 2)];
126
hdr->
sample_rate
=
ff_ac3_sample_rate_tab
[hdr->
sr_code
];
127
hdr->
sr_shift
= 0;
128
}
129
130
hdr->
channel_mode
=
get_bits
(gbc, 3);
131
hdr->
lfe_on
=
get_bits1
(gbc);
132
133
hdr->
bit_rate
= (uint32_t)(8.0 * hdr->
frame_size
* hdr->
sample_rate
/
134
(hdr->
num_blocks
* 256.0));
135
hdr->
channels
=
ff_ac3_channels_tab
[hdr->
channel_mode
] + hdr->
lfe_on
;
136
}
137
hdr->
channel_layout
=
avpriv_ac3_channel_layout_tab
[hdr->
channel_mode
];
138
if
(hdr->
lfe_on
)
139
hdr->
channel_layout
|=
AV_CH_LOW_FREQUENCY
;
140
141
return
0;
142
}
143
144
static
int
ac3_sync
(uint64_t
state
,
AACAC3ParseContext
*hdr_info,
145
int
*need_next_header,
int
*new_frame_start)
146
{
147
int
err;
148
union
{
149
uint64_t u64;
150
uint8_t
u8[8];
151
} tmp = {
av_be2ne64
(state) };
152
AC3HeaderInfo
hdr;
153
GetBitContext
gbc;
154
155
init_get_bits
(&gbc, tmp.u8+8-
AC3_HEADER_SIZE
, 54);
156
err =
avpriv_ac3_parse_header
(&gbc, &hdr);
157
158
if
(err < 0)
159
return
0;
160
161
hdr_info->
sample_rate
= hdr.
sample_rate
;
162
hdr_info->
bit_rate
= hdr.
bit_rate
;
163
hdr_info->
channels
= hdr.
channels
;
164
hdr_info->
channel_layout
= hdr.
channel_layout
;
165
hdr_info->
samples
= hdr.
num_blocks
* 256;
166
hdr_info->
service_type
= hdr.
bitstream_mode
;
167
if
(hdr.
bitstream_mode
== 0x7 && hdr.
channels
> 1)
168
hdr_info->
service_type
=
AV_AUDIO_SERVICE_TYPE_KARAOKE
;
169
if
(hdr.
bitstream_id
>10)
170
hdr_info->
codec_id
=
AV_CODEC_ID_EAC3
;
171
else
if
(hdr_info->
codec_id
==
AV_CODEC_ID_NONE
)
172
hdr_info->
codec_id
=
AV_CODEC_ID_AC3
;
173
174
*need_next_header = (hdr.
frame_type
!=
EAC3_FRAME_TYPE_AC3_CONVERT
);
175
*new_frame_start = (hdr.
frame_type
!=
EAC3_FRAME_TYPE_DEPENDENT
);
176
return
hdr.
frame_size
;
177
}
178
179
static
av_cold
int
ac3_parse_init
(
AVCodecParserContext
*
s1
)
180
{
181
AACAC3ParseContext
*
s
= s1->
priv_data
;
182
s->
header_size
=
AC3_HEADER_SIZE
;
183
s->
sync
=
ac3_sync
;
184
return
0;
185
}
186
187
188
AVCodecParser
ff_ac3_parser
= {
189
.
codec_ids
= {
AV_CODEC_ID_AC3
,
AV_CODEC_ID_EAC3
},
190
.priv_data_size =
sizeof
(
AACAC3ParseContext
),
191
.parser_init =
ac3_parse_init
,
192
.parser_parse =
ff_aac_ac3_parse
,
193
.parser_close =
ff_parse_close
,
194
};
Generated on Wed Jul 10 2013 23:47:54 for FFmpeg by
1.8.2