From: Hendrik Leppkes Date: Mon, 7 Sep 2015 10:53:00 +0000 (+0200) Subject: Merge commit '0c7707610f46a28b65eff935500c78c9781f8f4f' X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=1964aeae42fd54aecbaa15836bec3ad15e17b237;p=ffmpeg Merge commit '0c7707610f46a28b65eff935500c78c9781f8f4f' * commit '0c7707610f46a28b65eff935500c78c9781f8f4f': lavc: Add a lzf decompressor Merged-by: Hendrik Leppkes --- 1964aeae42fd54aecbaa15836bec3ad15e17b237 diff --cc configure index 32f47523390,9e83285f2cb..a874b4fc73b --- a/configure +++ b/configure @@@ -1925,9 -1612,8 +1925,10 @@@ CONFIG_EXTRA= jpegtables libx262 lgplv3 + llauddsp + llviddsp lpc + lzf me_cmp mpeg_er mpegaudio diff --cc libavcodec/Makefile index 20a20025fe3,534fe4dfb0a..0830bb96275 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@@ -75,11 -66,10 +75,12 @@@ OBJS-$(CONFIG_INTRAX8) OBJS-$(CONFIG_IVIDSP) += ivi_dsp.o OBJS-$(CONFIG_JPEGTABLES) += jpegtables.o OBJS-$(CONFIG_LIBXVID) += libxvid_rc.o +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 +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 OBJS-$(CONFIG_MPEGAUDIO) += mpegaudio.o mpegaudiodata.o \ diff --cc libavcodec/lzf.c index 00000000000,35b932bd087..409a7ffdd39 mode 000000,100644..100644 --- a/libavcodec/lzf.c +++ b/libavcodec/lzf.c @@@ -1,0 -1,90 +1,90 @@@ + /* + * lzf decompression algorithm + * Copyright (c) 2015 Luca Barbato + * - * This file is part of Libav. ++ * This file is part of FFmpeg. + * - * Libav is free software; you can redistribute it and/or ++ * 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. + * - * Libav is distributed in the hope that it will be useful, ++ * 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 Libav; if not, write to the Free Software ++ * 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 --cc libavcodec/lzf.h index 00000000000,4951f2511f2..0ad73d9f796 mode 000000,100644..100644 --- a/libavcodec/lzf.h +++ b/libavcodec/lzf.h @@@ -1,0 -1,29 +1,29 @@@ + /* + * lzf decompression algorithm + * Copyright (c) 2015 Luca Barbato + * - * This file is part of Libav. ++ * This file is part of FFmpeg. + * - * Libav is free software; you can redistribute it and/or ++ * 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. + * - * Libav is distributed in the hope that it will be useful, ++ * 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 Libav; if not, write to the Free Software ++ * 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 */