00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "avformat.h"
00022 #include "riff.h"
00023 #include "internal.h"
00024 #include "libavcodec/get_bits.h"
00025
00026 #define CHUNK_SIZE 512
00027 #define RIFF_TAG MKTAG('R','I','F','F')
00028 #define WAVE_TAG MKTAG('W','A','V','E')
00029
00030 typedef struct{
00031 int bytes_left_in_chunk;
00032 uint8_t audio_buffer[22];
00033 char second_packet;
00034 } ACTContext;
00035
00036 static int probe(AVProbeData *p)
00037 {
00038 int i;
00039
00040 if ((AV_RL32(&p->buf[0]) != RIFF_TAG) ||
00041 (AV_RL32(&p->buf[8]) != WAVE_TAG) ||
00042 (AV_RL32(&p->buf[16]) != 16))
00043 return 0;
00044
00045
00046 if (p->buf_size<512)
00047 return 0;
00048
00049 for(i=44; i<256; i++)
00050 if(p->buf[i])
00051 return 0;
00052
00053 if(p->buf[256]!=0x84)
00054 return 0;
00055
00056 for(i=264; i<512; i++)
00057 if(p->buf[i])
00058 return 0;
00059
00060 return AVPROBE_SCORE_MAX;
00061 }
00062
00063 static int read_header(AVFormatContext *s)
00064 {
00065 ACTContext* ctx = s->priv_data;
00066 AVIOContext *pb = s->pb;
00067 int size;
00068 AVStream* st;
00069
00070 int min,sec,msec;
00071
00072 st = avformat_new_stream(s, NULL);
00073 if (!st)
00074 return AVERROR(ENOMEM);
00075
00076 avio_skip(pb, 16);
00077 size=avio_rl32(pb);
00078 ff_get_wav_header(pb, st->codec, size);
00079
00080
00081
00082
00083
00084 if (st->codec->sample_rate != 8000) {
00085 av_log(s, AV_LOG_ERROR, "Sample rate %d is not supported.\n", st->codec->sample_rate);
00086 return AVERROR_INVALIDDATA;
00087 }
00088
00089 st->codec->frame_size=80;
00090 st->codec->channels=1;
00091 avpriv_set_pts_info(st, 64, 1, 100);
00092
00093 st->codec->codec_id=CODEC_ID_G729;
00094
00095 avio_seek(pb, 257, SEEK_SET);
00096 msec=avio_rl16(pb);
00097 sec=avio_r8(pb);
00098 min=avio_rl32(pb);
00099
00100 st->duration = av_rescale(1000*(min*60+sec)+msec, st->codec->sample_rate, 1000 * st->codec->frame_size);
00101
00102 ctx->bytes_left_in_chunk=CHUNK_SIZE;
00103
00104 avio_seek(pb, 512, SEEK_SET);
00105
00106 return 0;
00107 }
00108
00109
00110 static int read_packet(AVFormatContext *s,
00111 AVPacket *pkt)
00112 {
00113 ACTContext *ctx = s->priv_data;
00114 AVIOContext *pb = s->pb;
00115 int ret;
00116 int frame_size=s->streams[0]->codec->sample_rate==8000?10:22;
00117
00118
00119 if(s->streams[0]->codec->sample_rate==8000)
00120 ret=av_new_packet(pkt, 10);
00121 else
00122 ret=av_new_packet(pkt, 11);
00123
00124 if(ret)
00125 return ret;
00126
00127 if(s->streams[0]->codec->sample_rate==4400 && !ctx->second_packet)
00128 {
00129 ret = avio_read(pb, ctx->audio_buffer, frame_size);
00130
00131 if(ret<0)
00132 return ret;
00133 if(ret!=frame_size)
00134 return AVERROR(EIO);
00135
00136 pkt->data[0]=ctx->audio_buffer[11];
00137 pkt->data[1]=ctx->audio_buffer[0];
00138 pkt->data[2]=ctx->audio_buffer[12];
00139 pkt->data[3]=ctx->audio_buffer[1];
00140 pkt->data[4]=ctx->audio_buffer[13];
00141 pkt->data[5]=ctx->audio_buffer[2];
00142 pkt->data[6]=ctx->audio_buffer[14];
00143 pkt->data[7]=ctx->audio_buffer[3];
00144 pkt->data[8]=ctx->audio_buffer[15];
00145 pkt->data[9]=ctx->audio_buffer[4];
00146 pkt->data[10]=ctx->audio_buffer[16];
00147
00148 ctx->second_packet=1;
00149 }
00150 else if(s->streams[0]->codec->sample_rate==4400 && ctx->second_packet)
00151 {
00152 pkt->data[0]=ctx->audio_buffer[5];
00153 pkt->data[1]=ctx->audio_buffer[17];
00154 pkt->data[2]=ctx->audio_buffer[6];
00155 pkt->data[3]=ctx->audio_buffer[18];
00156 pkt->data[4]=ctx->audio_buffer[7];
00157 pkt->data[5]=ctx->audio_buffer[19];
00158 pkt->data[6]=ctx->audio_buffer[8];
00159 pkt->data[7]=ctx->audio_buffer[20];
00160 pkt->data[8]=ctx->audio_buffer[9];
00161 pkt->data[9]=ctx->audio_buffer[21];
00162 pkt->data[10]=ctx->audio_buffer[10];
00163
00164 ctx->second_packet=0;
00165 }
00166 else
00167 {
00168 ret = avio_read(pb, ctx->audio_buffer, frame_size);
00169
00170 if(ret<0)
00171 return ret;
00172 if(ret!=frame_size)
00173 return AVERROR(EIO);
00174
00175 pkt->data[0]=ctx->audio_buffer[5];
00176 pkt->data[1]=ctx->audio_buffer[0];
00177 pkt->data[2]=ctx->audio_buffer[6];
00178 pkt->data[3]=ctx->audio_buffer[1];
00179 pkt->data[4]=ctx->audio_buffer[7];
00180 pkt->data[5]=ctx->audio_buffer[2];
00181 pkt->data[6]=ctx->audio_buffer[8];
00182 pkt->data[7]=ctx->audio_buffer[3];
00183 pkt->data[8]=ctx->audio_buffer[9];
00184 pkt->data[9]=ctx->audio_buffer[4];
00185 }
00186
00187 ctx->bytes_left_in_chunk -= frame_size;
00188
00189 if(ctx->bytes_left_in_chunk < frame_size)
00190 {
00191 avio_skip(pb, ctx->bytes_left_in_chunk);
00192 ctx->bytes_left_in_chunk=CHUNK_SIZE;
00193 }
00194
00195 pkt->duration=1;
00196
00197 return ret;
00198 }
00199
00200 AVInputFormat ff_act_demuxer = {
00201 .name = "act",
00202 .long_name = "ACT Voice file format",
00203 .priv_data_size = sizeof(ACTContext),
00204 .read_probe = probe,
00205 .read_header = read_header,
00206 .read_packet = read_packet,
00207 };