int type;
int sequence;
int length;
+ int duration;
uint8_t text[1024 + 1];
} VivoContext;
-static int vivo_probe(AVProbeData *p)
+static int vivo_probe(const AVProbeData *p)
{
const unsigned char *buf = p->buf;
unsigned c, length = 0;
if (c & 0x80 || length > 1024 || length < 21)
return 0;
- if (memcmp(buf, "\r\nVersion:Vivo/", 15))
+ buf += 2;
+ if (memcmp(buf, "Version:Vivo/", 13))
return 0;
- buf += 15;
+ buf += 13;
if (*buf < '0' || *buf > '2')
return 0;
value = strchr(key, ':');
if (!value) {
av_log(s, AV_LOG_WARNING, "missing colon in key:value pair '%s'\n",
- value);
+ key);
continue;
}
ast->codecpar->bits_per_coded_sample = 8;
ast->codecpar->block_align = 24;
ast->codecpar->bit_rate = 6400;
+ } else {
+ ast->codecpar->codec_id = AV_CODEC_ID_SIREN;
+ ast->codecpar->bits_per_coded_sample = 16;
+ ast->codecpar->block_align = 40;
+ ast->codecpar->bit_rate = 6400;
+ vivo->duration = 320;
}
ast->start_time = 0;
VivoContext *vivo = s->priv_data;
AVIOContext *pb = s->pb;
unsigned old_sequence = vivo->sequence, old_type = vivo->type;
- int stream_index, ret = 0;
+ int stream_index, duration, ret = 0;
restart:
case 1:
case 2: // video
stream_index = 0;
+ duration = 1;
break;
case 3:
case 4: // audio
stream_index = 1;
+ duration = vivo->duration;
break;
default:
av_log(s, AV_LOG_ERROR, "unknown packet type %d\n", vivo->type);
}
if ((ret = av_get_packet(pb, pkt, vivo->length)) < 0)
- goto fail;
+ return ret;
// get next packet header
if ((ret = vivo_get_packet_header(s)) < 0)
- goto fail;
+ return ret;
while (vivo->sequence == old_sequence &&
(((vivo->type - 1) >> 1) == ((old_type - 1) >> 1))) {
if (avio_feof(pb)) {
- ret = AVERROR_EOF;
- break;
+ return AVERROR_EOF;
}
if ((ret = av_append_packet(pb, pkt, vivo->length)) < 0)
- break;
+ return ret;
// get next packet header
if ((ret = vivo_get_packet_header(s)) < 0)
- break;
+ return ret;
}
pkt->stream_index = stream_index;
+ pkt->duration = duration;
-fail:
- if (ret < 0)
- av_packet_unref(pkt);
return ret;
}