diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2015-09-07 12:53:00 +0200 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2015-09-07 12:53:00 +0200 |
commit | 1964aeae42fd54aecbaa15836bec3ad15e17b237 (patch) | |
tree | dc11395c9b28ad0ebbcc0df0b1464ae64e97bdf8 | |
parent | d4f63be92b4a8252c37f9453f4e406b94092e122 (diff) | |
parent | 0c7707610f46a28b65eff935500c78c9781f8f4f (diff) | |
download | ffmpeg-1964aeae42fd54aecbaa15836bec3ad15e17b237.tar.gz |
Merge commit '0c7707610f46a28b65eff935500c78c9781f8f4f'
* commit '0c7707610f46a28b65eff935500c78c9781f8f4f':
lavc: Add a lzf decompressor
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
-rwxr-xr-x | configure | 1 | ||||
-rw-r--r-- | libavcodec/Makefile | 1 | ||||
-rw-r--r-- | libavcodec/lzf.c | 90 | ||||
-rw-r--r-- | libavcodec/lzf.h | 29 |
4 files changed, 121 insertions, 0 deletions
@@ -1928,6 +1928,7 @@ CONFIG_EXTRA=" llauddsp llviddsp lpc + lzf me_cmp mpeg_er mpegaudio diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 20a20025fe..0830bb9627 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -79,6 +79,7 @@ OBJS-$(CONFIG_LLAUDDSP) += lossless_audiodsp.o OBJS-$(CONFIG_LLVIDDSP) += lossless_videodsp.o OBJS-$(CONFIG_LPC) += lpc.o OBJS-$(CONFIG_LSP) += lsp.o +OBJS-$(CONFIG_LZF) += lzf.o OBJS-$(CONFIG_MDCT) += mdct_fixed.o mdct_float.o mdct_fixed_32.o OBJS-$(CONFIG_ME_CMP) += me_cmp.o OBJS-$(CONFIG_MPEG_ER) += mpeg_er.o diff --git a/libavcodec/lzf.c b/libavcodec/lzf.c new file mode 100644 index 0000000000..409a7ffdd3 --- /dev/null +++ b/libavcodec/lzf.c @@ -0,0 +1,90 @@ +/* + * lzf decompression algorithm + * Copyright (c) 2015 Luca Barbato + * + * This file is part of FFmpeg. + * + * FFmpeg 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. + * + * FFmpeg 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 FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * lzf decompression + * + * LZF is a fast compression/decompression algorithm that takes very little + * code space and working memory, ideal for real-time and block compression. + * + * https://en.wikibooks.org/wiki/Data_Compression/Dictionary_compression#LZF + */ + +#include "libavutil/mem.h" + +#include "bytestream.h" +#include "lzf.h" + +#define LZF_LITERAL_MAX (1 << 5) +#define LZF_LONG_BACKREF 7 + 2 + +int ff_lzf_uncompress(GetByteContext *gb, uint8_t **buf, int64_t *size) +{ + int ret = 0; + uint8_t *p = *buf; + int64_t len = 0; + + while (bytestream2_get_bytes_left(gb) > 2) { + uint8_t s = bytestream2_get_byte(gb); + + if (s < LZF_LITERAL_MAX) { + s++; + if (s > *size - len) { + *size += *size /2; + ret = av_reallocp(buf, *size); + if (ret < 0) + return ret; + } + + bytestream2_get_buffer(gb, p, s); + p += s; + len += s; + } else { + int l = 2 + (s >> 5); + int off = ((s & 0x1f) << 8) + 1; + + if (l == LZF_LONG_BACKREF) + l += bytestream2_get_byte(gb); + + off += bytestream2_get_byte(gb); + + if (off > len) + return AVERROR_INVALIDDATA; + + if (l > *size - len) { + *size += *size / 2; + ret = av_reallocp(buf, *size); + if (ret < 0) + return ret; + } + + av_memcpy_backptr(p, off, l); + + p += l; + len += l; + } + } + + *size = len; + + return 0; +} diff --git a/libavcodec/lzf.h b/libavcodec/lzf.h new file mode 100644 index 0000000000..0ad73d9f79 --- /dev/null +++ b/libavcodec/lzf.h @@ -0,0 +1,29 @@ +/* + * lzf decompression algorithm + * Copyright (c) 2015 Luca Barbato + * + * This file is part of FFmpeg. + * + * FFmpeg 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. + * + * FFmpeg 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 FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_LZF_H +#define AVCODEC_LZF_H + +#include "bytestream.h" + +int ff_lzf_uncompress(GetByteContext *gb, uint8_t **buf, int64_t *size); + +#endif /* AVCODEC_LZF_H */ |