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