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
mpegaudio_parser.c
Go to the documentation of this file.
1
/*
2
* MPEG Audio 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 "
parser.h
"
24
#include "
mpegaudiodecheader.h
"
25
#include "
libavutil/common.h
"
26
27
28
typedef
struct
MpegAudioParseContext
{
29
ParseContext
pc
;
30
int
frame_size
;
31
uint32_t
header
;
32
int
header_count
;
33
int
no_bitrate
;
34
}
MpegAudioParseContext
;
35
36
#define MPA_HEADER_SIZE 4
37
38
/* header + layer + bitrate + freq + lsf/mpeg25 */
39
#define SAME_HEADER_MASK \
40
(0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19))
41
42
static
int
mpegaudio_parse
(
AVCodecParserContext
*
s1
,
43
AVCodecContext
*avctx,
44
const
uint8_t
**poutbuf,
int
*poutbuf_size,
45
const
uint8_t
*
buf
,
int
buf_size)
46
{
47
MpegAudioParseContext
*
s
= s1->
priv_data
;
48
ParseContext
*pc = &s->
pc
;
49
uint32_t
state
= pc->
state
;
50
int
i;
51
int
next=
END_NOT_FOUND
;
52
53
for
(i=0; i<buf_size; ){
54
if
(s->
frame_size
){
55
int
inc=
FFMIN
(buf_size - i, s->
frame_size
);
56
i += inc;
57
s->
frame_size
-= inc;
58
state = 0;
59
60
if
(!s->
frame_size
){
61
next= i;
62
break
;
63
}
64
}
else
{
65
while
(i<buf_size){
66
int
ret
, sr, channels, bit_rate,
frame_size
;
67
enum
AVCodecID
codec_id
;
68
69
state= (state<<8) + buf[i++];
70
71
ret =
avpriv_mpa_decode_header2
(state, &sr, &channels, &frame_size, &bit_rate, &codec_id);
72
if
(ret < 4) {
73
if
(i > 4)
74
s->
header_count
= -2;
75
}
else
{
76
int
header_threshold = avctx->
codec_id
!=
AV_CODEC_ID_NONE
&& avctx->
codec_id
!=
codec_id
;
77
if
((state&
SAME_HEADER_MASK
) != (s->
header
&SAME_HEADER_MASK) && s->
header
)
78
s->
header_count
= -3;
79
s->
header
=
state
;
80
s->
header_count
++;
81
s->
frame_size
= ret-4;
82
83
if
(s->
header_count
> header_threshold) {
84
avctx->
sample_rate
= sr;
85
avctx->
channels
= channels;
86
s1->
duration
=
frame_size
;
87
avctx->
codec_id
=
codec_id
;
88
if
(s->
no_bitrate
|| !avctx->
bit_rate
) {
89
s->
no_bitrate
= 1;
90
avctx->
bit_rate
+= (bit_rate - avctx->
bit_rate
) / (s->
header_count
- header_threshold);
91
}
92
}
93
break
;
94
}
95
}
96
}
97
}
98
99
pc->
state
=
state
;
100
if
(
ff_combine_frame
(pc, next, &buf, &buf_size) < 0) {
101
*poutbuf = NULL;
102
*poutbuf_size = 0;
103
return
buf_size;
104
}
105
106
*poutbuf =
buf
;
107
*poutbuf_size = buf_size;
108
return
next;
109
}
110
111
112
AVCodecParser
ff_mpegaudio_parser
= {
113
.
codec_ids
= {
AV_CODEC_ID_MP1
,
AV_CODEC_ID_MP2
,
AV_CODEC_ID_MP3
},
114
.priv_data_size =
sizeof
(
MpegAudioParseContext
),
115
.parser_parse =
mpegaudio_parse
,
116
.parser_close =
ff_parse_close
,
117
};
Generated on Fri Dec 5 2014 04:41:59 for FFmpeg by
1.8.2