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
TTAContext
{
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
int64_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
if
(start_offset < 0)
66
return
start_offset;
67
ffio_init_checksum
(s->
pb
,
tta_check_crc
, UINT32_MAX);
68
if
(
avio_rl32
(s->
pb
) !=
AV_RL32
(
"TTA1"
))
69
return
AVERROR_INVALIDDATA
;
70
71
avio_skip
(s->
pb
, 2);
// FIXME: flags
72
channels =
avio_rl16
(s->
pb
);
73
bps =
avio_rl16
(s->
pb
);
74
samplerate =
avio_rl32
(s->
pb
);
75
if
(samplerate <= 0 || samplerate > 1000000){
76
av_log
(s,
AV_LOG_ERROR
,
"nonsense samplerate\n"
);
77
return
AVERROR_INVALIDDATA
;
78
}
79
80
nb_samples =
avio_rl32
(s->
pb
);
81
if
(!nb_samples) {
82
av_log
(s,
AV_LOG_ERROR
,
"invalid number of samples\n"
);
83
return
AVERROR_INVALIDDATA
;
84
}
85
86
crc =
ffio_get_checksum
(s->
pb
) ^ UINT32_MAX;
87
if
(crc !=
avio_rl32
(s->
pb
) && s->
error_recognition
&
AV_EF_CRCCHECK
) {
88
av_log
(s,
AV_LOG_ERROR
,
"Header CRC error\n"
);
89
return
AVERROR_INVALIDDATA
;
90
}
91
92
c->
frame_size
= samplerate * 256 / 245;
93
c->
last_frame_size
= nb_samples % c->
frame_size
;
94
if
(!c->
last_frame_size
)
95
c->
last_frame_size
= c->
frame_size
;
96
c->
totalframes
= nb_samples / c->
frame_size
+ (c->
last_frame_size
< c->
frame_size
);
97
c->
currentframe
= 0;
98
99
if
(c->
totalframes
>= UINT_MAX/
sizeof
(uint32_t) || c->
totalframes
<= 0){
100
av_log
(s,
AV_LOG_ERROR
,
"totalframes %d invalid\n"
, c->
totalframes
);
101
return
AVERROR_INVALIDDATA
;
102
}
103
104
st =
avformat_new_stream
(s,
NULL
);
105
if
(!st)
106
return
AVERROR
(ENOMEM);
107
108
avpriv_set_pts_info
(st, 64, 1, samplerate);
109
st->
start_time
= 0;
110
st->
duration
= nb_samples;
111
112
framepos =
avio_tell
(s->
pb
);
113
if
(framepos < 0)
114
return
framepos;
115
framepos += 4 * c->
totalframes
+ 4;
116
117
if
(
ff_alloc_extradata
(st->
codec
,
avio_tell
(s->
pb
) - start_offset))
118
return
AVERROR
(ENOMEM);
119
120
avio_seek
(s->
pb
, start_offset, SEEK_SET);
121
avio_read
(s->
pb
, st->
codec
->
extradata
, st->
codec
->
extradata_size
);
122
123
ffio_init_checksum
(s->
pb
,
tta_check_crc
, UINT32_MAX);
124
for
(i = 0; i < c->
totalframes
; i++) {
125
uint32_t
size
=
avio_rl32
(s->
pb
);
126
int
r
;
127
if
((r =
av_add_index_entry
(st, framepos, i * c->
frame_size
, size, 0,
128
AVINDEX_KEYFRAME
)) < 0)
129
return
r
;
130
framepos +=
size
;
131
}
132
crc =
ffio_get_checksum
(s->
pb
) ^ UINT32_MAX;
133
if
(crc !=
avio_rl32
(s->
pb
) && s->
error_recognition
&
AV_EF_CRCCHECK
) {
134
av_log
(s,
AV_LOG_ERROR
,
"Seek table CRC error\n"
);
135
return
AVERROR_INVALIDDATA
;
136
}
137
138
st->
codec
->
codec_type
=
AVMEDIA_TYPE_AUDIO
;
139
st->
codec
->
codec_id
=
AV_CODEC_ID_TTA
;
140
st->
codec
->
channels
= channels;
141
st->
codec
->
sample_rate
= samplerate;
142
st->
codec
->
bits_per_coded_sample
=
bps
;
143
144
if
(s->
pb
->
seekable
) {
145
int64_t pos =
avio_tell
(s->
pb
);
146
ff_ape_parse_tag
(s);
147
avio_seek
(s->
pb
, pos, SEEK_SET);
148
}
149
150
return
0;
151
}
152
153
static
int
tta_read_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
154
{
155
TTAContext
*
c
= s->
priv_data
;
156
AVStream
*st = s->
streams
[0];
157
int
size
,
ret
;
158
159
// FIXME!
160
if
(c->
currentframe
>= c->
totalframes
)
161
return
AVERROR_EOF
;
162
163
if
(st->
nb_index_entries
< c->
totalframes
) {
164
av_log
(s,
AV_LOG_ERROR
,
"Index entry disappeared\n"
);
165
return
AVERROR_INVALIDDATA
;
166
}
167
168
size = st->
index_entries
[c->
currentframe
].
size
;
169
170
ret =
av_get_packet
(s->
pb
, pkt, size);
171
pkt->
dts
= st->
index_entries
[c->
currentframe
++].
timestamp
;
172
pkt->
duration
= c->
currentframe
== c->
totalframes
? c->
last_frame_size
:
173
c->
frame_size
;
174
return
ret
;
175
}
176
177
static
int
tta_read_seek
(
AVFormatContext
*
s
,
int
stream_index, int64_t timestamp,
int
flags
)
178
{
179
TTAContext
*
c
= s->
priv_data
;
180
AVStream
*st = s->
streams
[stream_index];
181
int
index
=
av_index_search_timestamp
(st, timestamp, flags);
182
if
(index < 0)
183
return
-1;
184
if
(
avio_seek
(s->
pb
, st->
index_entries
[index].
pos
, SEEK_SET) < 0)
185
return
-1;
186
187
c->
currentframe
=
index
;
188
189
return
0;
190
}
191
192
AVInputFormat
ff_tta_demuxer
= {
193
.
name
=
"tta"
,
194
.long_name =
NULL_IF_CONFIG_SMALL
(
"TTA (True Audio)"
),
195
.priv_data_size =
sizeof
(
TTAContext
),
196
.
read_probe
=
tta_probe
,
197
.
read_header
=
tta_read_header
,
198
.
read_packet
=
tta_read_packet
,
199
.
read_seek
=
tta_read_seek
,
200
.extensions =
"tta"
,
201
};
Generated on Sun Mar 8 2015 02:35:00 for FFmpeg by
1.8.2