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
if
((state&
SAME_HEADER_MASK
) != (s->
header
&SAME_HEADER_MASK) && s->
header
)
77
s->
header_count
= -3;
78
s->
header
=
state
;
79
s->
header_count
++;
80
s->
frame_size
= ret-4;
81
82
if
(s->
header_count
> 0 + (avctx->
codec_id
!=
AV_CODEC_ID_NONE
&& avctx->
codec_id
!= codec_id)) {
83
avctx->
sample_rate
= sr;
84
avctx->
channels
= channels;
85
s1->
duration
=
frame_size
;
86
avctx->
codec_id
=
codec_id
;
87
if
(s->
no_bitrate
|| !avctx->
bit_rate
) {
88
s->
no_bitrate
= 1;
89
avctx->
bit_rate
+= (bit_rate - avctx->
bit_rate
) / s->
header_count
;
90
}
91
}
92
break
;
93
}
94
}
95
}
96
}
97
98
pc->
state
=
state
;
99
if
(
ff_combine_frame
(pc, next, &buf, &buf_size) < 0) {
100
*poutbuf = NULL;
101
*poutbuf_size = 0;
102
return
buf_size;
103
}
104
105
*poutbuf =
buf
;
106
*poutbuf_size = buf_size;
107
return
next;
108
}
109
110
111
AVCodecParser
ff_mpegaudio_parser
= {
112
.
codec_ids
= {
AV_CODEC_ID_MP1
,
AV_CODEC_ID_MP2
,
AV_CODEC_ID_MP3
},
113
.priv_data_size =
sizeof
(
MpegAudioParseContext
),
114
.parser_parse =
mpegaudio_parse
,
115
.parser_close =
ff_parse_close
,
116
};
Generated on Sun Jul 20 2014 23:05:51 for FFmpeg by
1.8.2