On 2/4/12, Justin Ruggles <[email protected]> wrote: > Calculates based on total file size and wavetaillength from the header. > Falls back to multiplying finalframeblocks by 8 instead of 4 so that it will > at least be overestimating for 24-bit. Currently it can underestimate the > final packet size, leading to decoding errors. > --- > libavformat/ape.c | 15 ++++++++++++--- > 1 files changed, 12 insertions(+), 3 deletions(-) > > diff --git a/libavformat/ape.c b/libavformat/ape.c > index c650a54..972b7a3 100644 > --- a/libavformat/ape.c > +++ b/libavformat/ape.c > @@ -159,8 +159,8 @@ static int ape_read_header(AVFormatContext * s) > AVStream *st; > uint32_t tag; > int i; > - int total_blocks; > - int64_t pts; > + int total_blocks, final_size; > + int64_t pts, file_size; > > /* Skip any leading junk such as id3v2 tags */ > ape->junklength = avio_tell(pb); > @@ -289,8 +289,17 @@ static int ape_read_header(AVFormatContext * s) > ape->frames[i - 1].size = ape->frames[i].pos - ape->frames[i - > 1].pos; > ape->frames[i].skip = (ape->frames[i].pos - ape->frames[0].pos) > & 3; > } > - ape->frames[ape->totalframes - 1].size = ape->finalframeblocks * 4; > ape->frames[ape->totalframes - 1].nblocks = ape->finalframeblocks; > + /* calculate final packet size from total file size, if available */ > + file_size = avio_size(pb); > + if (file_size > 0) { > + final_size = file_size - ape->frames[ape->totalframes - 1].pos - > + ape->wavtaillength; > + final_size -= final_size & 3; > + } > + if (file_size <= 0 || final_size <= 0) > + final_size = ape->finalframeblocks * 8; > + ape->frames[ape->totalframes - 1].size = final_size; > > for (i = 0; i < ape->totalframes; i++) { > if(ape->frames[i].skip){
OK if decoded output finally match with reference implementation with broken/incomplete samples. _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
