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