if (!memcmp(probe_packet->buf + 4, "00052200", 8))
return AVPROBE_SCORE_MAX;
- return AVPROBE_SCORE_MAX/2;
+ return AVPROBE_SCORE_EXTENSION;
}
static void add_metadata(AVFormatContext *s, uint32_t tag,
{ 0 },
};
-static int vqf_read_header(AVFormatContext *s, AVFormatParameters *ap)
+static int vqf_read_header(AVFormatContext *s)
{
VqfContext *c = s->priv_data;
AVStream *st = avformat_new_stream(s, NULL);
header_size = avio_rb32(s->pb);
- st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
- st->codec->codec_id = CODEC_ID_TWINVQ;
+ st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
+ st->codecpar->codec_id = AV_CODEC_ID_TWINVQ;
st->start_time = 0;
do {
switch(chunk_tag){
case MKTAG('C','O','M','M'):
avio_read(s->pb, comm_chunk, 12);
- st->codec->channels = AV_RB32(comm_chunk ) + 1;
+ st->codecpar->channels = AV_RB32(comm_chunk ) + 1;
read_bitrate = AV_RB32(comm_chunk + 4);
rate_flag = AV_RB32(comm_chunk + 8);
avio_skip(s->pb, len-12);
- st->codec->bit_rate = read_bitrate*1000;
+ st->codecpar->bit_rate = read_bitrate * 1000;
break;
case MKTAG('D','S','I','Z'): // size of compressed data
{
av_log(s, AV_LOG_ERROR, "COMM tag not found!\n");
return -1;
case 44:
- st->codec->sample_rate = 44100;
+ st->codecpar->sample_rate = 44100;
break;
case 22:
- st->codec->sample_rate = 22050;
+ st->codecpar->sample_rate = 22050;
break;
case 11:
- st->codec->sample_rate = 11025;
+ st->codecpar->sample_rate = 11025;
break;
default:
- st->codec->sample_rate = rate_flag*1000;
+ if (rate_flag < 8 || rate_flag > 44) {
+ av_log(s, AV_LOG_ERROR, "Invalid rate flag %d\n", rate_flag);
+ return AVERROR_INVALIDDATA;
+ }
+ st->codecpar->sample_rate = rate_flag*1000;
break;
}
- switch (((st->codec->sample_rate/1000) << 8) +
- read_bitrate/st->codec->channels) {
+ if (read_bitrate / st->codecpar->channels < 8 ||
+ read_bitrate / st->codecpar->channels > 48) {
+ av_log(s, AV_LOG_ERROR, "Invalid bitrate per channel %d\n",
+ read_bitrate / st->codecpar->channels);
+ return AVERROR_INVALIDDATA;
+ }
+
+ switch (((st->codecpar->sample_rate/1000) << 8) +
+ read_bitrate/st->codecpar->channels) {
case (11<<8) + 8 :
case (8 <<8) + 8 :
case (11<<8) + 10:
break;
default:
av_log(s, AV_LOG_ERROR, "Mode not suported: %d Hz, %d kb/s.\n",
- st->codec->sample_rate, st->codec->bit_rate);
+ st->codecpar->sample_rate, st->codecpar->bit_rate);
return -1;
}
- c->frame_bit_len = st->codec->bit_rate*size/st->codec->sample_rate;
- avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
+ c->frame_bit_len = st->codecpar->bit_rate*size/st->codecpar->sample_rate;
+ avpriv_set_pts_info(st, 64, size, st->codecpar->sample_rate);
/* put first 12 bytes of COMM chunk in extradata */
- if (!(st->codec->extradata = av_malloc(12 + FF_INPUT_BUFFER_PADDING_SIZE)))
+ if (!(st->codecpar->extradata = av_malloc(12 + AV_INPUT_BUFFER_PADDING_SIZE)))
return AVERROR(ENOMEM);
- st->codec->extradata_size = 12;
- memcpy(st->codec->extradata, comm_chunk, 12);
+ st->codecpar->extradata_size = 12;
+ memcpy(st->codecpar->extradata, comm_chunk, 12);
ff_metadata_conv_ctx(s, NULL, vqf_metadata_conv);
int ret;
int size = (c->frame_bit_len - c->remaining_bits + 7)>>3;
- pkt->pos = avio_tell(s->pb);
- pkt->stream_index = 0;
-
if (av_new_packet(pkt, size+2) < 0)
return AVERROR(EIO);
+ pkt->pos = avio_tell(s->pb);
+ pkt->stream_index = 0;
+ pkt->duration = 1;
+
pkt->data[0] = 8 - c->remaining_bits; // Number of bits to skip
pkt->data[1] = c->last_frame_bits;
ret = avio_read(s->pb, pkt->data+2, size);
if (ret<=0) {
- av_free_packet(pkt);
+ av_packet_unref(pkt);
return AVERROR(EIO);
}
int64_t pos;
st = s->streams[stream_index];
- pos = av_rescale_rnd(timestamp * st->codec->bit_rate,
+ pos = av_rescale_rnd(timestamp * st->codecpar->bit_rate,
st->time_base.num,
st->time_base.den * (int64_t)c->frame_bit_len,
(flags & AVSEEK_FLAG_BACKWARD) ?
pos *= c->frame_bit_len;
st->cur_dts = av_rescale(pos, st->time_base.den,
- st->codec->bit_rate * (int64_t)st->time_base.num);
+ st->codecpar->bit_rate * (int64_t)st->time_base.num);
- if ((ret = avio_seek(s->pb, ((pos-7) >> 3) + s->data_offset, SEEK_SET)) < 0)
+ if ((ret = avio_seek(s->pb, ((pos-7) >> 3) + s->internal->data_offset, SEEK_SET)) < 0)
return ret;
c->remaining_bits = -7 - ((pos-7)&7);