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
xa.c
Go to the documentation of this file.
1
/*
2
* Maxis XA (.xa) File Demuxer
3
* Copyright (c) 2008 Robert Marston
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
/**
23
* @file
24
* Maxis XA File Demuxer
25
* by Robert Marston (rmarston@gmail.com)
26
* for more information on the XA audio format see
27
* http://wiki.multimedia.cx/index.php?title=Maxis_XA
28
*/
29
30
#include "
libavutil/intreadwrite.h
"
31
#include "
avformat.h
"
32
#include "
internal.h
"
33
34
#define XA00_TAG MKTAG('X', 'A', 0, 0)
35
#define XAI0_TAG MKTAG('X', 'A', 'I', 0)
36
#define XAJ0_TAG MKTAG('X', 'A', 'J', 0)
37
38
typedef
struct
MaxisXADemuxContext
{
39
uint32_t
out_size
;
40
uint32_t
sent_bytes
;
41
}
MaxisXADemuxContext
;
42
43
static
int
xa_probe
(
AVProbeData
*p)
44
{
45
int
channels, srate, bits_per_sample;
46
if
(p->
buf_size
< 24)
47
return
0;
48
switch
(
AV_RL32
(p->
buf
)) {
49
case
XA00_TAG
:
50
case
XAI0_TAG
:
51
case
XAJ0_TAG
:
52
break
;
53
default
:
54
return
0;
55
}
56
channels =
AV_RL16
(p->
buf
+ 10);
57
srate =
AV_RL32
(p->
buf
+ 12);
58
bits_per_sample =
AV_RL16
(p->
buf
+ 22);
59
if
(!channels || channels > 8 || !srate || srate > 192000 ||
60
bits_per_sample < 4 || bits_per_sample > 32)
61
return
0;
62
return
AVPROBE_SCORE_EXTENSION
;
63
}
64
65
static
int
xa_read_header
(
AVFormatContext
*
s
)
66
{
67
MaxisXADemuxContext
*xa = s->
priv_data
;
68
AVIOContext
*pb = s->
pb
;
69
AVStream
*st;
70
71
/*Set up the XA Audio Decoder*/
72
st =
avformat_new_stream
(s,
NULL
);
73
if
(!st)
74
return
AVERROR
(ENOMEM);
75
76
st->
codec
->
codec_type
=
AVMEDIA_TYPE_AUDIO
;
77
st->
codec
->
codec_id
=
AV_CODEC_ID_ADPCM_EA_MAXIS_XA
;
78
avio_skip
(pb, 4);
/* Skip the XA ID */
79
xa->
out_size
=
avio_rl32
(pb);
80
avio_skip
(pb, 2);
/* Skip the tag */
81
st->
codec
->
channels
=
avio_rl16
(pb);
82
st->
codec
->
sample_rate
=
avio_rl32
(pb);
83
avio_skip
(pb, 4);
/* Skip average byte rate */
84
avio_skip
(pb, 2);
/* Skip block align */
85
avio_skip
(pb, 2);
/* Skip bits-per-sample */
86
87
if
(!st->
codec
->
channels
|| !st->
codec
->
sample_rate
)
88
return
AVERROR_INVALIDDATA
;
89
90
st->
codec
->
bit_rate
= av_clip(15LL * st->
codec
->
channels
* 8 *
91
st->
codec
->
sample_rate
/ 28, 0, INT_MAX);
92
93
avpriv_set_pts_info
(st, 64, 1, st->
codec
->
sample_rate
);
94
st->
start_time
= 0;
95
96
return
0;
97
}
98
99
static
int
xa_read_packet
(
AVFormatContext
*
s
,
100
AVPacket
*
pkt
)
101
{
102
MaxisXADemuxContext
*xa = s->
priv_data
;
103
AVStream
*st = s->
streams
[0];
104
AVIOContext
*pb = s->
pb
;
105
unsigned
int
packet_size;
106
int
ret
;
107
108
if
(xa->
sent_bytes
>= xa->
out_size
)
109
return
AVERROR_EOF
;
110
/* 1 byte header and 14 bytes worth of samples * number channels per block */
111
packet_size = 15*st->
codec
->
channels
;
112
113
ret =
av_get_packet
(pb, pkt, packet_size);
114
if
(ret < 0)
115
return
ret
;
116
117
pkt->
stream_index
= st->
index
;
118
xa->
sent_bytes
+= packet_size;
119
pkt->
duration
= 28;
120
121
return
ret
;
122
}
123
124
AVInputFormat
ff_xa_demuxer
= {
125
.
name
=
"xa"
,
126
.long_name =
NULL_IF_CONFIG_SMALL
(
"Maxis XA"
),
127
.priv_data_size =
sizeof
(
MaxisXADemuxContext
),
128
.
read_probe
=
xa_probe
,
129
.
read_header
=
xa_read_header
,
130
.
read_packet
=
xa_read_packet
,
131
};
Generated on Sun Mar 8 2015 02:35:13 for FFmpeg by
1.8.2