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
libavformat
oggparseflac.c
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2005 Matthieu CASTET
3
*
4
* This file is part of FFmpeg.
5
*
6
* FFmpeg is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2.1 of the License, or (at your option) any later version.
10
*
11
* FFmpeg is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with FFmpeg; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
*/
20
21
#include <stdlib.h>
22
#include "
libavcodec/get_bits.h
"
23
#include "
libavcodec/flac.h
"
24
#include "
avformat.h
"
25
#include "
internal.h
"
26
#include "
oggdec.h
"
27
28
#define OGG_FLAC_METADATA_TYPE_STREAMINFO 0x7F
29
30
static
int
31
flac_header
(
AVFormatContext
*
s
,
int
idx)
32
{
33
struct
ogg
*
ogg
= s->
priv_data
;
34
struct
ogg_stream
*os = ogg->
streams
+ idx;
35
AVStream
*st = s->
streams
[idx];
36
GetBitContext
gb;
37
int
mdt;
38
39
if
(os->
buf
[os->
pstart
] == 0xff)
40
return
0;
41
42
init_get_bits
(&gb, os->
buf
+ os->
pstart
, os->
psize
*8);
43
skip_bits1
(&gb);
/* metadata_last */
44
mdt =
get_bits
(&gb, 7);
45
46
if
(mdt ==
OGG_FLAC_METADATA_TYPE_STREAMINFO
) {
47
uint8_t
*streaminfo_start = os->
buf
+ os->
pstart
+ 5 + 4 + 4 + 4;
48
uint32_t samplerate;
49
50
skip_bits_long
(&gb, 4*8);
/* "FLAC" */
51
if
(
get_bits
(&gb, 8) != 1)
/* unsupported major version */
52
return
-1;
53
skip_bits_long
(&gb, 8 + 16);
/* minor version + header count */
54
skip_bits_long
(&gb, 4*8);
/* "fLaC" */
55
56
/* METADATA_BLOCK_HEADER */
57
if
(
get_bits_long
(&gb, 32) !=
FLAC_STREAMINFO_SIZE
)
58
return
-1;
59
60
st->
codec
->
codec_type
=
AVMEDIA_TYPE_AUDIO
;
61
st->
codec
->
codec_id
=
AV_CODEC_ID_FLAC
;
62
st->
need_parsing
=
AVSTREAM_PARSE_HEADERS
;
63
64
if
(
ff_alloc_extradata
(st->
codec
,
FLAC_STREAMINFO_SIZE
) < 0)
65
return
AVERROR
(ENOMEM);
66
memcpy(st->
codec
->
extradata
, streaminfo_start, st->
codec
->
extradata_size
);
67
68
samplerate =
AV_RB24
(st->
codec
->
extradata
+ 10) >> 4;
69
if
(!samplerate)
70
return
AVERROR_INVALIDDATA
;
71
72
avpriv_set_pts_info
(st, 64, 1, samplerate);
73
}
else
if
(mdt ==
FLAC_METADATA_TYPE_VORBIS_COMMENT
) {
74
ff_vorbis_stream_comment
(s, st, os->
buf
+ os->
pstart
+ 4, os->
psize
- 4);
75
}
76
77
return
1;
78
}
79
80
static
int
81
old_flac_header
(
AVFormatContext
*
s
,
int
idx)
82
{
83
struct
ogg
*
ogg
= s->
priv_data
;
84
AVStream
*st = s->
streams
[idx];
85
struct
ogg_stream
*os = ogg->
streams
+ idx;
86
AVCodecParserContext
*parser =
av_parser_init
(
AV_CODEC_ID_FLAC
);
87
int
size
;
88
uint8_t
*
data
;
89
90
if
(!parser)
91
return
-1;
92
93
st->
codec
->
codec_type
=
AVMEDIA_TYPE_AUDIO
;
94
st->
codec
->
codec_id
=
AV_CODEC_ID_FLAC
;
95
96
parser->
flags
=
PARSER_FLAG_COMPLETE_FRAMES
;
97
av_parser_parse2
(parser, st->
codec
,
98
&data, &size, os->
buf
+ os->
pstart
, os->
psize
,
99
AV_NOPTS_VALUE
,
AV_NOPTS_VALUE
, -1);
100
101
av_parser_close
(parser);
102
103
if
(st->
codec
->
sample_rate
) {
104
avpriv_set_pts_info
(st, 64, 1, st->
codec
->
sample_rate
);
105
return
0;
106
}
107
108
return
1;
109
}
110
111
const
struct
ogg_codec
ff_flac_codec
= {
112
.
magic
=
"\177FLAC"
,
113
.magicsize = 5,
114
.header =
flac_header
,
115
.nb_header = 2,
116
};
117
118
const
struct
ogg_codec
ff_old_flac_codec
= {
119
.
magic
=
"fLaC"
,
120
.magicsize = 4,
121
.header =
old_flac_header
,
122
.nb_header = 0,
123
};
Generated on Sun Mar 8 2015 02:35:11 for FFmpeg by
1.8.2