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
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_MAX
/2;
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
st->
codec
->
bit_rate
= av_clip(15LL * st->
codec
->
channels
* 8 *
88
st->
codec
->
sample_rate
/ 28, 0, INT_MAX);
89
90
avpriv_set_pts_info
(st, 64, 1, st->
codec
->
sample_rate
);
91
st->
start_time
= 0;
92
93
return
0;
94
}
95
96
static
int
xa_read_packet
(
AVFormatContext
*s,
97
AVPacket
*
pkt
)
98
{
99
MaxisXADemuxContext
*xa = s->
priv_data
;
100
AVStream
*st = s->
streams
[0];
101
AVIOContext
*pb = s->
pb
;
102
unsigned
int
packet_size;
103
int
ret;
104
105
if
(xa->
sent_bytes
>= xa->
out_size
)
106
return
AVERROR_EOF
;
107
/* 1 byte header and 14 bytes worth of samples * number channels per block */
108
packet_size = 15*st->
codec
->
channels
;
109
110
ret =
av_get_packet
(pb, pkt, packet_size);
111
if
(ret < 0)
112
return
ret;
113
114
pkt->
stream_index
= st->
index
;
115
xa->
sent_bytes
+= packet_size;
116
pkt->
duration
= 28;
117
118
return
ret;
119
}
120
121
AVInputFormat
ff_xa_demuxer
= {
122
.
name
=
"xa"
,
123
.long_name =
NULL_IF_CONFIG_SMALL
(
"Maxis XA"
),
124
.priv_data_size =
sizeof
(
MaxisXADemuxContext
),
125
.
read_probe
=
xa_probe
,
126
.
read_header
=
xa_read_header
,
127
.
read_packet
=
xa_read_packet
,
128
};
Generated on Sat May 25 2013 03:58:49 for FFmpeg by
1.8.2