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
act.c
Go to the documentation of this file.
1
/*
2
* ACT file format demuxer
3
* Copyright (c) 2007-2008 Vladimir Voroshilov
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
#include "
avformat.h
"
22
#include "
riff.h
"
23
#include "
internal.h
"
24
#include "
libavcodec/get_bits.h
"
25
26
#define CHUNK_SIZE 512
27
#define RIFF_TAG MKTAG('R','I','F','F')
28
#define WAVE_TAG MKTAG('W','A','V','E')
29
30
typedef
struct
{
31
int
bytes_left_in_chunk
;
32
uint8_t
audio_buffer[22];
///< temporary buffer for ACT frame
33
char
second_packet
;
///< 1 - if temporary buffer contains valid (second) G.729 packet
34
}
ACTContext
;
35
36
static
int
probe
(
AVProbeData
*p)
37
{
38
int
i;
39
40
if
((
AV_RL32
(&p->
buf
[0]) !=
RIFF_TAG
) ||
41
(
AV_RL32
(&p->
buf
[8]) !=
WAVE_TAG
) ||
42
(
AV_RL32
(&p->
buf
[16]) != 16))
43
return
0;
44
45
//We cant be sure that this is ACT and not regular WAV
46
if
(p->
buf_size
<512)
47
return
0;
48
49
for
(i=44; i<256; i++)
50
if
(p->
buf
[i])
51
return
0;
52
53
if
(p->
buf
[256]!=0x84)
54
return
0;
55
56
for
(i=264; i<512; i++)
57
if
(p->
buf
[i])
58
return
0;
59
60
return
AVPROBE_SCORE_MAX
;
61
}
62
63
static
int
read_header
(
AVFormatContext
*s)
64
{
65
ACTContext
* ctx = s->
priv_data
;
66
AVIOContext
*pb = s->
pb
;
67
int
size
;
68
AVStream
* st;
69
70
int
min
,sec,msec;
71
72
st =
avformat_new_stream
(s,
NULL
);
73
if
(!st)
74
return
AVERROR
(ENOMEM);
75
76
avio_skip
(pb, 16);
77
size=
avio_rl32
(pb);
78
ff_get_wav_header
(pb, st->
codec
, size);
79
80
/*
81
8000Hz (Fine-rec) file format has 10 bytes long
82
packets with 10ms of sound data in them
83
*/
84
if
(st->
codec
->
sample_rate
!= 8000) {
85
av_log
(s,
AV_LOG_ERROR
,
"Sample rate %d is not supported.\n"
, st->
codec
->
sample_rate
);
86
return
AVERROR_INVALIDDATA
;
87
}
88
89
st->
codec
->
frame_size
=80;
90
st->
codec
->
channels
=1;
91
avpriv_set_pts_info
(st, 64, 1, 100);
92
93
st->
codec
->
codec_id
=
AV_CODEC_ID_G729
;
94
95
avio_seek
(pb, 257, SEEK_SET);
96
msec=
avio_rl16
(pb);
97
sec=
avio_r8
(pb);
98
min=
avio_rl32
(pb);
99
100
st->
duration
=
av_rescale
(1000*(min*60+sec)+msec, st->
codec
->
sample_rate
, 1000 * st->
codec
->
frame_size
);
101
102
ctx->
bytes_left_in_chunk
=
CHUNK_SIZE
;
103
104
avio_seek
(pb, 512, SEEK_SET);
105
106
return
0;
107
}
108
109
110
static
int
read_packet
(
AVFormatContext
*s,
111
AVPacket
*
pkt
)
112
{
113
ACTContext
*ctx = s->
priv_data
;
114
AVIOContext
*pb = s->
pb
;
115
int
ret;
116
int
frame_size
=s->
streams
[0]->
codec
->
sample_rate
==8000?10:22;
117
118
119
if
(s->
streams
[0]->
codec
->
sample_rate
==8000)
120
ret=
av_new_packet
(pkt, 10);
121
else
122
ret=
av_new_packet
(pkt, 11);
123
124
if
(ret)
125
return
ret;
126
127
if
(s->
streams
[0]->
codec
->
sample_rate
==4400 && !ctx->
second_packet
)
128
{
129
ret =
avio_read
(pb, ctx->
audio_buffer
, frame_size);
130
131
if
(ret<0)
132
return
ret;
133
if
(ret!=frame_size)
134
return
AVERROR
(EIO);
135
136
pkt->
data
[0]=ctx->
audio_buffer
[11];
137
pkt->
data
[1]=ctx->
audio_buffer
[0];
138
pkt->
data
[2]=ctx->
audio_buffer
[12];
139
pkt->
data
[3]=ctx->
audio_buffer
[1];
140
pkt->
data
[4]=ctx->
audio_buffer
[13];
141
pkt->
data
[5]=ctx->
audio_buffer
[2];
142
pkt->
data
[6]=ctx->
audio_buffer
[14];
143
pkt->
data
[7]=ctx->
audio_buffer
[3];
144
pkt->
data
[8]=ctx->
audio_buffer
[15];
145
pkt->
data
[9]=ctx->
audio_buffer
[4];
146
pkt->
data
[10]=ctx->
audio_buffer
[16];
147
148
ctx->
second_packet
=1;
149
}
150
else
if
(s->
streams
[0]->
codec
->
sample_rate
==4400 && ctx->
second_packet
)
151
{
152
pkt->
data
[0]=ctx->
audio_buffer
[5];
153
pkt->
data
[1]=ctx->
audio_buffer
[17];
154
pkt->
data
[2]=ctx->
audio_buffer
[6];
155
pkt->
data
[3]=ctx->
audio_buffer
[18];
156
pkt->
data
[4]=ctx->
audio_buffer
[7];
157
pkt->
data
[5]=ctx->
audio_buffer
[19];
158
pkt->
data
[6]=ctx->
audio_buffer
[8];
159
pkt->
data
[7]=ctx->
audio_buffer
[20];
160
pkt->
data
[8]=ctx->
audio_buffer
[9];
161
pkt->
data
[9]=ctx->
audio_buffer
[21];
162
pkt->
data
[10]=ctx->
audio_buffer
[10];
163
164
ctx->
second_packet
=0;
165
}
166
else
// 8000 Hz
167
{
168
ret =
avio_read
(pb, ctx->
audio_buffer
, frame_size);
169
170
if
(ret<0)
171
return
ret;
172
if
(ret!=frame_size)
173
return
AVERROR
(EIO);
174
175
pkt->
data
[0]=ctx->
audio_buffer
[5];
176
pkt->
data
[1]=ctx->
audio_buffer
[0];
177
pkt->
data
[2]=ctx->
audio_buffer
[6];
178
pkt->
data
[3]=ctx->
audio_buffer
[1];
179
pkt->
data
[4]=ctx->
audio_buffer
[7];
180
pkt->
data
[5]=ctx->
audio_buffer
[2];
181
pkt->
data
[6]=ctx->
audio_buffer
[8];
182
pkt->
data
[7]=ctx->
audio_buffer
[3];
183
pkt->
data
[8]=ctx->
audio_buffer
[9];
184
pkt->
data
[9]=ctx->
audio_buffer
[4];
185
}
186
187
ctx->
bytes_left_in_chunk
-=
frame_size
;
188
189
if
(ctx->
bytes_left_in_chunk
< frame_size)
190
{
191
avio_skip
(pb, ctx->
bytes_left_in_chunk
);
192
ctx->
bytes_left_in_chunk
=
CHUNK_SIZE
;
193
}
194
195
pkt->
duration
=1;
196
197
return
ret;
198
}
199
200
AVInputFormat
ff_act_demuxer
= {
201
.
name
=
"act"
,
202
.long_name =
"ACT Voice file format"
,
203
.priv_data_size =
sizeof
(
ACTContext
),
204
.
read_probe
=
probe
,
205
.
read_header
=
read_header
,
206
.
read_packet
=
read_packet
,
207
};
Generated on Sat May 25 2013 04:01:16 for FFmpeg by
1.8.2