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 30typedef 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 36static 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 can't 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 63static 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 110static 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 200AVInputFormat 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}; 208