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
tta.c
Go to the documentation of this file.
1
/*
2
* TTA demuxer
3
* Copyright (c) 2006 Alex Beregszaszi
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 "
libavcodec/get_bits.h
"
23
#include "
apetag.h
"
24
#include "
avformat.h
"
25
#include "
avio_internal.h
"
26
#include "
internal.h
"
27
#include "
id3v1.h
"
28
#include "
libavutil/crc.h
"
29
#include "
libavutil/dict.h
"
30
31
typedef
struct
{
32
int
totalframes
, currentframe;
33
int
frame_size
;
34
int
last_frame_size
;
35
}
TTAContext
;
36
37
static
unsigned
long
tta_check_crc
(
unsigned
long
checksum,
const
uint8_t
*
buf
,
38
unsigned
int
len
)
39
{
40
return
av_crc
(
av_crc_get_table
(
AV_CRC_32_IEEE_LE
), checksum, buf, len);
41
}
42
43
static
int
tta_probe
(
AVProbeData
*p)
44
{
45
if
(
AV_RL32
(&p->
buf
[0]) ==
MKTAG
(
'T'
,
'T'
,
'A'
,
'1'
) &&
46
(
AV_RL16
(&p->
buf
[4]) == 1 ||
AV_RL16
(&p->
buf
[4]) == 2) &&
47
AV_RL16
(&p->
buf
[6]) > 0 &&
48
AV_RL16
(&p->
buf
[8]) > 0 &&
49
AV_RL32
(&p->
buf
[10]) > 0)
50
return
AVPROBE_SCORE_EXTENSION
+ 30;
51
return
0;
52
}
53
54
static
int
tta_read_header
(
AVFormatContext
*
s
)
55
{
56
TTAContext
*
c
= s->
priv_data
;
57
AVStream
*st;
58
int
i, channels,
bps
, samplerate;
59
uint64_t framepos, start_offset;
60
uint32_t nb_samples, crc;
61
62
ff_id3v1_read
(s);
63
64
start_offset =
avio_tell
(s->
pb
);
65
ffio_init_checksum
(s->
pb
,
tta_check_crc
, UINT32_MAX);
66
if
(
avio_rl32
(s->
pb
) !=
AV_RL32
(
"TTA1"
))
67
return
AVERROR_INVALIDDATA
;
68
69
avio_skip
(s->
pb
, 2);
// FIXME: flags
70
channels =
avio_rl16
(s->
pb
);
71
bps =
avio_rl16
(s->
pb
);
72
samplerate =
avio_rl32
(s->
pb
);
73
if
(samplerate <= 0 || samplerate > 1000000){
74
av_log
(s,
AV_LOG_ERROR
,
"nonsense samplerate\n"
);
75
return
AVERROR_INVALIDDATA
;
76
}
77
78
nb_samples =
avio_rl32
(s->
pb
);
79
if
(!nb_samples) {
80
av_log
(s,
AV_LOG_ERROR
,
"invalid number of samples\n"
);
81
return
AVERROR_INVALIDDATA
;
82
}
83
84
crc =
ffio_get_checksum
(s->
pb
) ^ UINT32_MAX;
85
if
(crc !=
avio_rl32
(s->
pb
)) {
86
av_log
(s,
AV_LOG_ERROR
,
"Header CRC error\n"
);
87
return
AVERROR_INVALIDDATA
;
88
}
89
90
c->
frame_size
= samplerate * 256 / 245;
91
c->
last_frame_size
= nb_samples % c->
frame_size
;
92
if
(!c->
last_frame_size
)
93
c->
last_frame_size
= c->
frame_size
;
94
c->
totalframes
= nb_samples / c->
frame_size
+ (c->
last_frame_size
< c->
frame_size
);
95
c->
currentframe
= 0;
96
97
if
(c->
totalframes
>= UINT_MAX/
sizeof
(uint32_t) || c->
totalframes
<= 0){
98
av_log
(s,
AV_LOG_ERROR
,
"totalframes %d invalid\n"
, c->
totalframes
);
99
return
AVERROR_INVALIDDATA
;
100
}
101
102
st =
avformat_new_stream
(s, NULL);
103
if
(!st)
104
return
AVERROR
(ENOMEM);
105
106
avpriv_set_pts_info
(st, 64, 1, samplerate);
107
st->
start_time
= 0;
108
st->
duration
= nb_samples;
109
110
framepos =
avio_tell
(s->
pb
) + 4*c->
totalframes
+ 4;
111
112
st->
codec
->
extradata_size
=
avio_tell
(s->
pb
) - start_offset;
113
st->
codec
->
extradata
=
av_mallocz
(st->
codec
->
extradata_size
+
FF_INPUT_BUFFER_PADDING_SIZE
);
114
if
(!st->
codec
->
extradata
) {
115
st->
codec
->
extradata_size
= 0;
116
return
AVERROR
(ENOMEM);
117
}
118
119
avio_seek
(s->
pb
, start_offset, SEEK_SET);
120
avio_read
(s->
pb
, st->
codec
->
extradata
, st->
codec
->
extradata_size
);
121
122
ffio_init_checksum
(s->
pb
,
tta_check_crc
, UINT32_MAX);
123
for
(i = 0; i < c->
totalframes
; i++) {
124
uint32_t
size
=
avio_rl32
(s->
pb
);
125
av_add_index_entry
(st, framepos, i * c->
frame_size
, size, 0,
126
AVINDEX_KEYFRAME
);
127
framepos +=
size
;
128
}
129
crc =
ffio_get_checksum
(s->
pb
) ^ UINT32_MAX;
130
if
(crc !=
avio_rl32
(s->
pb
)) {
131
av_log
(s,
AV_LOG_ERROR
,
"Seek table CRC error\n"
);
132
return
AVERROR_INVALIDDATA
;
133
}
134
135
st->
codec
->
codec_type
=
AVMEDIA_TYPE_AUDIO
;
136
st->
codec
->
codec_id
=
AV_CODEC_ID_TTA
;
137
st->
codec
->
channels
= channels;
138
st->
codec
->
sample_rate
= samplerate;
139
st->
codec
->
bits_per_coded_sample
=
bps
;
140
141
if
(s->
pb
->
seekable
) {
142
int64_t pos =
avio_tell
(s->
pb
);
143
ff_ape_parse_tag
(s);
144
avio_seek
(s->
pb
, pos, SEEK_SET);
145
}
146
147
return
0;
148
}
149
150
static
int
tta_read_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
151
{
152
TTAContext
*
c
= s->
priv_data
;
153
AVStream
*st = s->
streams
[0];
154
int
size
,
ret
;
155
156
// FIXME!
157
if
(c->
currentframe
>= c->
totalframes
)
158
return
AVERROR_EOF
;
159
160
size = st->
index_entries
[c->
currentframe
].
size
;
161
162
ret =
av_get_packet
(s->
pb
, pkt, size);
163
pkt->
dts
= st->
index_entries
[c->
currentframe
++].
timestamp
;
164
pkt->
duration
= c->
currentframe
== c->
totalframes
? c->
last_frame_size
:
165
c->
frame_size
;
166
return
ret
;
167
}
168
169
static
int
tta_read_seek
(
AVFormatContext
*
s
,
int
stream_index, int64_t timestamp,
int
flags
)
170
{
171
TTAContext
*
c
= s->
priv_data
;
172
AVStream
*st = s->
streams
[stream_index];
173
int
index
=
av_index_search_timestamp
(st, timestamp, flags);
174
if
(index < 0)
175
return
-1;
176
if
(
avio_seek
(s->
pb
, st->
index_entries
[index].
pos
, SEEK_SET) < 0)
177
return
-1;
178
179
c->
currentframe
=
index
;
180
181
return
0;
182
}
183
184
AVInputFormat
ff_tta_demuxer
= {
185
.
name
=
"tta"
,
186
.long_name =
NULL_IF_CONFIG_SMALL
(
"TTA (True Audio)"
),
187
.priv_data_size =
sizeof
(
TTAContext
),
188
.
read_probe
=
tta_probe
,
189
.
read_header
=
tta_read_header
,
190
.
read_packet
=
tta_read_packet
,
191
.
read_seek
=
tta_read_seek
,
192
.extensions =
"tta"
,
193
};
Generated on Wed Jul 10 2013 23:48:05 for FFmpeg by
1.8.2