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

Reply via email to