WV_HBAL = 0x0400,
WV_MCINIT = 0x0800,
WV_MCEND = 0x1000,
+ WV_DSD = 0x80000000,
};
static const int wv_rates[16] = {
int64_t apetag_start;
} WVContext;
-static int wv_probe(AVProbeData *p)
+static int wv_probe(const AVProbeData *p)
{
/* check file header */
if (p->buf_size <= 32)
return ret;
}
+ if (wc->header.flags & WV_DSD) {
+ avpriv_report_missing_feature(ctx, "WV DSD");
+ return AVERROR_PATCHWELCOME;
+ }
+
if (wc->header.version < 0x402 || wc->header.version > 0x410) {
avpriv_report_missing_feature(ctx, "WV version 0x%03X",
wc->header.version);
case 3:
chmask = avio_rl32(pb);
break;
- case 5:
+ case 4:
avio_skip(pb, 1);
chan |= (avio_r8(pb) & 0xF) << 8;
+ chan += 1;
chmask = avio_rl24(pb);
break;
+ case 5:
+ avio_skip(pb, 1);
+ chan |= (avio_r8(pb) & 0xF) << 8;
+ chan += 1;
+ chmask = avio_rl32(pb);
+ break;
default:
av_log(ctx, AV_LOG_ERROR,
"Invalid channel info size %d\n", size);
}
pos = wc->pos;
- if (av_new_packet(pkt, wc->header.blocksize + WV_HEADER_SIZE) < 0)
- return AVERROR(ENOMEM);
+ if ((ret = av_new_packet(pkt, wc->header.blocksize + WV_HEADER_SIZE)) < 0)
+ return ret;
memcpy(pkt->data, wc->block_header, WV_HEADER_SIZE);
ret = avio_read(s->pb, pkt->data + WV_HEADER_SIZE, wc->header.blocksize);
if (ret != wc->header.blocksize) {
- av_packet_unref(pkt);
return AVERROR(EIO);
}
while (!(wc->header.flags & WV_FLAG_FINAL_BLOCK)) {
if ((ret = wv_read_block_header(s, s->pb)) < 0) {
- av_packet_unref(pkt);
return ret;
}
off = pkt->size;
if ((ret = av_grow_packet(pkt, WV_HEADER_SIZE + wc->header.blocksize)) < 0) {
- av_packet_unref(pkt);
return ret;
}
memcpy(pkt->data + off, wc->block_header, WV_HEADER_SIZE);
ret = avio_read(s->pb, pkt->data + off + WV_HEADER_SIZE, wc->header.blocksize);
if (ret != wc->header.blocksize) {
- av_packet_unref(pkt);
return (ret < 0) ? ret : AVERROR_EOF;
}
}