Mercurial > libavformat.hg
changeset 5350:e5805e11f596 libavformat
If custom sampling rate is set in WavPack file, parse first block to find
actual value.
This fixes issue 1518.
author | kostya |
---|---|
date | Thu, 05 Nov 2009 08:14:48 +0000 |
parents | d2cdd13aacff |
children | 49d4ac4b6516 |
files | wv.c |
diffstat | 1 files changed, 25 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- 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; }