2 * ACT file format demuxer
3 * Copyright (c) 2007-2008 Vladimir Voroshilov
5 * This file is part of FFmpeg.
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.
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.
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
24 #include "libavcodec/get_bits.h"
26 #define CHUNK_SIZE 512
27 #define RIFF_TAG MKTAG('R','I','F','F')
28 #define WAVE_TAG MKTAG('W','A','V','E')
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
36 static int probe(AVProbeData
*p
)
40 if ((AV_RL32(&p
->buf
[0]) != RIFF_TAG
) ||
41 (AV_RL32(&p
->buf
[8]) != WAVE_TAG
) ||
42 (AV_RL32(&p
->buf
[16]) != 16))
45 //We can't be sure that this is ACT and not regular WAV
56 for(i
=264; i
<512; i
++)
60 return AVPROBE_SCORE_MAX
;
63 static int read_header(AVFormatContext
*s
)
65 ACTContext
* ctx
= s
->priv_data
;
66 AVIOContext
*pb
= s
->pb
;
72 st
= avformat_new_stream(s
, NULL
);
74 return AVERROR(ENOMEM
);
78 ff_get_wav_header(pb
, st
->codec
, size
);
81 8000Hz (Fine-rec) file format has 10 bytes long
82 packets with 10ms of sound data in them
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
;
89 st
->codec
->frame_size
=80;
90 st
->codec
->channels
=1;
91 avpriv_set_pts_info(st
, 64, 1, 100);
93 st
->codec
->codec_id
=AV_CODEC_ID_G729
;
95 avio_seek(pb
, 257, SEEK_SET
);
100 st
->duration
= av_rescale(1000*(min
*60+sec
)+msec
, st
->codec
->sample_rate
, 1000 * st
->codec
->frame_size
);
102 ctx
->bytes_left_in_chunk
=CHUNK_SIZE
;
104 avio_seek(pb
, 512, SEEK_SET
);
110 static int read_packet(AVFormatContext
*s
,
113 ACTContext
*ctx
= s
->priv_data
;
114 AVIOContext
*pb
= s
->pb
;
116 int frame_size
=s
->streams
[0]->codec
->sample_rate
==8000?10:22;
119 if(s
->streams
[0]->codec
->sample_rate
==8000)
120 ret
=av_new_packet(pkt
, 10);
122 ret
=av_new_packet(pkt
, 11);
127 if(s
->streams
[0]->codec
->sample_rate
==4400 && !ctx
->second_packet
)
129 ret
= avio_read(pb
, ctx
->audio_buffer
, frame_size
);
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];
148 ctx
->second_packet
=1;
150 else if(s
->streams
[0]->codec
->sample_rate
==4400 && ctx
->second_packet
)
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];
164 ctx
->second_packet
=0;
168 ret
= avio_read(pb
, ctx
->audio_buffer
, frame_size
);
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];
187 ctx
->bytes_left_in_chunk
-= frame_size
;
189 if(ctx
->bytes_left_in_chunk
< frame_size
)
191 avio_skip(pb
, ctx
->bytes_left_in_chunk
);
192 ctx
->bytes_left_in_chunk
=CHUNK_SIZE
;
200 AVInputFormat ff_act_demuxer
= {
202 .long_name
= "ACT Voice file format",
203 .priv_data_size
= sizeof(ACTContext
),
205 .read_header
= read_header
,
206 .read_packet
= read_packet
,