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
epafdec.c
Go to the documentation of this file.
1
/*
2
* Ensoniq Paris Audio File demuxer
3
* Copyright (c) 2012 Paul B Mahol
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 "
libavutil/intreadwrite.h
"
23
#include "
avformat.h
"
24
#include "
internal.h
"
25
#include "
pcm.h
"
26
27
static
int
epaf_probe
(
AVProbeData
*p)
28
{
29
if
(((
AV_RL32
(p->
buf
) ==
MKTAG
(
'f'
,
'a'
,
'p'
,
' '
) &&
30
AV_RL32
(p->
buf
+ 8) == 1) ||
31
(
AV_RL32
(p->
buf
) ==
MKTAG
(
' '
,
'p'
,
'a'
,
'f'
) &&
32
AV_RN32
(p->
buf
+ 8) == 0)) &&
33
!
AV_RN32
(p->
buf
+ 4) &&
AV_RN32
(p->
buf
+ 12) &&
34
AV_RN32
(p->
buf
+ 20))
35
return
AVPROBE_SCORE_MAX
/ 4 * 3;
36
return
0;
37
}
38
39
static
int
epaf_read_header
(
AVFormatContext
*s)
40
{
41
int
le
,
sample_rate
, codec, channels;
42
AVStream
*st;
43
44
avio_skip
(s->
pb
, 4);
45
if
(
avio_rl32
(s->
pb
))
46
return
AVERROR_INVALIDDATA
;
47
48
le =
avio_rl32
(s->
pb
);
49
if
(le && le != 1)
50
return
AVERROR_INVALIDDATA
;
51
52
if
(le) {
53
sample_rate =
avio_rl32
(s->
pb
);
54
codec =
avio_rl32
(s->
pb
);
55
channels =
avio_rl32
(s->
pb
);
56
}
else
{
57
sample_rate =
avio_rb32
(s->
pb
);
58
codec =
avio_rb32
(s->
pb
);
59
channels =
avio_rb32
(s->
pb
);
60
}
61
62
if
(!channels || !sample_rate)
63
return
AVERROR_INVALIDDATA
;
64
65
st =
avformat_new_stream
(s,
NULL
);
66
if
(!st)
67
return
AVERROR
(ENOMEM);
68
69
st->
codec
->
codec_type
=
AVMEDIA_TYPE_AUDIO
;
70
st->
codec
->
channels
= channels;
71
st->
codec
->
sample_rate
=
sample_rate
;
72
switch
(codec) {
73
case
0:
74
st->
codec
->
codec_id
= le ?
AV_CODEC_ID_PCM_S16LE
:
AV_CODEC_ID_PCM_S16BE
;
75
break
;
76
case
2:
77
st->
codec
->
codec_id
=
AV_CODEC_ID_PCM_S8
;
78
break
;
79
case
1:
80
av_log_missing_feature
(s,
"24-bit Paris PCM format"
, 1);
81
default
:
82
return
AVERROR_INVALIDDATA
;
83
}
84
85
st->
codec
->
bits_per_coded_sample
=
av_get_bits_per_sample
(st->
codec
->
codec_id
);
86
st->
codec
->
block_align
= st->
codec
->
bits_per_coded_sample
* st->
codec
->
channels
/ 8;
87
88
avpriv_set_pts_info
(st, 64, 1, st->
codec
->
sample_rate
);
89
90
if
(
avio_skip
(s->
pb
, 2024) < 0)
91
return
AVERROR_INVALIDDATA
;
92
return
0;
93
}
94
95
AVInputFormat
ff_epaf_demuxer
= {
96
.
name
=
"epaf"
,
97
.long_name =
NULL_IF_CONFIG_SMALL
(
"Ensoniq Paris Audio File"
),
98
.read_probe =
epaf_probe
,
99
.read_header =
epaf_read_header
,
100
.read_packet =
ff_pcm_read_packet
,
101
.read_seek =
ff_pcm_read_seek
,
102
.extensions =
"paf,fap"
,
103
.flags =
AVFMT_GENERIC_INDEX
,
104
};
Generated on Sat May 25 2013 04:01:17 for FFmpeg by
1.8.2