FFmpeg
libavcodec
adts_header.c
Go to the documentation of this file.
1
/*
2
* Audio and Video frame extraction
3
* Copyright (c) 2003 Fabrice Bellard
4
* Copyright (c) 2003 Michael Niedermayer
5
* Copyright (c) 2009 Alex Converse
6
*
7
* This file is part of FFmpeg.
8
*
9
* FFmpeg is free software; you can redistribute it and/or
10
* modify it under the terms of the GNU Lesser General Public
11
* License as published by the Free Software Foundation; either
12
* version 2.1 of the License, or (at your option) any later version.
13
*
14
* FFmpeg is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17
* Lesser General Public License for more details.
18
*
19
* You should have received a copy of the GNU Lesser General Public
20
* License along with FFmpeg; if not, write to the Free Software
21
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22
*/
23
24
#include "
adts_header.h
"
25
#include "
adts_parser.h
"
26
#include "
get_bits.h
"
27
#include "
mpeg4audio.h
"
28
#include "
libavutil/avassert.h
"
29
30
int
ff_adts_header_parse
(
GetBitContext
*gbc,
AACADTSHeaderInfo
*hdr)
31
{
32
int
size
, rdb, ch, sr;
33
int
aot, crc_abs;
34
35
memset(hdr, 0,
sizeof
(*hdr));
36
37
if
(
get_bits
(gbc, 12) != 0xfff)
38
return
AAC_PARSE_ERROR_SYNC
;
39
40
skip_bits1
(gbc);
/* id */
41
skip_bits
(gbc, 2);
/* layer */
42
crc_abs =
get_bits1
(gbc);
/* protection_absent */
43
aot =
get_bits
(gbc, 2);
/* profile_objecttype */
44
sr =
get_bits
(gbc, 4);
/* sample_frequency_index */
45
if
(!
ff_mpeg4audio_sample_rates
[sr])
46
return
AAC_PARSE_ERROR_SAMPLE_RATE
;
47
skip_bits1
(gbc);
/* private_bit */
48
ch =
get_bits
(gbc, 3);
/* channel_configuration */
49
50
skip_bits1
(gbc);
/* original/copy */
51
skip_bits1
(gbc);
/* home */
52
53
/* adts_variable_header */
54
skip_bits1
(gbc);
/* copyright_identification_bit */
55
skip_bits1
(gbc);
/* copyright_identification_start */
56
size
=
get_bits
(gbc, 13);
/* aac_frame_length */
57
if
(
size
<
AV_AAC_ADTS_HEADER_SIZE
)
58
return
AAC_PARSE_ERROR_FRAME_SIZE
;
59
60
skip_bits
(gbc, 11);
/* adts_buffer_fullness */
61
rdb =
get_bits
(gbc, 2);
/* number_of_raw_data_blocks_in_frame */
62
63
hdr->
object_type
= aot + 1;
64
hdr->
chan_config
= ch;
65
hdr->
crc_absent
= crc_abs;
66
hdr->
num_aac_frames
= rdb + 1;
67
hdr->
sampling_index
= sr;
68
hdr->
sample_rate
=
ff_mpeg4audio_sample_rates
[sr];
69
hdr->
samples
= (rdb + 1) * 1024;
70
hdr->
bit_rate
=
size
* 8 * hdr->
sample_rate
/ hdr->
samples
;
71
hdr->
frame_length
=
size
;
72
73
return
size
;
74
}
75
76
int
ff_adts_header_parse_buf
(
const
uint8_t buf[
AV_AAC_ADTS_HEADER_SIZE
+
AV_INPUT_BUFFER_PADDING_SIZE
],
77
AACADTSHeaderInfo
*hdr)
78
{
79
GetBitContext
gb;
80
av_unused
int
ret
=
init_get_bits8
(&gb, buf,
AV_AAC_ADTS_HEADER_SIZE
);
81
av_assert1
(
ret
>= 0);
82
return
ff_adts_header_parse
(&gb, hdr);
83
}
AV_AAC_ADTS_HEADER_SIZE
#define AV_AAC_ADTS_HEADER_SIZE
Definition:
adts_parser.h:25
av_unused
#define av_unused
Definition:
attributes.h:131
AACADTSHeaderInfo::samples
uint32_t samples
Definition:
adts_header.h:37
AACADTSHeaderInfo::bit_rate
uint32_t bit_rate
Definition:
adts_header.h:38
AAC_PARSE_ERROR_FRAME_SIZE
@ AAC_PARSE_ERROR_FRAME_SIZE
Definition:
adts_header.h:32
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition:
get_bits.h:381
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition:
get_bits.h:335
mpeg4audio.h
ff_adts_header_parse
int ff_adts_header_parse(GetBitContext *gbc, AACADTSHeaderInfo *hdr)
Parse the ADTS frame header to the end of the variable header, which is the first 54 bits.
Definition:
adts_header.c:30
GetBitContext
Definition:
get_bits.h:108
avassert.h
AACADTSHeaderInfo::chan_config
uint8_t chan_config
Definition:
adts_header.h:42
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition:
get_bits.h:545
ff_adts_header_parse_buf
int ff_adts_header_parse_buf(const uint8_t buf[AV_AAC_ADTS_HEADER_SIZE+AV_INPUT_BUFFER_PADDING_SIZE], AACADTSHeaderInfo *hdr)
Wrapper around ff_adts_header_parse() for users that don't already have a suitable GetBitContext.
Definition:
adts_header.c:76
get_bits.h
AACADTSHeaderInfo::num_aac_frames
uint8_t num_aac_frames
Definition:
adts_header.h:43
AACADTSHeaderInfo::sampling_index
uint8_t sampling_index
Definition:
adts_header.h:41
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition:
get_bits.h:388
AACADTSHeaderInfo::frame_length
uint32_t frame_length
Definition:
adts_header.h:44
size
int size
Definition:
twinvq_data.h:10344
skip_bits1
static void skip_bits1(GetBitContext *s)
Definition:
get_bits.h:413
AACADTSHeaderInfo::object_type
uint8_t object_type
Definition:
adts_header.h:40
AAC_PARSE_ERROR_SYNC
@ AAC_PARSE_ERROR_SYNC
Definition:
adts_header.h:30
AAC_PARSE_ERROR_SAMPLE_RATE
@ AAC_PARSE_ERROR_SAMPLE_RATE
Definition:
adts_header.h:31
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition:
avassert.h:56
AACADTSHeaderInfo::sample_rate
uint32_t sample_rate
Definition:
adts_header.h:36
ret
ret
Definition:
filter_design.txt:187
adts_parser.h
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition:
defs.h:40
AACADTSHeaderInfo::crc_absent
uint8_t crc_absent
Definition:
adts_header.h:39
ff_mpeg4audio_sample_rates
const int ff_mpeg4audio_sample_rates[16]
Definition:
mpeg4audio_sample_rates.h:26
adts_header.h
AACADTSHeaderInfo
Definition:
adts_header.h:35
Generated on Wed Nov 13 2024 19:21:40 for FFmpeg by
1.8.17