# HG changeset patch # User kostya # Date 1257408888 0 # Node ID e5805e11f596a77ddb2f88df16cc89cf2357fe71 # Parent d2cdd13aacffc4b8a90a56dd4d716faa2a162bcd If custom sampling rate is set in WavPack file, parse first block to find actual value. This fixes issue 1518. diff -r d2cdd13aacff -r e5805e11f596 wv.c --- a/wv.c Thu Nov 05 08:10:50 2009 +0000 +++ b/wv.c Thu Nov 05 08:14:48 2009 +0000 @@ -101,9 +101,30 @@ bpp = ((wc->flags & 3) + 1) << 3; chan = 1 + !(wc->flags & WV_MONO); rate = wv_rates[(wc->flags >> 23) & 0xF]; - if(rate == -1){ - av_log(ctx, AV_LOG_ERROR, "Unknown sampling rate\n"); - return -1; + if(rate == -1 && !wc->block_parsed){ + int64_t block_end = url_ftell(pb) + wc->blksize - 24; + if(url_is_streamed(pb)){ + av_log(ctx, AV_LOG_ERROR, "Cannot determine custom sampling rate\n"); + return -1; + } + while(url_ftell(pb) < block_end){ + int id, size; + id = get_byte(pb); + size = (id & 0x80) ? get_le24(pb) : get_byte(pb); + size <<= 1; + if(id&0x40) + size--; + if((id&0x3F) == 0x27){ + rate = get_le24(pb); + break; + }else{ + url_fskip(pb, size); + } + } + if(rate == -1){ + av_log(ctx, AV_LOG_ERROR, "Cannot determine custom sampling rate\n"); + return -1; + } } if(!wc->bpp) wc->bpp = bpp; if(!wc->chan) wc->chan = chan; @@ -117,7 +138,7 @@ av_log(ctx, AV_LOG_ERROR, "Channels differ, this block: %i, header block: %i\n", chan, wc->chan); return -1; } - if(wc->flags && rate != wc->rate){ + if(wc->flags && rate != -1 && rate != wc->rate){ av_log(ctx, AV_LOG_ERROR, "Sampling rate differ, this block: %i, header block: %i\n", rate, wc->rate); return -1; }