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