On Tue, May 28, 2013 at 11:05:48AM +0200, Anton Khirnov wrote:
> It will be reused by other muxers and demuxers.
> ---
>  libavformat/Makefile |    2 +-
>  libavformat/wv.c     |   52 +++++++++++++++++++++++++++++
>  libavformat/wv.h     |   56 ++++++++++++++++++++++++++++++++
>  libavformat/wvdec.c  |   88 
> +++++++++++++++++++++-----------------------------
>  4 files changed, 145 insertions(+), 53 deletions(-)
>  create mode 100644 libavformat/wv.c
>  create mode 100644 libavformat/wv.h
> 
> diff --git a/libavformat/Makefile b/libavformat/Makefile
> index 69c40c0..2883612 100644
> --- a/libavformat/Makefile
> +++ b/libavformat/Makefile
> @@ -334,7 +334,7 @@ OBJS-$(CONFIG_WSAUD_DEMUXER)             += westwood_aud.o
>  OBJS-$(CONFIG_WSVQA_DEMUXER)             += westwood_vqa.o
>  OBJS-$(CONFIG_WTV_DEMUXER)               += wtv.o asfdec.o asf.o asfcrypt.o \
>                                              avlanguage.o mpegts.o isom.o
> -OBJS-$(CONFIG_WV_DEMUXER)                += wvdec.o apetag.o img2.o
> +OBJS-$(CONFIG_WV_DEMUXER)                += wvdec.o wv.o apetag.o img2.o
>  OBJS-$(CONFIG_XA_DEMUXER)                += xa.o
>  OBJS-$(CONFIG_XMV_DEMUXER)               += xmv.o
>  OBJS-$(CONFIG_XWMA_DEMUXER)              += xwma.o
> diff --git a/libavformat/wv.c b/libavformat/wv.c
> new file mode 100644
> index 0000000..724256b
> --- /dev/null
> +++ b/libavformat/wv.c
> @@ -0,0 +1,52 @@
> +/*
> + * WavPack shared functions
> + *
> + * This file is part of Libav.
> + *
> + * Libav is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * Libav is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with Libav; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 
> USA
> + */
> +
> +#include <stdint.h>
> +#include <string.h>
> +
> +#include "libavutil/common.h"
> +#include "libavutil/intreadwrite.h"
> +
> +#include "wv.h"
> +
> +int ff_wv_parse_header(WvHeader *wv, const uint8_t *data)
> +{
> +    memset(wv, 0, sizeof(*wv));
> +
> +    if (AV_RL32(data) != MKTAG('w', 'v', 'p', 'k'))
> +        return AVERROR_INVALIDDATA;
> +
> +    wv->blocksize     = AV_RL32(data + 4);
> +    if (wv->blocksize < 24 || wv->blocksize > WV_BLOCK_LIMIT)
> +        return AVERROR_INVALIDDATA;
> +    wv->blocksize -= 24;
> +
> +    wv->version       = AV_RL16(data + 8);
> +    wv->total_samples = AV_RL32(data + 12);
> +    wv->block_idx     = AV_RL32(data + 16);
> +    wv->samples       = AV_RL32(data + 20);
> +    wv->flags         = AV_RL32(data + 24);
> +    wv->crc           = AV_RL32(data + 28);
> +
> +    wv->initial = !!(wv->flags & WV_FLAG_INITIAL_BLOCK);
> +    wv->final   = !!(wv->flags & WV_FLAG_FINAL_BLOCK);
> +
> +    return 0;
> +}
> diff --git a/libavformat/wv.h b/libavformat/wv.h
> new file mode 100644
> index 0000000..f5a56b9
> --- /dev/null
> +++ b/libavformat/wv.h
> @@ -0,0 +1,56 @@
> +/*
> + * WavPack shared functions
> + *
> + * This file is part of Libav.
> + *
> + * Libav is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * Libav is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with Libav; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 
> USA
> + */
> +
> +#ifndef AVFORMAT_WV_H
> +#define AVFORMAT_WV_H
> +
> +#include <stdint.h>
> +
> +#define WV_HEADER_SIZE 32
> +
> +#define WV_FLAG_INITIAL_BLOCK (1 << 11)
> +#define WV_FLAG_FINAL_BLOCK   (1 << 12)
> +
> +// specs say that maximum block size is 1Mb
> +#define WV_BLOCK_LIMIT 1047576

sigh, noone has spotted a typo so far

> +
> +typedef struct WvHeader {
> +    uint32_t blocksize;     //< size of the block data (excluding the header)
> +    uint16_t version;       //< bitstream version
> +    uint32_t total_samples; //< total number of samples in the stream
> +    uint32_t block_idx;     //< index of the first sample in this block
> +    uint32_t samples;       //< number of samples in this block
> +    uint32_t flags;
> +    uint32_t crc;
> +
> +    int initial, final;
> +} WvHeader;
> +
> +/**
> + * Parse a WavPack block header.
> + *
> + * @param wv   this struct will be filled with parse header information
> + * @param data header data, must be WV_HEADER_SIZE bytes long
> + *
> + * @return 0 on success, a negative AVERROR code on failure
> + */
> +int ff_wv_parse_header(WvHeader *wv, const uint8_t *data);
> +
> +#endif /* AVFORMAT_WV_H */

LGTM
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to