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
68
state= (state<<8) + buf[i++];
69
70
ret =
avpriv_mpa_decode_header
(avctx, state, &sr, &channels, &frame_size, &bit_rate);
71
if
(ret < 4) {
72
if
(i > 4)
73
s->
header_count
= -2;
74
}
else
{
75
if
((state&
SAME_HEADER_MASK
) != (s->
header
&SAME_HEADER_MASK) && s->
header
)
76
s->
header_count
= -3;
77
s->
header
=
state
;
78
s->
header_count
++;
79
s->
frame_size
= ret-4;
80
81
if
(s->
header_count
> 0) {
82
avctx->
sample_rate
= sr;
83
avctx->
channels
= channels;
84
s1->
duration
=
frame_size
;
85
if
(s->
no_bitrate
|| !avctx->
bit_rate
) {
86
s->
no_bitrate
= 1;
87
avctx->
bit_rate
+= (bit_rate - avctx->
bit_rate
) / s->
header_count
;
88
}
89
}
90
break
;
91
}
92
}
93
}
94
}
95
96
pc->
state
=
state
;
97
if
(
ff_combine_frame
(pc, next, &buf, &buf_size) < 0) {
98
*poutbuf = NULL;
99
*poutbuf_size = 0;
100
return
buf_size;
101
}
102
103
*poutbuf =
buf
;
104
*poutbuf_size = buf_size;
105
return
next;
106
}
107
108
109
AVCodecParser
ff_mpegaudio_parser
= {
110
.
codec_ids
= {
AV_CODEC_ID_MP1
,
AV_CODEC_ID_MP2
,
AV_CODEC_ID_MP3
},
111
.priv_data_size =
sizeof
(
MpegAudioParseContext
),
112
.parser_parse =
mpegaudio_parse
,
113
.parser_close =
ff_parse_close
,
114
};
Generated on Sat Jan 25 2014 19:51:52 for FFmpeg by
1.8.2