FFmpeg
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavformat
oggparsecelt.c
Go to the documentation of this file.
1
/*
2
* Xiph CELT parser for Ogg
3
* Copyright (c) 2011 Nicolas George
4
*
5
* This file is part of FFmpeg.
6
*
7
* FFmpeg is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
11
*
12
* FFmpeg is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with FFmpeg; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
22
#include <string.h>
23
24
#include "
libavutil/intreadwrite.h
"
25
#include "
avformat.h
"
26
#include "
internal.h
"
27
#include "
oggdec.h
"
28
29
struct
oggcelt_private
{
30
int
extra_headers_left
;
31
};
32
33
static
int
celt_header
(
AVFormatContext
*s,
int
idx)
34
{
35
struct
ogg
*
ogg
= s->
priv_data
;
36
struct
ogg_stream
*os = ogg->
streams
+ idx;
37
AVStream
*st = s->
streams
[idx];
38
struct
oggcelt_private
*priv = os->
private
;
39
uint8_t
*p = os->
buf
+ os->
pstart
;
40
41
if
(os->
psize
== 60 &&
42
!memcmp(p,
ff_celt_codec
.
magic
,
ff_celt_codec
.
magicsize
)) {
43
/* Main header */
44
45
uint32_t
version
,
sample_rate
,
nb_channels
,
frame_size
;
46
uint32_t overlap, extra_headers;
47
uint8_t
*extradata;
48
49
extradata =
av_malloc
(2 *
sizeof
(uint32_t) +
50
FF_INPUT_BUFFER_PADDING_SIZE
);
51
priv =
av_malloc
(
sizeof
(
struct
oggcelt_private
));
52
if
(!extradata || !priv) {
53
av_free
(extradata);
54
av_free
(priv);
55
return
AVERROR
(ENOMEM);
56
}
57
version =
AV_RL32
(p + 28);
58
/* unused header size field skipped */
59
sample_rate =
AV_RL32
(p + 36);
60
nb_channels =
AV_RL32
(p + 40);
61
frame_size =
AV_RL32
(p + 44);
62
overlap =
AV_RL32
(p + 48);
63
/* unused bytes per packet field skipped */
64
extra_headers =
AV_RL32
(p + 56);
65
st->
codec
->
codec_type
=
AVMEDIA_TYPE_AUDIO
;
66
st->
codec
->
codec_id
=
AV_CODEC_ID_CELT
;
67
st->
codec
->
sample_rate
=
sample_rate
;
68
st->
codec
->
channels
=
nb_channels
;
69
st->
codec
->
frame_size
=
frame_size
;
70
av_free
(st->
codec
->
extradata
);
71
st->
codec
->
extradata
= extradata;
72
st->
codec
->
extradata_size
= 2 *
sizeof
(uint32_t);
73
if
(sample_rate)
74
avpriv_set_pts_info
(st, 64, 1, sample_rate);
75
priv->
extra_headers_left
= 1 + extra_headers;
76
av_free
(os->
private
);
77
os->
private
= priv;
78
AV_WL32
(extradata + 0, overlap);
79
AV_WL32
(extradata + 4, version);
80
return
1;
81
}
else
if
(priv && priv->
extra_headers_left
) {
82
/* Extra headers (vorbiscomment) */
83
84
ff_vorbis_comment
(s, &st->
metadata
, p, os->
psize
);
85
priv->
extra_headers_left
--;
86
return
1;
87
}
else
{
88
return
0;
89
}
90
}
91
92
const
struct
ogg_codec
ff_celt_codec
= {
93
.
magic
=
"CELT "
,
94
.magicsize = 8,
95
.header =
celt_header
,
96
.nb_header = 2,
97
};
Generated on Sat May 25 2013 04:01:18 for FFmpeg by
1.8.2